Commit Graph
59 Commits
Author SHA1 Message Date
yinjun.chen1 ac1e36e85a fix(theme): 覆盖 Element Plus Message 样式,双主题下均可读
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- .el-message 背景/边框/阴影使用设计系统变量
- .el-message__content 文字颜色使用 --ink 确保对比度
- .el-message__icon 使用品牌橙色保持辨识度
2026-09-21 22:57:21 +08:00
yinjun.chen1 2c9f3712df fix(sync-btn): 拉取中按钮去掉绿色背景,仅沙漏图标旋转
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
2026-09-21 22:50:11 +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 b0ac90ca9e fix(logo): fetch 预检 + 全局缓存根除 favicon 加载控制台噪音
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- 用 fetch(no-cors) 代替直接 img.src,网络层失败(DNS/连接/超时)不再涌入控制台报错
- 全局跨组件 URL 探测缓存 + 24h 死链 TTL,列表滚动不重复探测
- 过滤 *.github.com 无效子域名(如 epeli.github.com),从源头减少无效请求
- 添加 referrerpolicy=no-referrer,减少跨域策略噪音
2026-09-21 22:19:55 +08:00
yinjun.chen1 a688adeffa chore: gitignore 忽略 Docker 镜像包,解除 82MB 大文件跟踪
verdaccio-cache-manager-amd64.tar 为本地构建产物,体积大且无入库价值;加入 .gitignore 并解除跟踪,避免每次构建后产生合并噪音。
2026-09-21 20:08:24 +08:00
yinjun.chen1 60fa389def PkgLogo favicon 懒加载:IntersectionObserver 进入视口才发请求,大列表不再一次性并发数百个图标
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
2026-09-21 16:39:52 +08:00
yinjun.chen1 7f85c6438a 包列表虚拟滚动:仅渲染可视窗口行+占位行,桌面端容器限高内部滚动,超大列表不再全量渲染 DOM 2026-09-21 16:39:20 +08:00
yinjun.chen1 f4ee32b3b2 固化默认登录凭据为 admin/666666(保留 env 覆盖) 2026-09-21 16:39:20 +08:00
yinjun.chen1 16ed61f36d no message
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
2026-09-21 16:09:27 +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 6c6a319d70 feat: 调整导航菜单命名并优化忽略记录图标
CI / Backend tests (push) Canceled after 0s
CI / Frontend build (push) Canceled after 0s
- 概览改为缓存概览
- 检索改为我的缓存
- 已忽略的包改为忽略记录,图标由禁止标识换为记录清单
2026-09-21 10:12:44 +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 33e6ae8acf feat(frontend): 前端健壮性加固
- authFetch 增加 15s 超时与网络错误统一提示,防止请求永久挂起
- 新增 utils/storage 安全封装:隐私模式/禁用 storage/脏数据不再导致整页崩溃
- 新增 utils/semver 与后端一致的前端完整 semver 比较器
- CleanDialog/mock clean 排序统一为完整 semver 语义(与后端删除顺序一致)
- CleanDialog/PackageDrawer 按需加载改请求序号防竞态:快速切换包时旧响应不再覆盖新包
- 删除单版本(SearchView/OverviewView)增加 ElMessageBox 二次确认
- 数据刷新错误统一兜底提示,不再产生未处理 rejection
2026-09-21 10:03:50 +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
陈银军 cfc587e54a fix(scan): 移除扫描卡片顶部 inset 高光
用户反馈卡片顶部仍有亮线:border:none 已去边框,但 box-shadow 的
inset 0 1px 0 顶部内高光仍形成一条亮边,暗色(.18)/亮色(.85)两处一并移除,
仅保留外部投影保持悬浮感。
2026-09-21 00:45:11 +08:00
陈银军 b4e9747348 perf(scan): 后台扫描改为 fs.promises + 并发池并行 IO
scanStorageAsync 重写:异步递归列目录 + 16 路并发池并行
扫描包目录,目录内文件 stat 并行,结果按下标回填保持顺序。
数千包/慢磁盘(NAS)场景吞吐显著优于旧的单线程同步 IO。
2026-09-21 00:28:18 +08:00
陈银军 0faaf2d8dc fix(overview): 今日更新包数卡片跳转检索页时只显示今日更新
概览卡片点击改为 /search?updatedToday=1,检索页按
北京时间 today 过滤 lastUpdated,工具栏显示「仅今日更新」
标签并支持一键清除。
2026-09-21 00:23:02 +08:00
陈银军 829e1a5d8e feat(search): 排序菜单新增「最近更新 ↓ / ↑」按日期排序
按 lastUpdated(YYYY-MM-DD)字符串比较实现升降序,
无日期的异常包固定排在最后。
2026-09-21 00:19:15 +08:00
陈银军 73e59bc021 fix(ui): 去掉扫描 loading 卡片的外边框,仅保留毛玻璃高光
扫描中遮罩的玻璃卡片移除 1px 描边(暗色/亮色主题),
保留顶部内高光与投影,弱化「卡片感」,视觉更贴合磨砂背景。
2026-09-21 00:13:46 +08:00
陈银军 5861b25847 feat(deploy): 数据目录默认 bind mount 到 NAS 宿主机
默认数据目录改为 /volume2/docker/verdaccio-manager/data,开箱即在
NAS 文件管理器里可见、可备份、可修改 manager.db,不再用命名卷。
仍保留 VCM_DATA_DIR 环境变量覆盖路径。
2026-09-20 00:05:49 +08:00
陈银军 70b9ec4a60 feat(deploy): 支持自定义持久化数据目录 VCM_DATA_DIR
默认仍使用 vcm-data 命名卷(不破坏现有部署);在 .env 设置
VCM_DATA_DIR=宿主机绝对路径即切换为 bind mount,便于直接在
NAS 文件系统里查看/备份 manager.db。后端 DATA_DIR 不变。
2026-09-20 00:01:08 +08:00
陈银军 603e51f73b fix(app): 登录成功后自动加载数据,无需手动重新扫描
App.vue 的 onMounted 只在根组件首次挂载时执行一次:首次打开落在
登录页时跳过数据加载,登录成功跳转后也不会重跑,导致初次部署打开
面板为空,必须手工点「重新扫描」才有数据。新增 route.path 监听:
从 /login 跳转到真实页面时触发 refreshAll(后端会懒触发首扫并自动
轮询进度)。已用 puppeteer 端到端验证:登录后数据自动出现。
2026-09-19 23:51:19 +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
陈银军 735eaa7bf4 fix(mobile): 修复底部 Tabbar 被软键盘顶到屏幕中部
iOS Safari 在 input 聚焦弹出软键盘时会把 fixed 底部导航重定位到视口中部。
监听 focusin/focusout:输入框聚焦时 Tabbar 平滑滑出视口(pointer-events 关闭),
失焦恢复;同时补充 env(safe-area-inset-bottom) 适配 iPhone 底部安全区。
2026-09-19 22:27:38 +08:00
陈银军 6e220a04a1 feat(search): 检索列表新增「描述」列
包名后展示 description(超出 230px 省略号,悬停 title 显示全文),
无描述显示 —。移动端表格 min-width 调整为 880px。
2026-09-19 22:23:36 +08:00
陈银军 c379454ca6 refactor(topbar): 扁平化设置操作路径
头像下拉菜单去掉「⚙️ 设置」中间层,设置抽屉里的可操作项直接平铺
与「退出登录」同级:🌙/☀️ 主题切换(即时生效,菜单保持打开便于对比)、
⚙️ 预警设置(直达 /thresholds)、📦 版本信息 v1.0.0(只读分隔行)。
移动端 ☰ 设置抽屉保持不变。
2026-09-19 22:19:15 +08:00
陈银军 dd05764806 feat(search): 筛选/排序改为图标下拉 + 结果数左对齐 + 最近搜索历史
1) 快捷筛选与排序由横向标签改为 🎚️/↕️ 图标按钮(表格右上角靠右),
点击弹出下拉菜单,选中项高亮带 ✓;2) 「共找到 N 个包」移入表格工具栏
最左侧,与表格左对齐;3) 搜索框下方展示最近 5 条搜索历史
(localStorage 持久化),回车/点搜索按钮记录,点历史 chip 直接检索,
可一键清除。点击外部自动关闭下拉。
2026-09-19 22:11:55 +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
陈银军 1793888900 feat(search): 检索页包列表加包 logo
复用 PkgLogo 组件(GitHub 组织头像 / 站点 favicon / 首字母降级),
包名单元格改为 logo + 包名横向排列。
2026-09-19 22:00:15 +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
陈银军 d5074d0ff4 fix(deploy): storage 读写挂载 + root 运行以修复清理版本 EROFS
清理版本需删除 .tgz 并原子回写 package.json 元数据,原 :ro 只读挂载导致
EROFS;且 verdaccio 卷属主为 uid 10001,容器默认 uid 10000 即使读写也会
EACCES,故以 root(user 0:0)运行容器。
2026-09-19 21:52:08 +08:00
陈银军 c44dd8a195 fix: GitHub 系包 logo 改用组织头像,替代全站相同的章鱼猫 favicon
- 实测 vuejs.org/favicon.ico 返回 404(vue 回退字母,本就不是章鱼猫)
- 章鱼猫仅出现在 homepage 指向 github.com 仓库的包(github 全站 favicon 唯一)
- 改进:github.com/{owner}/{repo} 主页 → 加载 github.com/{owner}.png 组织/用户头像
  (vuejs 组织头像即 Vue logo、antvis 即 antv 图标),失败仍回退首字母
2026-09-19 21:45:52 +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
陈银军 c9bc6adf85 fix: 确认清理对话框永远提示无需清理
根因: 列表接口瘦身后不再返回 versionsDetail,CleanDialog 的「将删除」计算依赖 versionsDetail 为空 → 预览恒为 0
修复: 打开对话框时按需调用详情接口加载版本明细,加载期间显示「⏳ 正在加载版本信息…」
2026-09-19 21:24:47 +08:00
陈银军 922d4b3a12 fix: 扫描遮罩毛玻璃模糊不生效
- 根因1: backdrop-filter 加在进度卡片上,卡片背后是深色遮罩层,模糊作用在被压暗内容上不可见 → 移到遮罩层本身
- 根因2: 标准 backdrop-filter 与 -webkit- 前缀双写时被 Vite8 CSS 压缩链去重,只保留前缀属性,标准属性丢失 → 只写标准属性(压缩器自动补前缀)
- 验证: puppeteer-core 实测 computed backdrop-filter = blur(14px) saturate(1.3),背景内容完全模糊
2026-09-19 21:22:07 +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
陈银军 72722ab6bf build: Dockerfile 改单阶段(本地 dist + npm 装依赖),锁定 linux/amd64 适配绿联 NAS 2026-09-19 17:00:12 +08:00
陈银军 c236df3e49 fix: 生产构建强制走真实后端 API(.env.production=VITE_USE_MOCK=false),避免镜像内前端用 mock 假数据 2026-09-19 16:11:52 +08:00
陈银军 15f025679b fix: /api/threshold 读错字段导致写入恒为1,兼容 versionThreshold/value 2026-09-19 16:04:12 +08:00
陈银军 54f3b681d6 feat: 概览页包列表仅展示需关注项(预警+异常),加「查看全部」跳检索页 2026-09-19 15:42:32 +08:00
陈银军 a87b26417f chore: 概览页「你的缓存」栏目标题改为「缓存包列表」 2026-09-19 15:35:57 +08:00
陈银军 14526ccec1 Revert "chore: 品牌名「你的缓存」改为「Verdaccio 缓存管家 / 缓存可视化管理」"
This reverts commit 97b8521ead.
2026-09-19 15:35:13 +08:00
陈银军 97b8521ead chore: 品牌名「你的缓存」改为「Verdaccio 缓存管家 / 缓存可视化管理」 2026-09-19 15:34:41 +08:00
陈银军 cf9680bac7 chore: 导航菜单文案调整(动态→操作日志,忽略→已忽略的包) 2026-09-19 15:31:59 +08:00
陈银军 c267c8f38f fix: 顶部导航切换后内容区空白
<transition mode="out-in"> 包裹 router-view 时,首次导航后新视图
无法挂载(概览页首次加载正常、切换后所有页面含返回首页均空白,
且无 JS 报错)。改为默认过渡模式 + :key="route.path" 强制按路由
重挂载 + appear 首屏动画;路由改为同步导入简化实现。dev 与生产
构建均验证通过。
2026-09-19 15:29:20 +08:00
陈银军 57510af6e8 fix: 包详情抽屉无法关闭(关闭事件与 v-model 契约不匹配)
父组件用 v-model:visible 绑定抽屉可见性(监听 update:visible),
组件内关闭却 emit 'close',父组件从未监听,导致点 ✕ 与遮罩均
无法关闭。改为 emit 'update:visible', false,与 v-model 对齐。
2026-09-19 15:13:18 +08:00
陈银军 8cbe918e37 fix: 顶栏布局被 App.vue 的 display:block 覆盖导致元素垂直堆叠
App.vue 的 .desktop-topbar{display:block} 与 AppTopbar.vue 的
.topbar{display:flex} 特异性相同,且前者后注入胜出,使品牌/导航/
用户区垂直堆叠成三行。移除冗余规则,恢复单行 flex 布局。
2026-09-19 15:10:39 +08:00
陈银军 92635ec5dd chore: 移除脚手架残留的未引用 style.css 2026-09-19 15:00:18 +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
陈银军 338c1a0a95 docs: 需求文档合并、设计稿与设计规范
- 合并两份需求文档为完整版(功能需求 + 前端界面设计)
- 新增 bright/dark 双主题设计稿(7 画板 + 登录页效果图)
- 输出设计规范 design-spec.md(token/页面/组件/响应式/动效/部署)
- 需求文档补充缓存目录配置(3.7)与两种部署方式(9.1/9.2)
2026-09-19 14:30:21 +08:00