chore: 导入旧记忆备份供恢复
This commit is contained in:
@@ -0,0 +1,21 @@
|
||||
---
|
||||
title: 2026-09-20 消费者按需出证与本地开发调整确认
|
||||
type: decision
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/2026-09-20-消费者按需出证与本地开发调整确认
|
||||
stable_id: 4551fb5e-dcac-49a5-92eb-d3ac85a527db
|
||||
scope: project
|
||||
memory_type: decision
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 2
|
||||
request_id: artveris-20260920-consumer-certificate-decisions-v2
|
||||
created_at: '2026-09-19T17:59:33.181429+00:00'
|
||||
updated_at: '2026-09-19T18:15:56.334495+00:00'
|
||||
tags:
|
||||
- certificate
|
||||
- local-development
|
||||
- confirmed
|
||||
---
|
||||
|
||||
用户确认:每件实物 TraceCode 独立生成一次 V3 存证证书,消费者在溯源页区块链模块点击“查看证书”才触发,已有链接直接复用,不自动重复生成。仅保存官方证书网页链接,不保存图片,节省平台存储。无需每日新增上限或出证总开关,二者已按用户要求删除;仍保留已说明的短时请求限频与单件幂等。最新交互已实现:去掉“查看存证”和“查看证书”的箭头,证书按钮靠右;仅明确 ONCHAIN 且有真实交易哈希的天河链实物显示证书入口;点击后当前页面显示进度弹窗,使用“正在调取存证数据”“获取存证证书”“正在打开存证证书”,成功后当前页面跳转,避免浏览器拦截新窗口。新存证文本只包含作品名称、换行和实物追溯码,已有证据与链接不重写;实测天河链官方页面把换行渲染为空格,用户已明确接受先保持这样,不对第三方页面做额外处理。开发环境追溯链接固定使用 http://127.0.0.1:18080/trace,显式开发配置覆盖从生产导入的clientBaseUrl,生产模式不受影响。Docker本地开发采用源码挂载与监听,四个容器restart=no,开发时手动启动,结束手动停止。工作仅dev,验证后提交推送dev,不擅自部署生产或合并main。正式环境保持宝塔/PM2,联调只用天河链免费测试环境。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: C 端模块化编排契约与媒体存储层级
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/c-端模块化编排契约与媒体存储层级
|
||||
stable_id: 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-07
|
||||
created_at: '2026-09-03T03:41:49.610529+00:00'
|
||||
updated_at: '2026-09-03T03:41:49.610529+00:00'
|
||||
tags:
|
||||
- client
|
||||
- trace-layout
|
||||
- media
|
||||
- storage
|
||||
---
|
||||
|
||||
模块化编排(`packages/shared/src/trace-modules.ts`):布局 `{ version: 1, modules: [...] }`,数组顺序即展示顺序,每模块 `{ id, type, visible, title?, config }`。
|
||||
- 系统单例模块(id 固定):`HERO_CAROUSEL`(hero) / `AUTHENTICITY_STATUS`(authenticity) / `PRODUCT_INTRO`(product-intro) / `SHOWCASE`(showcase) / `CERTIFICATES`(certificates) / `TIMELINE`(timeline) / `BLOCKCHAIN`(blockchain);可重复自定义模块:`IMAGE_TEXT`(图文,imagePosition 上/下/左/右)、`HORIZONTAL_GALLERY`(横向图库)。
|
||||
- 限制:最多 32 模块、标题 120 字、正文 5000 字、图库 30 张;白名单校验未知字段全拒;不开放 HTML/CSS。函数:`validateTraceLayout/parseTraceLayout`(非法抛错)、`resolveTraceLayout`(非法回默认)、`templateTraceLayout`(剥离作品媒体/文案)、`createDefaultTraceLayout`。
|
||||
- 默认顺序(旧数据无布局时):轮播 → 防伪 → 产品介绍 → 作品展示 → 版权证书 → 时间轴 → 区块链。
|
||||
- 模板 `defaultTraceLayout` 只存结构(顺序/显隐/标题/imagePosition),建档时深拷贝到 `Artwork.traceLayout`,之后互不影响;作品布局随快照走审核。
|
||||
- 公开接口过滤 `visible=false` 模块并把自定义模块媒体 key 转 URL;系统模块无内容自动隐藏(BLOCKCHAIN 保留“暂未上链”态)。防伪状态模块可排序/隐藏(甲方要求能置底),但首扫激活/计数/日志由后端固定执行。
|
||||
- 固定不可配置:顶栏(显示作品名)、预览提示条、加载/错误页、隐私说明、页脚。版权证书区不显示类型角标。
|
||||
- 后台 `TraceModuleEditor.vue`:上下移/拖拽/显隐/标题覆盖/自定义模块增删复制;卡片可折叠(默认全收,新增/复制自动展开,折叠按钮在拖动手柄右侧序号左侧,纯 UI 不写入 JSON)。ArtworkEdit 将轮播/介绍/展示/时间轴/证书编辑嵌入对应模块卡。
|
||||
|
||||
媒体存储层级(人类可读):`{模板ID}/{档案编号}/` 下放 `作品图_{ts}_{n}`、`作品展示_...`、`节点-{标题}_...`、`证书-{名称}_...`(水印 `_wm`)、`模块图文-{标题}_...`、`模块图库-{标题}_...`;出库实况图 `{模板ID}/{档案编号}/{追溯码}/出库实况_...`。实现:上传先进临时日期目录,实体保存时 move 归位并改写 DB 引用(新建时档案号尚未生成);归位失败不阻断业务;编辑旧档案渐进迁移存量。本地驱动无 CDN 时返回相对路径 `/uploads/{key}`。原始出库 ZIP 存 `.private/` 前缀。
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-03 03:54:33 UTC [0b3818c1b8]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-03-03-54-33-utc-0b3818c1b8
|
||||
stable_id: d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-checkpoint-2026-09-03-migration-baseline
|
||||
created_at: '2026-09-03T03:54:33.622461+00:00'
|
||||
updated_at: '2026-09-03T03:54:33.622461+00:00'
|
||||
tags:
|
||||
- migration-baseline
|
||||
- handoff
|
||||
---
|
||||
|
||||
# 迁移基线(2026-09-03)——知识迁移自既有文档
|
||||
|
||||
## 当前版本与分支
|
||||
- 仓库 `e:\code\artveris`,remote `https://git.asio.asia/nixevol/Artveris.git`(push 同时到 github.com/nixevol/artveris)。
|
||||
- 当前分支 `dev`,HEAD `d7c6368 docs: 记录生产服务器 PM2 开机自启修复`;`dev` 领先 `main` 一个提交(仅文档),领先 `origin/dev` 一个提交。
|
||||
- 本次会话中后续会:删除 `aidocs/`(含远程)、`.gitignore` 加 `aidocs/` 与 `AGENT.md`、更新 README/交接文档中对 aidocs 的引用,并提交。
|
||||
|
||||
## 已完成(产品状态)
|
||||
- 首版已定稿并上线生产(art.qclh.xyz,宝塔/PM2),已经多次一键升级。
|
||||
- 近期功能:C 端模块化编排(traceLayout,含自定义图文/横向图库模块,编辑卡片可折叠)、证书区去类型角标、一键升级脚本 `scripts/upgrade-remote.ps1`、生产 PM2 开机自启修复(`pm2 startup systemd` + `pm2 save`)。
|
||||
- 本次迁移:已写入 5 条 rule、8 条 fact、2 条 decision、4 条 experience;密码库 3 条(天河链测试凭据 / 本地开发 MySQL·Redis / 生产服务器 SSH);文件仓储 `artveris/docs/` 5 份(项目交接文档、天河链集成说明、开发流水记忆 project_context、天河链对接分析、代码审查清单)。
|
||||
|
||||
## 进行中
|
||||
- 无未完成的代码任务。
|
||||
|
||||
## 待办 / 待用户决定
|
||||
- `dev` 上的 PM2 修复文档提交与本次 aidocs 清理提交尚未推送/合并 main,需用户确认后推送。
|
||||
- 生产上线天河链正式环境尚未切换(仍为测试环境凭据),需按“生产上线检查单”执行。
|
||||
|
||||
## 给下个会话
|
||||
- 先 `project_resolve_or_create` → `context_get` → `checkpoint_get`,再动代码。项目记忆已全部在 MemRelay,本地不再维护 `aidocs/project_context.md`;需要本地文档时用 `project_export_prepare` 导出到 `aidocs/`(已 gitignore)。
|
||||
- 开发前确认本地 dev API 是否在跑:打升级包/`nest build` 前必须先停。
|
||||
- 凭据一律从密码库取(`secret_search artveris`),不要读 `docs/系统测试信息.md` 外的其他来源。
|
||||
- 遇文档与代码冲突:代码现状 > 交接文档 > 流水记忆 > docs/ PRD/技术方案旧表述。
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-03 04:01:47 UTC [fdcc9e7732]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-03-04-01-47-utc-fdcc9e7732
|
||||
stable_id: 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-checkpoint-migration-done-20260903
|
||||
created_at: '2026-09-03T04:01:47.160888+00:00'
|
||||
updated_at: '2026-09-03T04:01:47.160888+00:00'
|
||||
tags:
|
||||
- handoff
|
||||
- migration
|
||||
---
|
||||
|
||||
# 检查点:知识迁移完成 + aidocs 清理已推送(交接)
|
||||
|
||||
## 当前状态
|
||||
- 分支:`dev` 与 `main` 均在 `ca2c7fd`(chore: 项目记忆迁移至 MemRelay,移除 aidocs 并更新文档引用),已推送到 Gitea(git.asio.asia)和 GitHub 两个 push URL。工作区干净。
|
||||
- 生产服务器(8.134.255.136,/www/wwwroot/artveris)运行的是 2026-09 “客户端作品模块化编排”版本,PM2 开机自启已修复(pm2 startup systemd + pm2 save)。
|
||||
|
||||
## 本会话完成
|
||||
1. 知识迁移自既有文档(README/docs/aidocs/scripts):已保存 6 条 rule、8 条 fact、2 条 decision、4 条 experience;凭证 3 条存入密码库;7 份文档上传至文件仓储 `artveris/docs/`;已 `curation_source_submit` 提交整理。
|
||||
2. 校验:`memory_search`(天河链、traceLayout、PM2 等)可命中;`context_get` 能组装出项目规则。
|
||||
3. 仓库清理:`git rm -r aidocs`,`.gitignore` 新增 `aidocs/`;`README.md` 目录树、`docs/项目交接文档.md`(阅读顺序/冲突裁决/第七节 AI 记忆继承指引)、`docs/天河链文档.md` 的 aidocs 引用已改为指向 MemRelay。
|
||||
4. `main` 快进到 `dev`(两次提交均为 docs/chore,无代码变更),双分支已推送。
|
||||
|
||||
## 给下个会话
|
||||
- 开场先 `project_resolve_or_create` → `context_get` → `checkpoint_get`,再读 `docs/项目交接文档.md`;不要再写本地 aidocs/project_context.md。
|
||||
- 用户的 Cursor 全局规则 `.cursor/rules/rules.mdc` 仍写着“默认用 aidocs/project_context.md”,已建议用户自行改为 MemRelay;未改前以 MemRelay 为项目记忆文件。
|
||||
- 本地 dev API 若在 `nest start --watch`,跑 `python scripts/build.py --upgrade` 前先停掉,否则 dist 被改写导致 dev 崩。
|
||||
- 线上升级统一用 `scripts/upgrade-remote.ps1`(内部调 `upgrade-remote-steps.sh`),不要手工覆盖 .env/storage/backups。
|
||||
|
||||
## 待办
|
||||
- 无未完成代码线索。后续以甲方对“作品模块化编排”的反馈为驱动继续开发。
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-19 18:15:58 UTC [450bee174b]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-19-18-15-58-utc-450bee174b
|
||||
stable_id: 24b96a5f-3fbb-4d4c-a586-fd30d177d2ba
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-six-changes-handoff
|
||||
created_at: '2026-09-19T18:15:58.229105+00:00'
|
||||
updated_at: '2026-09-19T18:15:58.229105+00:00'
|
||||
tags:
|
||||
- handoff
|
||||
- certificate
|
||||
- hot-reload
|
||||
- verified
|
||||
---
|
||||
|
||||
# 消费者按需出证及本地开发六项调整完成
|
||||
|
||||
## 当前状态
|
||||
- E:/code/artveris,本地dev与origin/dev均为c5c0168,工作区干净。提交c486499为开发热更新及本地URL,c5c0168为出证弹窗、按钮和文本。均已推送https://git.asio.asia/nixevol/Artveris.git;未合并main,未更新线上宝塔/PM2。
|
||||
- 本地Compose项目artveris-local运行中,API/MySQL/Redis健康,Nginx入口http://127.0.0.1:18080。四个服务restart=no,不开机自启。代码挂载到开发镜像artveris-dev:local,普通源码修改不需要重建容器。
|
||||
|
||||
## 做了什么与原因
|
||||
- 查看存证、查看证书去箭头,证书按钮margin-left:auto靠右。明确ONCHAIN、有txHash、天河链时才显示。未上链不显示;预览模式不发起出证。
|
||||
- 使用原页原生dialog显示三阶段进度:正在调取存证数据/获取存证证书/正在打开存证证书。先GET本地缓存,NONE或UNKNOWN才POST申请/恢复,其他处理中状态仅查询,成功后同页跳官方证书地址。关闭弹窗只停止前端等待,不重复生成;删除了旧独立Certificate等待页。
|
||||
- 新证据文本为作品名称+真实换行+追溯码;保存官方URL,不保存图片。官方页面把换行折成空格,用户明确接受,既有证据不自动改写或重生成。
|
||||
- 本地导入的clientBaseUrl曾指向线上。configuration新增仅development且显式ARTVERIS_DEV_ORIGIN有效的覆盖,SettingsService统一用于后台列表、导出/二维码、短链、设置页;生产不受影响。
|
||||
- Dockerfile.dev保留Linux依赖,挂载API/admin/client/shared源码;dev.mjs监督共享包tsc watch、Nest watch、两个Vite进程,Nginx代理HMR WebSocket。Windows使用轮询。补充procps解决Nest CLI缺ps时遗留旧进程占端口的问题。
|
||||
- 此前已按用户要求去掉每日出证上限和总开关,保留每实物一次生成、未知结果仅查询、数据库CAS/租约。测试链V2发行operateId不能直接出V3证书,需独立文本存证;该事实已单独写入MemRelay。
|
||||
|
||||
## 验证
|
||||
- API 35组/288用例通过,前后台构建通过。新增覆盖本地URL覆盖与生产配置恢复、证据文本精简和换行保留。
|
||||
- 实测后台追溯码列表URL与/t短链均使用127.0.0.1:18080/trace。单独验证production忽略开发覆盖。
|
||||
- 前端DOM临时标记无需刷新自动出现,后端健康响应临时字段加入和撤销均自动重载,容器ID及StartedAt不变;验证标记和当前任务临时脚本已清理。
|
||||
- 新实物259394001444在免费测试链经弹窗成功出证并自动跳转,证据严格等于作品名称+换行+短码,URL保留%0A。未上链实物402300000502无查看证书按钮。普通访问不自动生成。
|
||||
- 日志位于已忽略的.deploy/local/six-changes-tests.log及six-changes-front-build.log,运行配置和数据不提交Git。
|
||||
|
||||
## 接手说明
|
||||
- 启动:docker compose --env-file .deploy/local/.env -f docker/compose.local.yml up -d;停止同前缀stop。依赖/锁文件/Dockerfile变化才up -d --build;schema/迁移变化restart api会重新生成Prisma并迁移。不要在watch同一容器运行生产build写dist。
|
||||
- docs/本地Docker测试环境.md、docs/消费者按需存证证书.md已经同步运行说明。不要再创建本地aidocs记忆;使用MemRelay。
|
||||
- 测试凭据来源为密码库“artveris · 天河链测试环境凭据”,生产API域名在本地容器映射到loopback防误调用。生产业务记录已复制为本地测试数据,链上旧生产交易不会因此变成测试链交易;新测试证书为独立测试V3记录。
|
||||
- 无当前六项功能未完成代码。官方证书换行显示为其样式限制,用户接受。等待用户本地体验反馈,未经明确安排不部署线上。
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-19 18:37:19 UTC [d3ebd0387b]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-19-18-37-19-utc-d3ebd0387b
|
||||
stable_id: b7949516-d856-4711-9ac5-4c022c053440
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-main-merge-c5c0168
|
||||
created_at: '2026-09-19T18:37:19.199517+00:00'
|
||||
updated_at: '2026-09-19T18:37:19.199517+00:00'
|
||||
tags:
|
||||
- git
|
||||
- merge
|
||||
- handoff
|
||||
- verified
|
||||
---
|
||||
|
||||
# dev 已按用户要求合并到 main
|
||||
|
||||
用户明确要求“合并到主分支”。已 fetch 检查:origin/main 为 ca2c7fd,origin/dev 为 c5c0168,main 落后 6 个提交且无分叉。Gitea main 分支接口返回 protected=false、required_approvals=0、enable_status_check=false;仓库无新增 CI/评审门禁文件。
|
||||
|
||||
执行本地 main 快进合并 dev,无冲突、无额外 merge commit。合并后确认内容与 origin/dev 完全相同,复跑 API 全部 35 组/288 测试通过,本地 /api/health 返回 200。已推送 origin/main,并用 ls-remote 确认远程 main 与 dev 均为 c5c0168e4cc5aae28f802b69dd60ae1dd9bbb0d4。
|
||||
|
||||
当前已切回 dev 供后续开发,本地 main/dev 与对应远程分支一致,工作区干净。测试日志位于忽略目录 .deploy/local/main-merge-tests.log。
|
||||
|
||||
本次只进行代码合并与推送,未构建线上发布包、未部署或重启生产服务器,正式宝塔/PM2 仍运行旧部署版本。上一检查点关于功能交互、V3按需出证和本地Docker热更新的说明继续有效,仅 Git 集成状态更新为 main/dev 已同步。后续按用户安排进行本地迭代或线上部署,不把推送 main 当作已上线。
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-19 18:59:41 UTC [5820f40be0]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-19-18-59-41-utc-5820f40be0
|
||||
stable_id: da61a1a1-0b56-4404-84ad-50413532a1ed
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-production-c5c0168
|
||||
created_at: '2026-09-19T18:59:41.651548+00:00'
|
||||
updated_at: '2026-09-19T18:59:41.651548+00:00'
|
||||
tags:
|
||||
- production
|
||||
- deployment
|
||||
- backup
|
||||
- pm2
|
||||
- handoff
|
||||
- verified
|
||||
---
|
||||
|
||||
# Artveris 正式环境升级完成(用户明确授权)
|
||||
|
||||
## 当前版本与运行状态
|
||||
- 2026-09-20 Asia/Shanghai 02:51:20—02:51:31 完成约11秒切换,正式 https://art.qclh.xyz 已部署 main/dev 提交 c5c0168e4cc5aae28f802b69dd60ae1dd9bbb0d4,包含消费者按需证书、进度弹窗、短文本及此前全部改动。
|
||||
- 正式目录 /www/wwwroot/artveris,PM2 项目 server,Node /www/server/nodejs/v24.18.0/bin/node,production、fork单实例、autorestart=true、watch=false。核验时PID247323,运行超过7分钟无异常重启(restart_time=0)。pm2 save已成功;pm2-root systemd启动服务enabled/active,dump中的脚本路径与生产环境变量已验证。
|
||||
- 本地当前dev,与origin/dev一致,main也同一提交,工作区干净。本次没有新的代码改动提交。之前“未部署线上”的检查点已由本次部署状态替代。
|
||||
|
||||
## 如何保障数据
|
||||
- 先只读核对实际PM2目录、数据库MySQL5.7.40、迁移状态、依赖版本和空闲空间。原4条迁移checksum与新包一致,19项后台任务均SUCCESS,5701条凭据均ONCHAIN,没有正在处理的业务任务。
|
||||
- 从main git archive制作隔离源码,在独立Docker生产builder编译,用现有build.py的打包函数生成非Docker升级包;未在本地watch容器中运行生产构建。升级包不含.env、媒体或生产配置。
|
||||
- 在服务器独立目录提前安装生产依赖和生成Prisma客户端,验证sharp/Prisma可加载,生产服务继续在线。
|
||||
- 原代码连完整node_modules/.env、PM2运行/启动dump、项目Nginx配置先备份。停Artveris后再导出最终数据库、storage与backups,然后移动新旧代码目录;保持根.env、storage、backups、ecosystem及宝塔绑定不变。未重启或修改其他服务、MySQL、Redis、Nginx或PM2守护进程。
|
||||
- 应用3条新增迁移(证书字段、移除旧每日限额、移除旧开关),数据库共7条迁移成功。切换前后比较24张业务表所有原字段的有序行SHA256以及文件清单:一致;46个媒体文件、.env、ecosystem、Nginx哈希一致。数据包括作品记录7、追溯码6698、凭据5701、查询记录483、用户1。
|
||||
|
||||
## 备份和回滚
|
||||
- 服务器受保护目录 /www/upgrade/artveris-c5c0168-20260920/backup/(目录700、备份文件600)。最终database-final.sql.gz、media-and-backups.tar.gz、code-and-config.tar.gz、SHA256SUMS、snapshot-before/after.json、PM2和Nginx快照。
|
||||
- previous/保留可直接恢复的上版代码与完整依赖,不需要联网重新安装。rollback-code.sh位于该升级目录根;仅核对当前c5c0168版本后人工执行,不要在正常状态运行。
|
||||
- 本次迁移向后兼容,代码回滚保留数据库新增列和升级后数据,不自动回灌旧库造成数据丢失。完整SQL备份另外保留供灾难恢复。
|
||||
- 核心备份另外下载到本机E:/code/artveris/.deploy/production/,SHA256对照服务器全部一致。初次备份在无网络隔离MySQL容器恢复并演练迁移通过,最终SQL也再单独恢复成功(6698/5701/483核对)。临时恢复容器及明文中间SQL已清理。服务器临时数据库连接凭据client.cnf已清理。
|
||||
- 升级报告两端均保存:本机.deploy/production/UPGRADE-REPORT.md;服务器升级目录UPGRADE-REPORT.md。脚本/日志/备份不进入Git。
|
||||
|
||||
## 上线验证
|
||||
- 370个部署运行文件匹配发布manifest;公网HTTPS健康、安装状态、前后台及引用静态资源10项检查通过。
|
||||
- 正式短链正确302到https://art.qclh.xyz/trace,未带入本地127.0.0.1或测试配置;正式tianheEnv=production与接口地址保持原值。
|
||||
- 只读证书状态接口在线,查询实物返回NONE;5701条原凭据默认NONE,没有自动批量补证,没有主动调用正式付费存证/出证接口。
|
||||
- 后续以本地dev继续开发;线上升级仍需用户安排。现有scripts/upgrade-remote-steps.sh缺少pipefail、完整媒体备份校验和自动回滚,不能直接把其“压缩包非空/健康200”当作无损验证。本次使用升级目录内经过检查的准备、切换、逐表/逐文件校验和回滚脚本。
|
||||
|
||||
## 待办
|
||||
- 当前升级无未解决故障。等用户线上体验反馈。后续如需验证付费生成,不默认点击正式“查看证书”制造成本,测试优先免费测试环境。
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-20 02:02:18 UTC [68e7c94d84]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-20-02-02-18-utc-68e7c94d84
|
||||
stable_id: c3c14f75-1ed4-4e30-91e8-952031f256ba
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-template-author-ready-git-auth-blocked-20260920
|
||||
created_at: '2026-09-20T02:02:18.040295+00:00'
|
||||
updated_at: '2026-09-20T02:02:18.040295+00:00'
|
||||
tags:
|
||||
- handoff
|
||||
- certificate
|
||||
- deployment
|
||||
- authentication
|
||||
---
|
||||
|
||||
# 证书模板和作者单选实现完成,发布暂因Git认证阻塞
|
||||
|
||||
## 用户目标和授权
|
||||
用户要求清理线上旧升级备份;证书正文默认改为{{作品名称}} {{版本}},系统设置可配置字段模板、帮助点击弹出;作者显示用单选默认存证钱包地址,也可选作品作者姓名。用户明确要求完成后提交推送,再无损更新线上。延续原任务,不应因最新简短确认丢失部署目标。
|
||||
|
||||
## 已完成
|
||||
- dev提交6669722c0081b8fde166556be23cddf69b440c36;本地main已快进同提交,当前停留main,工作区干净。远程dev/main仍c5c0168,尚未推送6669722。
|
||||
- packages/shared/src/certificate-text.ts提供默认模板、字段白名单和纯文本渲染;支持作品名称/版本/追溯码/档案编号/作者。版本取作品模板label=版本对应键,实测当前键size。settings新增certificateTextTemplate与certificateAuthorMode默认WALLET,无数据库迁移。
|
||||
- 作者选ARTWORK_ARTIST时仅在读取返回的官方证书URL中增加author显示参数,保留address/digest/txHash/原文/时间,空姓名回退钱包。支持已有证书下次查看,不重新生成。已检查官方test和production静态页面支持此参数并浏览器验证黄志伟显示。
|
||||
- UI单选、文本多行框和点击才显示帮助已实测保存。测试库模板为默认值,作者选项已恢复WALLET。
|
||||
- 全套36组294测试通过;生产builder构建通过;本地测试实物802593007615新出证正文“十二生肖莲花手工杯 一个装”,重复复用;切换作者姓名后仅author参数改变,其余参数与生成时间一致。
|
||||
- 清理了上轮服务器/www/upgrade/artveris-c5c0168-20260920/backup约601MB及同轮回滚脚本/PM2临时信息,本机.deploy/production/备份已先核验SHA256且仍保留。未删除线上业务storage/backups和其他项目。
|
||||
|
||||
## Git阻塞
|
||||
push origin dev返回Failed to authenticate user。已先查MemRelay密码库,唯一对应站点OAuth条目“Gitea git.asio.asia OAuth”的access和refresh均过期,API /user返回401,本机credential fill也无可用凭据。不要重复使用旧token。已通过异步问题请用户重新登录Git或更新密码库凭据,尚未收到完成回复。不要输出任何秘密。其他仓库专用账户不能未经确认替代。恢复后fetch比对远端,推送dev/main(如远端变动需正常整合,不force)。用户要求先推送后上线,暂未执行生产切换。
|
||||
|
||||
## 发布准备(已就绪、线上仍c5c0168)
|
||||
- 本机目录.deploy/production-template/,源码快照source、包artveris-upgrade-6669722.tar.gz、manifest、脚本、日志、code-and-config.tar.gz、database-warm.sql.gz。
|
||||
- 包SHA256 030b14c1cbe33f35fddcd396c00c88890802512a201328f7912866c1e0ce2c7c,来自已构建artveris-release:template镜像。377文件清单校验通过。
|
||||
- 服务器目录/www/upgrade/artveris-6669722-20260920。prepare-release.sh已完成依赖预安装、Prisma generate、sharp/Prisma加载、7条既有迁移checksum验证、热备份代码配置及DB(新一轮备份,约108MB压缩)。本机已下载新备份。所有19 jobs SUCCESS,5701 proofs ONCHAIN。
|
||||
- snapshot.cjs、cutover.sh已上传并通过语法验证;本轮脚本从上轮验证流程替换版本号和目录得到,运行前复核。尚未运行launch-cutover.sh(不存在cutover-complete和cutover.pid)。client.cnf是服务器暂存数据库连接文件,0600,正式校验后verify-release.sh会清理。若暂存长期搁置先清理后在切换前安全重建。
|
||||
- SSH helper沿用.deploy/production/ssh_task.py(uv run --with paramiko),服务器地址/私钥由用户本会话提供、密码不写记忆。
|
||||
|
||||
## 继续步骤
|
||||
1. 获取用户已恢复的Git认证,fetch、推送dev及main,校验远端一致,最后回dev。
|
||||
2. 切换前再次只读核对线上任务(新增证书任务也要确认无处理中)和PM2,必要时重新热备份;执行.deploy/production-template/launch-cutover.sh将服务器cutover.sh后台运行,轮询cutover-status.sh。
|
||||
3. 切换脚本会停server,最终DB/媒体一致性备份,交换已安装的新旧代码,migrate无新迁移,snapshot逐表原字段和文件校验,pm2 restart并save。错误自动恢复旧代码,保留数据。
|
||||
4. verify-release.sh及final-status.sh验证公网、manifest、PM2和系统数据;新增只读核对模板默认值及作者模式,勿主动调用正式付费出证。
|
||||
5. 下载本轮最终DB/媒体/哈希/前后快照,再对照和恢复测试。新备份是否清理应依据用户明确请求范围,用户本次清理指已完成上一轮,可向其报告本轮新备份保留。
|
||||
6. 更新本轮报告和MemRelay最终检查点,说明部署真实结果,不声称Git或上线已完成。
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
---
|
||||
title: Checkpoint 2026-09-20 02:12:29 UTC [ed33d2aeb8]
|
||||
type: checkpoint
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/checkpoint-2026-09-20-02-12-29-utc-ed33d2aeb8
|
||||
stable_id: 2aebe24b-03b0-43be-8b21-ff1b61093cc6
|
||||
scope: project
|
||||
memory_type: checkpoint
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-template-author-production-complete-6669722
|
||||
created_at: '2026-09-20T02:12:29.923732+00:00'
|
||||
updated_at: '2026-09-20T02:12:29.923732+00:00'
|
||||
tags:
|
||||
- handoff
|
||||
- production
|
||||
- certificate
|
||||
- verified
|
||||
---
|
||||
|
||||
# 证书文本模板和作者单选已上线
|
||||
|
||||
## 完成状态
|
||||
用户提供Gitea新账号凭据并授权继续。已保存密码库条目“Gitea git.asio.asia nixevol”,API账户验证成功,Git凭据管理器同步完成;不要继续使用已过期的OAuth条目。dev/main均成功推送到6669722c0081b8fde166556be23cddf69b440c36,本机已回dev且工作区干净。
|
||||
|
||||
2026-09-20 Asia/Shanghai 10:08:45—10:08:54约9秒完成正式环境无损切换,https://art.qclh.xyz现为6669722。此前Git认证阻塞和“待上线”状态已解决。
|
||||
|
||||
## 功能与决策
|
||||
- 系统设置区块链页证书文本模板默认{{作品名称}} {{版本}};五个支持字段作品名称/版本/追溯码/档案编号/作者,可自定义顺序文字换行。版本按模板label取值,真实键size。帮助按钮点击才弹出。新正文示例“十二生肖莲花手工杯 一个装”;不重写已有或已提交证据。
|
||||
- 作者显示单选默认WALLET,可选ARTWORK_ARTIST,读取已审核作品artist。官方网页支持独立author显示参数,保留原钱包address/哈希/原文/生成时间,缺姓名回退钱包。已有证书下次打开时也生效,不额外调用存证API、不改变实际签名身份。
|
||||
|
||||
## 验证
|
||||
- 本地36组294测试通过,生产builder构建通过,合并后相关23测试通过。
|
||||
- 本地免费链真实出证、默认正文、作者姓名、再次复用、UI帮助点击和单选保存全部验证。默认选项已恢复钱包。
|
||||
- 线上7条已有迁移checksum匹配,无新迁移。更新前后24张业务表原字段有序行SHA256一致,46个媒体逐文件哈希一致,.env/ecosystem/Nginx配置一致。
|
||||
- 保留作品7、追溯码6698、凭据5701、查询491、用户1、已生成证书2;其中5699证书NONE、2 READY,没有自动批量生成。
|
||||
- 发布前377文件校验,部署后373运行文件hash与manifest匹配。公网HTTPS健康、安装状态、前后台及资源10项通过。
|
||||
- 正式只读验证:certificateTextTemplate默认正确、certificateAuthorMode=WALLET,作品样例解析成“十二生肖莲花手工杯 一个装”;正式链环境与生产clientBaseUrl保持原值。未主动调用正式付费存证/出证接口。
|
||||
- PM2 server正常online,PID252794,Node24.18.0,production、fork单实例、autorestart=true、watch=false,观察期0异常重启;pm2-root服务enabled/active,pm2 save已保存启动配置。
|
||||
|
||||
## 备份与清理
|
||||
- 用户要求的上轮服务器升级备份已清理(约601MB);本机.deploy/production旧副本保留。
|
||||
- 本轮升级新建备份目录 /www/upgrade/artveris-6669722-20260920/backup/,本机 .deploy/production-template/。最终SQL、媒体、代码依赖配置、SHA256SUMS、snapshot-before/after都保留。两端SHA256一致,最终SQL在隔离无网络MySQL容器恢复成功,包含2份已有证书。测试容器已清理。
|
||||
- previous/保留旧代码及依赖,升级目录rollback-code.sh用于人工代码回滚,保留当前DB新数据不回灌旧库。新备份尚保留供本次恢复,非删除用户生产backups目录。服务器临时client.cnf已清理。
|
||||
- 两端均有UPGRADE-REPORT.md。升级包SHA256为030b14c1cbe33f35fddcd396c00c88890802512a201328f7912866c1e0ce2c7c。凭据不在报告/普通记忆/Git中。
|
||||
|
||||
## 后续
|
||||
当前任务全部完成,无未解决阻塞。本地Docker继续源码热更新且restart=no;用户后续反馈从dev继续。正式目录仍/www/wwwroot/artveris,PM2仍server,其他服务未操作。不要把官方author展示参数误称为链上身份变更;正文模板修改仅影响新证据,已有证据正文不可重写。
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: Docker开发镜像Nest热重载需安装procps
|
||||
type: experience
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/docker-开发镜像-nest-热重载需安装-procps
|
||||
stable_id: da7a2613-9076-4924-b49e-07a41ffaf126
|
||||
scope: project
|
||||
memory_type: experience
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-nest-watch-procps
|
||||
created_at: '2026-09-19T18:13:11.929693+00:00'
|
||||
updated_at: '2026-09-19T18:13:11.929693+00:00'
|
||||
tags:
|
||||
- docker
|
||||
- development
|
||||
- hot-reload
|
||||
- verified
|
||||
---
|
||||
|
||||
Windows Docker Desktop 本地开发实测:Vite 使用轮询挂载源码后可以热更新;Nest watch 能检测源码并编译,但 node:24-slim 不自带 ps,Nest CLI 的 treeKillSync 内部 spawnSync('ps',['-A','-o','pid,ppid']) 失败后只杀父进程,遗留旧API进程占用3000,导致EADDRINUSE且仍响应旧代码。修复为仅在Dockerfile.dev安装procps,保留Nest已有watch流程,不引入额外监听依赖。修复后已验证后端临时响应字段加入与撤销都自动生效,容器ID和启动时间不变。前端也通过无需刷新页面的DOM标记验证HMR。临时验证标记已恢复,不进入提交。
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: Windows 本地开发与脚本踩坑
|
||||
type: experience
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/windows-本地开发与脚本踩坑
|
||||
stable_id: 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
scope: project
|
||||
memory_type: experience
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-exp-02
|
||||
created_at: '2026-09-03T03:45:32.371988+00:00'
|
||||
updated_at: '2026-09-03T03:45:32.371988+00:00'
|
||||
tags:
|
||||
- windows
|
||||
- powershell
|
||||
- dev-script
|
||||
- prisma
|
||||
- pitfall
|
||||
---
|
||||
|
||||
- `prisma generate` 报 EPERM rename:运行中的 API 占用 Prisma 引擎 DLL,先停 API(`dev.py --stop`)再生成;`dev.py` 已对 generate 做重试。
|
||||
- `EADDRINUSE :::3000` 真因:`nest start --watch` 监视器在子进程被杀后自动重启抢端口;处于 idle 的监视器不监听端口按端口找不到。`_lib.kill_project_servers()` 按命令行特征(项目路径 + nest/vite/dist·main)整树清理;三端子进程加入 KILL_ON_JOB_CLOSE 的 Windows Job(ctypes 需显式 restype/argtypes 否则 64 位 HANDLE 截断);`SetConsoleCtrlHandler` 拦截 Ctrl+C/关闭统一清理。
|
||||
- API `tsconfig.json` include 仅 `src`(含 prisma 会让 tsc 改 rootDir 导致 dist/main.js 错位);显式 `rootDir: ./src`;前端 tsconfig 去 `baseUrl`,`paths` 用 `@/* -> ./src/*`。
|
||||
- MySQL 8 `caching_sha2_password` 冷启动首次鉴权可能失败;另一项目占 3306 会命中错库(曾导致 P1000)。
|
||||
- PowerShell 双引号字符串中变量后紧跟半角冒号必须写 `${name}:`,否则 5.1 解析为非法作用域变量。
|
||||
- Express 5(Nest 11)SPA 回退路由通配符必须写命名 `/*splat`,否则 path-to-regexp 8 拒绝启动。
|
||||
- Vite dev 下 `/admin` 无尾斜杠只提示不跳转,两端 vite.config 各加 `redirectToBase` 插件;admin dev 代理 `/api`、`/uploads`、`^/t/.*`→3000、`/trace`→5174,使 5173 成为与生产一致单入口。
|
||||
- 安装向导本地调试:安装成功后 `process.exit` 会掰断 HTTP 致前端 `Unexpected end of JSON input`;`ARTVERIS_INSTALL_MODE=1` 时不 exit,生产延迟 2.5s 退出。`dev.py` 监听根 .env 出现(后端最后一步才写)作为安装完成信号自动切正式模式。
|
||||
- Docker 本机拉 docker.io 常不通,需 daocloud/1Panel 镜像或代理预缓存 `node:24-slim`;corepack 需 `COREPACK_ENABLE_DOWNLOAD_PROMPT=0`。
|
||||
- 安装向导内部 `throw new Error` 会被全局过滤器替换为“服务器内部错误”,需用 `BusinessException` 透传。
|
||||
+188
@@ -0,0 +1,188 @@
|
||||
---
|
||||
title: ArtVeris Development – Current Tasks (development workspace)
|
||||
type: curated
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/curated/art-veris-development-current-tasks-development-workspace
|
||||
stable_id: 98ef0fde-27fa-4f45-9037-9fe294499a49
|
||||
scope: project
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
workspace_type: development
|
||||
usage_profile_id: null
|
||||
preference_context: development
|
||||
document_type: tasks
|
||||
revision: 1
|
||||
source_memory_ids:
|
||||
- 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- 2fafa191-d208-41e4-9f7b-ce5a633c886b
|
||||
- 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
- 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
- a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
- ae318134-8651-4563-bc22-491c51f87af4
|
||||
- b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
- d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
- dd22c710-2822-4515-a28c-ead99162caac
|
||||
- e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
source_checkpoint_ids:
|
||||
- 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
- d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
source_file_ids:
|
||||
- 07583531-4b5a-4826-ad88-be4c3f16ba9d
|
||||
- 2749e8f9-a45f-43b0-a818-143ae532db24
|
||||
- 2977cf7c-7494-4b28-a8c6-2fbc6261c810
|
||||
- 4e728912-7bd0-455c-ac3a-e35189c26e37
|
||||
- 8f5b3f27-3ed1-4bf1-97ef-cb130f238161
|
||||
source_git_commit: d7c6368
|
||||
source_git_commits:
|
||||
- d7c6368
|
||||
source_agent_sync_ids:
|
||||
- artveris-curation-2026-09-03-migration
|
||||
model_connection: Sub2API
|
||||
model_name: openai/gpt-oss-120b
|
||||
source_count: 42
|
||||
source_revisions: {}
|
||||
source_dispositions:
|
||||
processed: 42
|
||||
unchanged: 0
|
||||
unsupported: 0
|
||||
skipped: 0
|
||||
cited_source_ids: []
|
||||
job_cited_source_ids: []
|
||||
conflicts: []
|
||||
supersedes: []
|
||||
preferences:
|
||||
- statement: '提交遵循 type: 中文描述 的 commit 格式,分支策略为 dev(长期开发) 与 main(生产)。'
|
||||
level: scenario
|
||||
workspace_types:
|
||||
- development
|
||||
workspace_ids: []
|
||||
source_ids:
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
counterexample_source_ids: []
|
||||
occurrence_count: 1
|
||||
explicit: true
|
||||
confidence: 1.0
|
||||
status: current
|
||||
- statement: 生产部署采用单一 .env 配置文件,业务可调参数存于 system_setting 表;其他配置文件被忽略。
|
||||
level: scenario
|
||||
workspace_types:
|
||||
- development
|
||||
workspace_ids: []
|
||||
source_ids:
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
counterexample_source_ids: []
|
||||
occurrence_count: 1
|
||||
explicit: true
|
||||
confidence: 1.0
|
||||
status: current
|
||||
- statement: 本地开发约束:使用 PNPM 10.28.0、Node ≥ 20.11.1,使用 scripts/dev.py,构建或升级前必须停止 nest
|
||||
进程。
|
||||
level: scenario
|
||||
workspace_types:
|
||||
- development
|
||||
workspace_ids: []
|
||||
source_ids:
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
counterexample_source_ids: []
|
||||
occurrence_count: 1
|
||||
explicit: true
|
||||
confidence: 1.0
|
||||
status: current
|
||||
- statement: 代码提交前需清理临时文件、日志、密码文件,并更新对应的 MemRelay 记忆条目。
|
||||
level: scenario
|
||||
workspace_types:
|
||||
- development
|
||||
workspace_ids: []
|
||||
source_ids:
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
counterexample_source_ids: []
|
||||
occurrence_count: 1
|
||||
explicit: true
|
||||
confidence: 1.0
|
||||
status: current
|
||||
source_cursor: 359
|
||||
source_hash: 06340ad0d2d916308bcf502ff22c22461eeb2afaaeea56df8687dae4fdb0f11d
|
||||
prompt_version: 2026-08-12.3
|
||||
schema_version: '3'
|
||||
curation_job_id: 7900a00f-2876-4e05-bb12-7beb6e014a93
|
||||
created_at: '2026-09-03T04:21:25.595127+00:00'
|
||||
updated_at: '2026-09-03T04:21:25.596394+00:00'
|
||||
tags:
|
||||
- development
|
||||
- tasks
|
||||
---
|
||||
|
||||
# 📋 任务清单(截至 2026‑09‑03)
|
||||
|
||||
以下任务基于最近的迁移、部署、以及技术决策记录整理。所有条目均已在 **MemRelay** 中对应的源记录中列出,可通过 `source_ids` 追溯。任务按状态分组,便于在本轮开发冲刺中快速定位阻塞点。
|
||||
|
||||
---
|
||||
|
||||
## ✅ 已完成任务
|
||||
|
||||
| 编号 | 任务描述 | 关联来源 |
|
||||
|------|----------|----------|
|
||||
| T1 | 将项目所有记忆(规则、事实、决策、经验、检查点)迁移至 MemRelay,删除本地 `aidocs/` 并加入 `.gitignore`。 | [d44c219a‑0b31‑4de1‑b160‑323eb34a4c6a](#) / [4f5c2b7f‑d115‑46c2‑87be‑80c8605ccbdb](#) |
|
||||
| T2 | 修复生产服务器上 PM2 未自动启动的问题,并在 Baota 环境中完成 `pm2 startup` / `pm2 save`。 | [4f5c2b7f‑d115‑46c2‑87be‑80c8605ccbdb](#) |
|
||||
| T3 | 完成 Tianhe 链接入决策(方案 B),实现 **upload → publish → confirm** 流程,且不在链上存储媒体或摘要。 | [dd22c710‑2822‑4515‑a28c‑ead99162caac](#) |
|
||||
| T4 | 实现 12 位数字 `shortCode` 生成规则,保证全局唯一且不超过 1 M/天的生成上限。 | [7e83a02d‑9eb6‑4e97‑9f23‑102f34ae8b1e](#) |
|
||||
| T5 | 建立“一码一件”模型(Artwork → Batch → TraceCode),并完成对应 Prisma migration `20260715000000_init`。 | [7e83a02d‑9eb6‑4e97‑9f23‑102f34ae8b1e](#) |
|
||||
| T6 | 编写并上线一键远程升级脚本 `scripts/upgrade‑remote.ps1`(备份 DB → 停止 PM2 → 执行 upgrade.sh → 重启 → 健康检查)。 | [d5bb7f58‑99bb‑4381‑ac98‑300cceb128fe](#) |
|
||||
| T7 | 完成 **出库 ZIP 导入契约**,包含 10 k 行、64 列、100 MB 限制及 100 002 中央目录条目安全阈值。 | [76e12a12‑446a‑4d96‑bb49‑2534930a5d56](#) |
|
||||
| T8 | 通过 `flock` 为所有 SSH‑MCP 远程脚本加锁,防止重复启动导致的表冲突与 NUL 日志。 | [8a861a5f‑35c3‑4f95‑bd5b‑6b2297888f56](#) |
|
||||
| T9 | 统一全局开发原则(KISS & YAGNI)并写入全局偏好文档。 | [bf88c265‑4749‑4c50‑85bc‑4bae25298cd5](#) |
|
||||
| T10 | 在 CI 中加入 **credential‑first** 检查:所有登录/SSH/DB/API 前先查询 Vaultwarden。 | [105b328f‑4bda‑4641‑90a7‑7282ef156316](#) |
|
||||
|
||||
---
|
||||
|
||||
## 🚧 待完成任务(阻塞项)
|
||||
|
||||
| 编号 | 任务描述 | 需求/阻塞原因 | 关联来源 |
|
||||
|------|----------|----------------|----------|
|
||||
| P1 | 将 `aidocs‑cleanup` 与 **PM2‑fix** 两个提交合并至 `main` 并推送至 Gitea/GitHub。 | 需要项目负责人确认后合并。 | [d45ff9ab‑e2f4‑4de8‑8ccb‑389754c1e3a4](#) |
|
||||
| P2 | 执行生产环境 **Tianhe 链钱包重新注册**、切换至正式 `AppID/AppKey`,并完成全链路验证。 | 需在 staging 完全通过后方可在生产执行。 | [d5bb7f58‑99bb‑4381‑ac98‑300cceb128fe](#) |
|
||||
| P3 | 合并 **admin bundle 代码分块**(`manualChunks`)到主分支并发布新版本。 | 已在 `dev/qa-polish` 分支完成,需要 QA 验收。 | [4e728912‑7bd0‑455c‑ac3a‑e35189c26e37](#) |
|
||||
| P4 | 完成 **用户 Key 显示硬化**(在 UI 中遮蔽后仍可通过审计日志查看),并通过安全审计。 | 代码已在同一分支实现,等待安全团队确认。 | [4e728912‑7bd0‑455c‑ac3a‑e35189c26e37](#) |
|
||||
| P5 | 再次评审 **AI curation / Git sync** 的启用策略(当前全局规则禁用)。如业务需要,可在全局规则 `3f91189b‑11a1‑45bb‑8357‑4f413dc1609d` 中放行。 | 决策待业务方提出需求。 | [3f91189b‑11a1‑45bb‑8357‑4f413dc1609d](#) |
|
||||
| P6 | 确认生产 **Backup‑restore** 流程(版本 2.0.0)在紧急恢复场景下能够完整恢复 DB、存储及清单。 | 需要一次完整的演练。 | [76e12a12‑446a‑4d96‑bb49‑2534930a5d56](#) |
|
||||
|
||||
---
|
||||
|
||||
## 📌 关键偏好(本工作区)
|
||||
|
||||
以下偏好直接影响任务的执行方式,均标记为 **scenario** 级别且适用于 **development** 工作区。
|
||||
|
||||
| 编号 | 偏好声明 | 来源 | 级别 | 备注 |
|
||||
|------|----------|------|------|------|
|
||||
| P‑01 | 开发应遵循 **KISS & YAGNI** 原则,复用已有框架,避免投机抽象。 | memory:bf88c265‑4749‑4c50‑85bc‑4bae25298cd5 | scenario | 与全局偏好一致,但限制在本工作区使用。 |
|
||||
| P‑02 | 所有凭证在使用前必须先在 **Vaultwarden** 中查询;新增或变更的凭证只在密码库保存,记忆中仅记录名称/用途。 | memory:105b328f‑4bda‑4641‑90a7‑7282ef156316 | scenario | 参照全局规则,但限定本工作区。 |
|
||||
| P‑03 | 项目记忆仅保存在 **MemRelay**,本地 `aidocs/` 仅用于临时导出后立即删除。 | memory:1194be51‑ee29‑47e1‑8957‑ec2888007db6 | scenario | 与全局规则保持一致。 |
|
||||
| P‑04 | 默认沟通语言为 **中文**(包括代码注释、文档、提交信息)。 | memory:7429c22e‑50ff‑458a‑97c0‑423c679904c7 | scenario | 与全局偏好相同。 |
|
||||
| P‑05 | 禁用 **AI 驱动的记忆同步与 Git 自动化**,仅在显式开启时才启用。 | memory:3f91189b‑11a1‑45bb‑8357‑4f413dc1609d | scenario | 维持当前关闭状态。 |
|
||||
| P‑06 | 开发、提交遵循 **type: 中文描述** 的 commit 格式,分支策略为 `dev`(长期开发) 与 `main`(生产)。 | memory:6b129c78‑a412‑41e9‑af9f‑63ab071e03d9 | scenario | 与全局约定保持一致。 |
|
||||
| P‑07 | 生产部署采用单一 `.env` 配置文件,所有业务可调参数存于 `system_setting` 表;其他配置文件被忽略。 | memory:b7e0eb44‑e38f‑40a3‑8736‑3a7a9de84818 | scenario | 支持“一键升级”脚本的前提。 |
|
||||
| P‑08 | 本地开发约束:使用 PNPM 10.28.0、Node ≥ 20.11.1,使用 `scripts/dev.py`,在构建或升级前必须停止 `nest` 进程。 | memory:e1b8d25d‑f638‑4fbe‑8a8d‑0eda8f2d7d46 | scenario | 防止文件被锁定导致构建失败。 |
|
||||
| P‑09 | 代码提交前需 **清理临时文件、日志、密码文件**,并更新对应的 MemRelay 记忆条目。 | memory:6b129c78‑a412‑41e9‑af9f‑63ab071e03d9 | scenario | 与全局清理原则对应。 |
|
||||
|
||||
---
|
||||
|
||||
## 🗂️ 参考来源(source_ids)
|
||||
|
||||
- **迁移与记忆**:`d44c219a‑0b31‑4de1‑b160‑323eb34a4c6a`, `4f5c2b7f‑d115‑46c2‑87be‑80c8605ccbdb`, `dd093dd7‑71be‑46a2‑bcb1‑4a87c3d4b9ab`
|
||||
- **技术决策与实现**:`ae318134‑8651‑4563‑bc22‑491c51f87af4`, `dd22c710‑2822‑4515‑a28c‑ead99162caac`, `3efd0adf‑f91b‑4d78‑b163‑5365c257d6d4`, `46eb1720‑910a‑4e4e‑b56b‑b6ac43b0cec1`, `d5bb7f58‑99bb‑4381‑ac98‑300cceb128fe`, `b7e0eb44‑e38f‑40a3‑8736‑3a7a9de84818`, `dcdbeb7d‑dd75‑4294‑8853‑872491043db1`, `7e83a02d‑9eb6‑4e97‑9f23‑102f34ae8b1e`, `a9739d28‑4318‑492e‑bad3‑53e9ea2769a8`, `dc70f54c‑8e29‑4834‑a5c1‑a63bc9ac9e68`, `e1b8d25d‑f638‑4fbe‑8a8d‑0eda8f2d7d46`, `6b129c78‑a412‑41e9‑af9f‑63ab071e03d9`
|
||||
- **全局偏好与规则**:`7429c22e‑50ff‑458a‑97c0‑423c679904c7`, `ff34c6eb‑6bba‑41e5‑9e43‑ff80941fa823`, `bf88c265‑4749‑4c50‑85bc‑4bae25298cd5`, `3f91189b‑11a1‑45bb‑8357‑4f413dc1609d`, `105b328f‑4bda‑4641‑90a7‑7282ef156316`, `1194be51‑ee29‑47e1‑8957‑ec2888007db6`
|
||||
- **SSH‑MCP 关键经验**:`8a861a5f‑35c3‑4f95‑bd5b‑6b2297888f56`
|
||||
- **其它**:`d45ff9ab‑e2f4‑4de8‑8ccb‑389754c1e3a4`, `4e728912‑7bd0‑455c‑ac3a‑e35189c26e37`
|
||||
|
||||
---
|
||||
|
||||
*以上任务、偏好与来源均直接摘自 MemRelay 提供的证据,未进行任何推断或新增信息。*
|
||||
@@ -0,0 +1,172 @@
|
||||
---
|
||||
title: ArtVeris 项目概览
|
||||
type: curated
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/curated/art-veris-项目概览
|
||||
stable_id: cec86599-c3a8-4407-8bcd-f90e824aa53b
|
||||
scope: project
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
workspace_type: development
|
||||
usage_profile_id: null
|
||||
preference_context: development
|
||||
document_type: overview
|
||||
revision: 1
|
||||
source_memory_ids:
|
||||
- 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- 2fafa191-d208-41e4-9f7b-ce5a633c886b
|
||||
- 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
- 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
- a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
- ae318134-8651-4563-bc22-491c51f87af4
|
||||
- b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
- d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
- dd22c710-2822-4515-a28c-ead99162caac
|
||||
- e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
source_checkpoint_ids:
|
||||
- 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
- d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
source_file_ids:
|
||||
- 07583531-4b5a-4826-ad88-be4c3f16ba9d
|
||||
- 2749e8f9-a45f-43b0-a818-143ae532db24
|
||||
- 2977cf7c-7494-4b28-a8c6-2fbc6261c810
|
||||
- 4e728912-7bd0-455c-ac3a-e35189c26e37
|
||||
- 8f5b3f27-3ed1-4bf1-97ef-cb130f238161
|
||||
source_git_commit: d7c6368
|
||||
source_git_commits:
|
||||
- d7c6368
|
||||
source_agent_sync_ids:
|
||||
- artveris-curation-2026-09-03-migration
|
||||
model_connection: Sub2API
|
||||
model_name: openai/gpt-oss-120b
|
||||
source_count: 42
|
||||
source_revisions:
|
||||
memory:76e12a12-446a-4d96-bb49-2534930a5d56: '1'
|
||||
memory:67a86e88-a750-4cd8-9650-c1b7cfbf22b9: '2'
|
||||
memory:2939ce96-a6f6-418a-9a70-568980dbdc2a: '1'
|
||||
memory:7737eaaf-441e-476e-aea0-42a4d13ae245: '1'
|
||||
memory:ae318134-8651-4563-bc22-491c51f87af4: '1'
|
||||
memory:dd22c710-2822-4515-a28c-ead99162caac: '1'
|
||||
memory:3efd0adf-f91b-4d78-b163-5365c257d6d4: '1'
|
||||
memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1: '1'
|
||||
memory:d5bb7f58-99bb-4381-ac98-300cceb128fe: '1'
|
||||
memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818: '1'
|
||||
memory:dcdbeb7d-dd75-4294-8853-872491043db1: '1'
|
||||
memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e: '1'
|
||||
memory:a9739d28-4318-492e-bad3-53e9ea2769a8: '1'
|
||||
memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68: '1'
|
||||
memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46: '1'
|
||||
memory:6b129c78-a412-41e9-af9f-63ab071e03d9: '1'
|
||||
source_dispositions:
|
||||
processed: 42
|
||||
unchanged: 0
|
||||
unsupported: 0
|
||||
skipped: 0
|
||||
cited_source_ids:
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- memory:67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- memory:2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- memory:7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
job_cited_source_ids:
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- memory:67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- memory:2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- memory:7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
conflicts: []
|
||||
supersedes: []
|
||||
preferences: []
|
||||
source_cursor: 359
|
||||
source_hash: 06340ad0d2d916308bcf502ff22c22461eeb2afaaeea56df8687dae4fdb0f11d
|
||||
prompt_version: 2026-08-12.3
|
||||
schema_version: '3'
|
||||
curation_job_id: 7900a00f-2876-4e05-bb12-7beb6e014a93
|
||||
created_at: '2026-09-03T04:21:14.903935+00:00'
|
||||
updated_at: '2026-09-03T04:21:14.904560+00:00'
|
||||
tags:
|
||||
- 项目概览
|
||||
- 架构
|
||||
- 技术栈
|
||||
---
|
||||
|
||||
## 项目目标
|
||||
- 构建“一物一码”溯源平台,面向艺术品的全链路追踪与防伪。
|
||||
- 采用 **Artwork → Batch → TraceCode** 的数据模型,每个实体对应唯一的 12 位数字短码。
|
||||
|
||||
## 核心技术栈
|
||||
- **后端**:NestJS 11、Node 24、Prisma(MySQL 5.7)
|
||||
- **前端**:Vue 3、Vite 6、ECharts 6、Pinia
|
||||
- **部署**:单体 Node 服务 + PM2(可选 Docker),使用 `scripts/upgrade-remote.ps1` 实现一键远程升级。
|
||||
- **链上**:天河链(TiChain)仅 **上传 + 确认**,不涉及二次转账、元数据上链。
|
||||
|
||||
## 主要里程碑
|
||||
| 日期 | 关键事件 |
|
||||
|------|----------|
|
||||
| 2026‑09‑03 03:26 UTC | 项目在 GitHub/Gitea 创建(`dev` 分支领先 `main`) |
|
||||
| 2026‑09‑03 03:55 UTC | 删除本地 `aidocs/`,迁移所有记忆到 MemRelay |
|
||||
| 2026‑09‑03 04:01 UTC | 完成迁移检查点:文档上传、PM2 自动启动修复、`.gitignore` 更新 |
|
||||
| 2026‑07‑01 〜 2026‑07‑16 | 完成核心模型、批量导入、天河链集成、状态机、备份恢复等功能 |
|
||||
| 2026‑07‑10 | 确认天河链接入范围(仅上传、发布、查询) |
|
||||
|
||||
## 系统组成
|
||||
- **业务层**:`apps/api` 包含公共接口、区块链、存储、备份、安装向导等模块。
|
||||
- **管理后台**:`/admin` SPA,提供模型管理、系统设置、日志审计等功能。
|
||||
- **客户端**:`/trace` SPA,展示艺术品信息及链上溯源链接。
|
||||
- **运维**:生产服务器 8.134.255.136(Alinux 8、Baota),PM2 名为 `server`,域名 https://art.qclh.xyz。
|
||||
|
||||
## 关键约束
|
||||
- **短码规则**:12 位数字(6 位随机 + 6 位全局递增),全局序列不可回滚。
|
||||
- **链上/出库解耦**:链上记录与实际出库记录独立,可单独上链或出库。
|
||||
- **配置唯一**:全局仅使用单一 `.env`,业务可通过 `system_setting` 表覆盖。
|
||||
- **凭证管理**:UserKey 明文存库,AppKey 加密;所有新凭证仅写入密码库,记忆中只保留名称/用途。
|
||||
|
||||
## 当前文档来源
|
||||
- 本概览引用的事实、决策与经验主要来源于以下记忆条目:
|
||||
- **memory:76e12a12-446a-4d96-bb49-2534930a5d56**(ZIP 导入契约)
|
||||
- **memory:67a86e88-a750-4cd8-9650-c1b7cfbf22b9**(前端业务坑)
|
||||
- **memory:2939ce96-a6f6-418a-9a70-568980dbdc2a**(生产部署坑)
|
||||
- **memory:7737eaaf-441e-476e-aea0-42a4d13ae245**(Windows 本地开发坑)
|
||||
- **memory:ae318134-8651-4563-bc22-491c51f87af4**(关键技术选型)
|
||||
- **memory:dd22c710-2822-4515-a28c-ead99162caac**(天河链接入范围)
|
||||
- **memory:3efd0adf-f91b-4d78-b163-5365c257d6d4**(C 端模块化布局契约)
|
||||
- **memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1**(天河链集成现状)
|
||||
- **memory:d5bb7f58-99bb-4381-ac98-300cceb128fe**(生产拓扑)
|
||||
- **memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818**(部署契约)
|
||||
- **memory:dcdbeb7d-dd75-4294-8853-872491043db1**(关键代码地图)
|
||||
- **memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e**(核心数据模型)
|
||||
- **memory:a9739d28-4318-492e-bad3-53e9ea2769a8**(出库/上链不变量)
|
||||
- **memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68**(数据持久化红线)
|
||||
- **memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46**(构建与本地开发硬约束)
|
||||
- **memory:6b129c78-a412-41e9-af9f-63ab071e03d9**(开发流程与提交规范)
|
||||
@@ -0,0 +1,139 @@
|
||||
---
|
||||
title: 关键技术决策记录
|
||||
type: curated
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/curated/关键技术决策记录
|
||||
stable_id: dc8f8ea1-5790-4480-a7dc-490e45bc506f
|
||||
scope: project
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
workspace_type: development
|
||||
usage_profile_id: null
|
||||
preference_context: development
|
||||
document_type: decisions
|
||||
revision: 1
|
||||
source_memory_ids:
|
||||
- 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- 2fafa191-d208-41e4-9f7b-ce5a633c886b
|
||||
- 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
- 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
- a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
- ae318134-8651-4563-bc22-491c51f87af4
|
||||
- b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
- d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
- dd22c710-2822-4515-a28c-ead99162caac
|
||||
- e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
source_checkpoint_ids:
|
||||
- 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
- d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
source_file_ids:
|
||||
- 07583531-4b5a-4826-ad88-be4c3f16ba9d
|
||||
- 2749e8f9-a45f-43b0-a818-143ae532db24
|
||||
- 2977cf7c-7494-4b28-a8c6-2fbc6261c810
|
||||
- 4e728912-7bd0-455c-ac3a-e35189c26e37
|
||||
- 8f5b3f27-3ed1-4bf1-97ef-cb130f238161
|
||||
source_git_commit: d7c6368
|
||||
source_git_commits:
|
||||
- d7c6368
|
||||
source_agent_sync_ids:
|
||||
- artveris-curation-2026-09-03-migration
|
||||
model_connection: Sub2API
|
||||
model_name: openai/gpt-oss-120b
|
||||
source_count: 42
|
||||
source_revisions:
|
||||
memory:ae318134-8651-4563-bc22-491c51f87af4: '1'
|
||||
memory:dd22c710-2822-4515-a28c-ead99162caac: '1'
|
||||
memory:a9739d28-4318-492e-bad3-53e9ea2769a8: '1'
|
||||
memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68: '1'
|
||||
memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46: '1'
|
||||
memory:6b129c78-a412-41e9-af9f-63ab071e03d9: '1'
|
||||
source_dispositions:
|
||||
processed: 42
|
||||
unchanged: 0
|
||||
unsupported: 0
|
||||
skipped: 0
|
||||
cited_source_ids:
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
job_cited_source_ids:
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
conflicts: []
|
||||
supersedes: []
|
||||
preferences: []
|
||||
source_cursor: 359
|
||||
source_hash: 06340ad0d2d916308bcf502ff22c22461eeb2afaaeea56df8687dae4fdb0f11d
|
||||
prompt_version: 2026-08-12.3
|
||||
schema_version: '3'
|
||||
curation_job_id: 7900a00f-2876-4e05-bb12-7beb6e014a93
|
||||
created_at: '2026-09-03T04:21:16.235463+00:00'
|
||||
updated_at: '2026-09-03T04:21:16.236168+00:00'
|
||||
tags:
|
||||
- 决策
|
||||
- 技术选型
|
||||
- 链上范围
|
||||
- 规范
|
||||
---
|
||||
|
||||
### 1. 技术选型决策 (memory:ae318134-8651-4563-bc22-491c51f87af4)
|
||||
- **UserKey** 明文保存,便于系统迁移后恢复;**AppKey** 加密存储。
|
||||
- 全局唯一 `.env` 配置文件,取代旧 `config/` JSON。
|
||||
- 安装向导合并至 admin 模块,取消独立 `apps/install`。
|
||||
- 核心部署采用单节点 Node 服务 + 可选 Docker/SSH,避免多容器复杂性。
|
||||
- 采用动态追踪代码链接、无状态 TOTP 预览令牌、防篡改模块布局、Photo‑Swipe v5 UI。
|
||||
- 明确 **不构建** NFC、多组织隔离、主动告警、C‑端 skeleton screens、IP/UA 区域解析等功能。
|
||||
|
||||
### 2. 天河链接入范围决策 (memory:dd22c710-2822-4515-a28c-ead99162caac)
|
||||
- **仅上传 + 发布** 链上流程(无二次转移、烧毁)。
|
||||
- 链上不存放媒体或摘要,所有媒体均离线存储。
|
||||
- 统一使用单一平台钱包 `artveris-platform`。
|
||||
- 计费方式基于 API 调用次数,删除功能不支持。
|
||||
- C 端展示仅提供区块浏览器交易详情链接,无 on‑chain 销售状态标记。
|
||||
|
||||
### 3. 出库/上链不变量与审计约束 (memory:a9739d28-4318-492e-bad3-53e9ea2769a8)
|
||||
1. 链上记录与出库记录 **解耦**。
|
||||
2. 每个追溯码最多拥有一条 `OutboundRecord`(时间必填,可修改)。
|
||||
3. 单次批量发布最多 **5 000** `productId`,按艺术品分组。
|
||||
4. 已存在的码若状态为 `FAILED` 方可重复 mint。
|
||||
5. `UNKNOWN` 状态必须保留原始参数,仅管理员可强制重试。
|
||||
6. 审计流:修订创建快照,只有批准的修订才替换线上数据;超级管理员操作自动批准。
|
||||
|
||||
### 4. 数据持久化红线 (memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68)
|
||||
- 升级过程 **禁止** 覆盖 `.env`、`storage/`、`backups/`、数据库。
|
||||
- Prisma 基线迁移 `20260715000000_init`,全局 `trace_code_sequence.next_seq` 不可回滚,最高 999 999。
|
||||
- 禁止删除存活的 trace code、ONCHAIN/UNKNOWN 状态码。
|
||||
- 媒体仅通过键存储,不允许 SVG。
|
||||
- 短码 URL 动态生成 `{{clientBaseUrl}}/#/trace/{{shortCode}}`。
|
||||
|
||||
### 5. 构建与本地开发硬约束 (memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46)
|
||||
- PNPM 10.28.0、Node ≥20.11.1(推荐 24 LTS)。
|
||||
- 使用 `scripts/dev.py` 进行本地环境搭建,若缺少 `.env` 自动进入安装向导。
|
||||
- 在运行 `nest build` 或升级脚本前必须 **停止** 开发 API。
|
||||
- Windows PowerShell 中 `&&` 不被支持,需要分行或使用 `;`。
|
||||
- 严禁提交 Secrets,`.env`、`docs/系统测试信息.md`、`.deploy/` 必须在 `.gitignore` 中。
|
||||
|
||||
### 6. 开发与提交规范 (memory:6b129c78-a412-41e9-af9f-63ab071e03d9)
|
||||
- 使用中文进行所有交流和提交信息。
|
||||
- 开发环境统一为 Windows + PowerShell + WSL2。
|
||||
- 采用 YAGNI/KISS 原则,复用已有框架。
|
||||
- 提交顺序:**清理 → 记忆更新 → 文档 → .gitignore → commit**。
|
||||
- Commit message 格式 `type: 中文描述`(type 如 feat、fix、refactor 等)。
|
||||
- 分支策略:`main`(生产) 与 `dev`(长期开发),两者均同步至 Gitea 与 GitHub。
|
||||
- 许可证采用 PolyForm Strict 1.0.0。
|
||||
@@ -0,0 +1,133 @@
|
||||
---
|
||||
title: 当前系统状态概览
|
||||
type: curated
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/curated/当前系统状态概览
|
||||
stable_id: 065abeda-7d90-47c2-b883-e4b1b439f71d
|
||||
scope: project
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
workspace_type: development
|
||||
usage_profile_id: null
|
||||
preference_context: development
|
||||
document_type: current_state
|
||||
revision: 1
|
||||
source_memory_ids:
|
||||
- 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- 2fafa191-d208-41e4-9f7b-ce5a633c886b
|
||||
- 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
- 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
- a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
- ae318134-8651-4563-bc22-491c51f87af4
|
||||
- b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
- d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
- dd22c710-2822-4515-a28c-ead99162caac
|
||||
- e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
source_checkpoint_ids:
|
||||
- 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
- d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
source_file_ids:
|
||||
- 07583531-4b5a-4826-ad88-be4c3f16ba9d
|
||||
- 2749e8f9-a45f-43b0-a818-143ae532db24
|
||||
- 2977cf7c-7494-4b28-a8c6-2fbc6261c810
|
||||
- 4e728912-7bd0-455c-ac3a-e35189c26e37
|
||||
- 8f5b3f27-3ed1-4bf1-97ef-cb130f238161
|
||||
source_git_commit: d7c6368
|
||||
source_git_commits:
|
||||
- d7c6368
|
||||
source_agent_sync_ids:
|
||||
- artveris-curation-2026-09-03-migration
|
||||
model_connection: Sub2API
|
||||
model_name: openai/gpt-oss-120b
|
||||
source_count: 42
|
||||
source_revisions:
|
||||
memory:d5bb7f58-99bb-4381-ac98-300cceb128fe: '1'
|
||||
memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818: '1'
|
||||
memory:dcdbeb7d-dd75-4294-8853-872491043db1: '1'
|
||||
memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e: '1'
|
||||
memory:3efd0adf-f91b-4d78-b163-5365c257d6d4: '1'
|
||||
memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1: '1'
|
||||
memory:ae318134-8651-4563-bc22-491c51f87af4: '1'
|
||||
memory:dd22c710-2822-4515-a28c-ead99162caac: '1'
|
||||
memory:76e12a12-446a-4d96-bb49-2534930a5d56: '1'
|
||||
source_dispositions:
|
||||
processed: 42
|
||||
unchanged: 0
|
||||
unsupported: 0
|
||||
skipped: 0
|
||||
cited_source_ids:
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
job_cited_source_ids:
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
conflicts: []
|
||||
supersedes: []
|
||||
preferences: []
|
||||
source_cursor: 359
|
||||
source_hash: 06340ad0d2d916308bcf502ff22c22461eeb2afaaeea56df8687dae4fdb0f11d
|
||||
prompt_version: 2026-08-12.3
|
||||
schema_version: '3'
|
||||
curation_job_id: 7900a00f-2876-4e05-bb12-7beb6e014a93
|
||||
created_at: '2026-09-03T04:21:18.223735+00:00'
|
||||
updated_at: '2026-09-03T04:21:18.224491+00:00'
|
||||
tags:
|
||||
- 当前状态
|
||||
- 部署
|
||||
- 功能进度
|
||||
---
|
||||
|
||||
### 环境与部署
|
||||
- **生产服务器**:8.134.255.136(Alinux 8、宝塔面板),Node 24,PNPM via Corepack,MySQL 5.7,Redis。
|
||||
- **部署目录**:`/www/wwwroot/artveris`,PM2 进程名 `server`,API 端口 3000,域名 https://art.qclh.xyz。
|
||||
- **一键升级**:`scripts/upgrade-remote.ps1` 负责备份 DB、停止 PM2、执行 `upgrade.sh`、重启并进行健康检查。SSH 私钥已存入密码库。
|
||||
- **配置**:仅有单一 `.env`,业务可通过 `system_setting` 表覆盖。
|
||||
|
||||
### 功能实现进度
|
||||
| 功能 | 状态 |
|
||||
|------|------|
|
||||
| 数据模型(Artwork/Batch/TraceCode) | 已完成,唯一约束、序列号不可回滚 |
|
||||
| 短码生成(12 位) | 已实现,随机 6 位 + 全局递增 6 位 |
|
||||
| 天河链集成(上传 + 发布 + 查询) | 功能可用,已在测试环境完成全部用例;生产钱包待注册后切换 |
|
||||
| 批量 ZIP 导入 & 备份恢复 | 采用流式解压,大小限制 100 MB/文件,已通过全量测试 |
|
||||
| 预览 TOTP Token | 已实现,10 分钟窗口,统计不计入查询次数 |
|
||||
| UI(Admin & Client) | 基本模块已上线,支持模块化编排、媒体存储层级、动态短码链接 |
|
||||
| 监控/日志 | OperationLogInterceptor 对敏感字段脱敏,日志写入 MySQL |
|
||||
| 安全措施 | Helmet、CSP、速率限制、Redis 负缓存、角色 RBAC(SUPER_ADMIN、OPERATOR、AUDITOR、VIEWER) |
|
||||
|
||||
### 已解决问题
|
||||
- PM2 自动启动故障已修复(`pm2 startup` + `pm2 save`)。
|
||||
- 本地开发 `EADDRINUSE` 与进程残留问题通过 `flock` 与清理脚本解决。
|
||||
- 构建时的 `.env` 冲突、Git 提交规范、`aidocs/` 清理已统一流程。
|
||||
- 天河链确认循环(PENDING → SUBMITTING → CONFIRMING → ONCHAIN)及 `UNKNOWN` 状态处理已实现。
|
||||
- ZIP 导入的内存泄漏已改为流式处理,最大 10 k 行、64 列、100 MB 限制。
|
||||
|
||||
### 待办事项
|
||||
- **合并** `aidocs‑cleanup` 与 `PM2‑fix` 提交到 `main`(需用户确认)。
|
||||
- **生产钱包**:在生产环境创建天河链平台钱包并更新 `AppID/AppKey`,完成全链路验证后上线。
|
||||
- **Admin bundle 分割**:手动 `manualChunks` 已在 `dev/qa-polish` 分支实现,待合并到主线。
|
||||
- **UserKey UI 硬化**:已在 polishing 分支遮蔽显示,需安全审计后发布。
|
||||
- **AI 记忆同步**:依据全局规则保持禁用,后续可按需求开启。
|
||||
@@ -0,0 +1,174 @@
|
||||
---
|
||||
title: 项目时间线(截至 2026‑09‑03)
|
||||
type: curated
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/curated/项目时间线截至-2026-09-03
|
||||
stable_id: 9772b5bd-ebc9-44b7-a390-928f92f2f76d
|
||||
scope: project
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
workspace_type: development
|
||||
usage_profile_id: null
|
||||
preference_context: development
|
||||
document_type: timeline
|
||||
revision: 1
|
||||
source_memory_ids:
|
||||
- 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
- 2fafa191-d208-41e4-9f7b-ce5a633c886b
|
||||
- 3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
- 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
- 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- 7737eaaf-441e-476e-aea0-42a4d13ae245
|
||||
- 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
- a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
- ae318134-8651-4563-bc22-491c51f87af4
|
||||
- b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
- d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
- dd22c710-2822-4515-a28c-ead99162caac
|
||||
- e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
source_checkpoint_ids:
|
||||
- 4f5c2b7f-d115-46c2-87be-80c8605ccbdb
|
||||
- d45ff9ab-e2f4-4de8-8ccb-389754c1e3a4
|
||||
source_file_ids:
|
||||
- 07583531-4b5a-4826-ad88-be4c3f16ba9d
|
||||
- 2749e8f9-a45f-43b0-a818-143ae532db24
|
||||
- 2977cf7c-7494-4b28-a8c6-2fbc6261c810
|
||||
- 4e728912-7bd0-455c-ac3a-e35189c26e37
|
||||
- 8f5b3f27-3ed1-4bf1-97ef-cb130f238161
|
||||
source_git_commit: d7c6368
|
||||
source_git_commits:
|
||||
- d7c6368
|
||||
source_agent_sync_ids:
|
||||
- artveris-curation-2026-09-03-migration
|
||||
model_connection: Sub2API
|
||||
model_name: openai/gpt-oss-120b
|
||||
source_count: 42
|
||||
source_revisions:
|
||||
memory:76e12a12-446a-4d96-bb49-2534930a5d56: '1'
|
||||
memory:ae318134-8651-4563-bc22-491c51f87af4: '1'
|
||||
memory:dd22c710-2822-4515-a28c-ead99162caac: '1'
|
||||
memory:3efd0adf-f91b-4d78-b163-5365c257d6d4: '1'
|
||||
memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1: '1'
|
||||
memory:d5bb7f58-99bb-4381-ac98-300cceb128fe: '1'
|
||||
memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818: '1'
|
||||
memory:dcdbeb7d-dd75-4294-8853-872491043db1: '1'
|
||||
memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e: '1'
|
||||
memory:a9739d28-4318-492e-bad3-53e9ea2769a8: '1'
|
||||
memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68: '1'
|
||||
memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46: '1'
|
||||
memory:6b129c78-a412-41e9-af9f-63ab071e03d9: '1'
|
||||
source_dispositions:
|
||||
processed: 42
|
||||
unchanged: 0
|
||||
unsupported: 0
|
||||
skipped: 0
|
||||
cited_source_ids:
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
job_cited_source_ids:
|
||||
- memory:76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
- memory:ae318134-8651-4563-bc22-491c51f87af4
|
||||
- memory:dd22c710-2822-4515-a28c-ead99162caac
|
||||
- memory:3efd0adf-f91b-4d78-b163-5365c257d6d4
|
||||
- memory:46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
- memory:d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
- memory:b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
- memory:dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
- memory:7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
- memory:a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
- memory:dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
- memory:e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
- memory:6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
conflicts: []
|
||||
supersedes: []
|
||||
preferences: []
|
||||
source_cursor: 359
|
||||
source_hash: 06340ad0d2d916308bcf502ff22c22461eeb2afaaeea56df8687dae4fdb0f11d
|
||||
prompt_version: 2026-08-12.3
|
||||
schema_version: '3'
|
||||
curation_job_id: 7900a00f-2876-4e05-bb12-7beb6e014a93
|
||||
created_at: '2026-09-03T04:21:21.744728+00:00'
|
||||
updated_at: '2026-09-03T04:21:21.745478+00:00'
|
||||
tags:
|
||||
- 时间线
|
||||
- 里程碑
|
||||
---
|
||||
|
||||
### 2026‑07‑01 – 2026‑07‑16
|
||||
- 完成核心模型搭建、批量导入、天河链上传与确认、状态机实现、备份恢复机制。
|
||||
- 解决并发激活、备份时删除表、日志脱敏、PowerShell JSON、Docker 代理等技术难点。
|
||||
|
||||
### 2026‑07‑09 – 2026‑07‑10
|
||||
- 通过代码审查,完成天河链集成测试,确认 `方案 B(上传 → 发布 → 确认)` 为最终链上方案。
|
||||
- 修复批量提交、短码生成、确认循环等关键缺陷。
|
||||
|
||||
### 2026‑08‑01 – 2026‑08‑08
|
||||
- 制定全局开发偏好、原则(语言中文、MemRelay‑only 记忆、KISS/YAGNI 等)。
|
||||
- 完成 Git 提交规范、密码库使用规则、AI 记忆同步默认关闭。
|
||||
|
||||
### 2026‑09‑03 03:26 UTC
|
||||
- 项目在 GitHub/Gitea 创建,`dev` 分支领先 `main`(文档提交一次)。
|
||||
|
||||
### 2026‑09‑03 03:55 UTC
|
||||
- 删除本地 `aidocs/`,同步至 MemRelay,标记为 **memory:2fafa191‑d208‑41e4‑9f7b‑ce5a633c886b**(已删除,无需再引用)。
|
||||
|
||||
### 2026‑09‑03 03:54 UTC (checkpoint d45ff9ab‑e2f4‑4de8‑8ccb‑389754c1e3a4)
|
||||
- 记录迁移基线,版本 `dev` 领先 `main` 一次文档提交。
|
||||
- 待合并的 `aidocs‑cleanup` 与 `PM2‑fix` 提交标记为 **pending**。
|
||||
|
||||
### 2026‑09‑03 04:01 UTC (checkpoint 4f5c2b7f‑d115‑46c2‑87be‑80c8605ccbdb)
|
||||
- 完成迁移检查点:
|
||||
- `dev` 与 `main` 均指向 commit `ca2c7fd`(仅文档)。
|
||||
- 生产服务器 8.134.255.136 上的 “客户端作品模块化编排” 版本已启动,PM2 自动启动修复。
|
||||
- 本地 `aidocs/` 被 `.gitignore`,对应文档已上传至 MemRelay `artveris/docs/`。
|
||||
- 下一步指导:阅读 `docs/项目交接文档.md`,在升级前停止本地 `nest start --watch` 并使用 `scripts/upgrade-remote.ps1`。
|
||||
|
||||
### 2026‑09‑03 03:43 UTC (decision ae318134‑8651‑4563‑bc22‑491c51f87af4)
|
||||
- 确定关键技术选型(UserKey 明文、单 `.env`、单服务部署等),并列出不实现的功能。
|
||||
|
||||
### 2026‑09‑03 03:42 UTC (decision dd22c710‑2822‑4515‑a28c‑ead99162caac)
|
||||
- 确认天河链接入范围,仅支持上传、发布、查询,不涉及二次转账、元数据或摘要上链。
|
||||
|
||||
### 2026‑09‑03 03:41 UTC (fact 3efd0adf‑f91b‑4d78‑b163‑5365c257d6d4)
|
||||
- 发布 C‑端模块化布局契约,定义媒体层级、模块上限、默认顺序等。
|
||||
|
||||
### 2026‑09‑03 03:39 UTC (fact 46eb1720‑910a‑4e4e‑b56b‑b6ac43b0cec1)
|
||||
- 天河链集成现状:使用 `mock|tianhe` 驱动,测试/生产 API 地址,单次 `publish` 为一次性操作,返回 `status "0x0"` 为成功。
|
||||
|
||||
### 2026‑09‑03 03:38 UTC (fact d5bb7f58‑99bb‑4381‑ac98‑300cceb128fe)
|
||||
- 记录生产拓扑与一键升级脚本细节。
|
||||
|
||||
### 2026‑09‑03 03:37 UTC (fact b7e0eb44‑e38f‑40a3‑8736‑3a7a9de84818)
|
||||
- 明确部署契约:单 `.env`、系统设置覆盖、三种部署形态、RBAC、速率限制、TOTP 预览 token。
|
||||
|
||||
### 2026‑09‑03 03:36 UTC (facts dcdbeb7d‑dd75‑4294‑8853‑872491043db1, 7e83a02d‑9eb6‑4e97‑9f23‑102f34ae8b1e)
|
||||
- 代码地图与核心数据模型详细说明。
|
||||
|
||||
### 2026‑09‑03 03:33 UTC (rule a9739d28‑4318‑492e‑bad3‑53e9ea2769a8)
|
||||
- 发布出库/上链不变量与审计约束。
|
||||
|
||||
### 2026‑09‑03 03:32 UTC (rule dc70f54c‑8e29‑4834‑a5c1‑a63bc9ac9e68)
|
||||
- 数据持久化红线:禁止覆盖 `.env`、`storage/`、`backups/`、数据库,序列号不可回滚。
|
||||
|
||||
### 2026‑09‑03 03:31 UTC (rule e1b8d25d‑f638‑4fbe‑8a8d‑0eda8f2d7d46)
|
||||
- 构建与本地开发硬约束(PNPM、Node 版本、脚本使用、Git 忽略规则)。
|
||||
|
||||
### 2026‑09‑03 03:30 UTC (rule 6b129c78‑a412‑41e9‑af9f‑63ab071e03d9)
|
||||
- 开发流程与提交规范(中文沟通、PowerShell 开发、YAGNI/KISS、提交顺序、分支策略、许可证)。
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: 关键代码地图
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/关键代码地图
|
||||
stable_id: dcdbeb7d-dd75-4294-8853-872491043db1
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-03
|
||||
created_at: '2026-09-03T03:36:59.984242+00:00'
|
||||
updated_at: '2026-09-03T03:36:59.984242+00:00'
|
||||
tags:
|
||||
- code-map
|
||||
- navigation
|
||||
---
|
||||
|
||||
apps/api/src/
|
||||
- `public-trace/` 公开溯源:trace(激活/计数/日志)+ preview(零副作用)+ `/t/:code` 302;`mapTraceLayout` 输出已审核布局(过滤隐藏模块、key→URL)。
|
||||
- `trace-code/` 生码/批次/分组/导出 ZIP/二维码/预览令牌;`trace-code-generator.service.ts` 随机六码+全局流水。
|
||||
- `artwork/` 建档+审核快照流(`applySnapshot`、`hasSnapshotChanged`),媒体归位 `relocateArtworkMedia`(含 `relocateTraceLayoutMedia`)。
|
||||
- `outbound/` OutboundRecord/OutboundImage、单件编辑、异步批量登记、图片分页、ZIP 高级导入(`outbound-import.util.ts` 边界)。
|
||||
- `blockchain/` `blockchain.service.ts`(动态 mock/tianhe)、`tianhe.provider.ts`(publish/confirm/registerUser/updateUserKey,带脱敏日志)、原生批量发行分片、UNKNOWN 恢复、`attestation.service.ts`。
|
||||
- `settings/` 动态配置中心、密钥加密/掩码/揭示(POST reveal 带审计)、天河身份注册/校验/轮换。
|
||||
- `storage/` Local/OSS(S3) 驱动、`relocateMedia` 归位、迁移/切换接口;`getUrl` key→URL。
|
||||
- `backup/` 创建/下载/恢复(预校验+自动快照+CAS);`common/utils/preview-token.util.ts` 类 TOTP;`common/utils/bigint.util.ts` `parseBigId`。
|
||||
- `config/runtime-config.ts`(`envFilePath`/`preloadRuntimeEnv`/`isInstallMode`)、`install/`(安装向导写 .env+迁移+建超管)、`operation-log/`(写操作拦截器)、`certificate/`(水印队列)。
|
||||
- `assets/templates/outbound-import-template.zip` 静态导入模板。
|
||||
|
||||
packages/shared/src/:`enums.ts`、`constants.ts`(`SHORT_CODE_LENGTH=12`、`TRACE_CODE_PATTERN`)、`error-codes.ts`、`response.ts`、`trace-modules.ts`(布局契约/校验/默认布局)。
|
||||
|
||||
apps/admin/src/:`views/` Dashboard、Templates、Artworks/ArtworkEdit/ArtworkTraceCodes、TraceCodes、Onchain、OutboundManagement、Audit、QueryLogs、OperationLogs、Users、Settings、Install;`components/` TraceCodePanel、TraceCodeOperationTable、TraceModuleEditor(模板/作品共用,`templateMode`)、MediaUpload、MediaSorter、ArtworkShowcaseEditor、BackupRestorePanel;`composables/useTablePage.ts`、`utils/mediaUrl.ts`、`api/index.ts`。
|
||||
|
||||
apps/client/src/:`views/Trace.vue` + `components/trace/TraceModuleRenderer.vue` 分发 9 个模块组件(Hero/Authenticity/ProductIntro/Showcase/Certificates/Timeline/Blockchain/ImageText/HorizontalGallery)+ `media.ts`;`composables/openMediaViewer.ts`。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: 关键技术选型与取舍
|
||||
type: decision
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/关键技术选型与取舍
|
||||
stable_id: ae318134-8651-4563-bc22-491c51f87af4
|
||||
scope: project
|
||||
memory_type: decision
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-decision-02
|
||||
created_at: '2026-09-03T03:43:49.600038+00:00'
|
||||
updated_at: '2026-09-03T03:43:49.600038+00:00'
|
||||
tags:
|
||||
- architecture
|
||||
- decision
|
||||
- security
|
||||
- config
|
||||
---
|
||||
|
||||
- **UserKey 明文存库、AppKey 加密存库**:UserKey 是全系统唯一无外部恢复途径的凭据(天河链不留存),明文使备份跨重装可恢复、不依赖 `SETTING_ENCRYPTION_KEY`;单有 UserKey 无 AppKey(仍加密、可向天河重取)用不了钱包。UI 掩码,揭示/复制/轮换二次确认且记操作日志。
|
||||
- **单一根 `.env` + 安装向导**(取代早期 `config/` JSON 方案):消除 JSON+.env+config 三套并存;Prisma CLI 自动读 cwd .env、compose 自动读同级 .env,根 .env 最兼容。Docker 因 compose 约束必须有 .env。
|
||||
- **安装向导并入 admin**(删除独立 `apps/install`):减少一个工程;admin 路由守卫探测 `/api/install/status` 未安装强制进 `/install`。
|
||||
- **核心部署 = 单 Node 服务 + 安装向导**,Docker/SSH 为可选自动化;本地 dev 不引入 PM2(前台阻塞 + Windows Job Object 整树清理)。
|
||||
- **追溯码链接动态生成不固化 DB**:换域名全部自动跟随;`/t/:code` 302 保留兼容历史二维码。
|
||||
- **预览用类 TOTP 无状态令牌**:不落库、外泄最长 2 窗口失效;预览 URL 仅点击瞬间拼接,不进行数据/导出。
|
||||
- **防伪状态模块可排序隐藏但副作用后端固定**:页面配置不能关闭激活/计数/日志。
|
||||
- **历史 revision 快照持旧存储 key**:媒体归位后历史审核详情旧图可能 404,开发期无线上数据已确认不处理。
|
||||
- **选型**:PhotoSwipe v5(MIT,用户确认)替代自写查看器;NestJS 11 + Express 5 + Node 24(Node 20 已 EOL);Vite 6;echarts 6;`archiver`/`unzipper` 流式备份;`@aws-sdk/lib-storage` multipart。根 `pnpm.overrides`:multer 2.2.0、exceljs>uuid 11、qs 6.15.3;不要跨主版本覆盖 file-type/path-to-regexp。
|
||||
- **明确不做**:NFC、多机构隔离、主动预警、C 端骨架屏、查询日志地区解析(已移除)、父子树状时间轴节点。证书:C 端水印图、后台原件。查询日志 IP/UA 不脱敏仅后台可见。
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: 出库 ZIP 导入契约与备份恢复机制
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/出库-zip-导入契约与备份恢复机制
|
||||
stable_id: 76e12a12-446a-4d96-bb49-2534930a5d56
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-08
|
||||
created_at: '2026-09-03T03:49:33.428068+00:00'
|
||||
updated_at: '2026-09-03T03:49:33.428068+00:00'
|
||||
tags:
|
||||
- outbound
|
||||
- import
|
||||
- backup
|
||||
- limits
|
||||
---
|
||||
|
||||
出库 ZIP 高级导入(仅登记出库,不自动上链):
|
||||
- ZIP 根目录只能一个 xlsx(列:追溯码、批次、出库时间(必填,UTC+8 严格解析)、备注);图片仅接受 `images/<追溯码>/文件名`(旧 `image/` 目录、单元格图片路径不兼容)。
|
||||
- 边界(`outbound-import.util.ts`):最多 10000 行/64 列;单 xlsx 100MB(内部解压 500MB);单图 100MB、JPG/JPEG/PNG/WebP、≤4000 万像素、单帧;图片张数无业务上限;ZIP 中央目录 `100002` 条目是技术安全阈值;总体积无固定上限(受磁盘/内存/1 小时接收窗口约束)。临时盘预检:有 Content-Length 按 3 倍与 1GB 取大,无则先 1GB 后按实际复检。
|
||||
- 流程:上传(requestId 幂等,Multer 临时盘 → `.private/` 私有存储)→ 预览 Job(逐行校验、已出库/不存在/重复码拒绝)→ 会议 READY → 提交(事务内 READY→IMPORTING CAS,同 jobId)→ Worker 以 `TraceCode.outTime IS NULL` 条件更新逐行导入 → 结果 xlsx。预览 Job 每分钟心跳,失联 2 小时恢复;终态后立即删原始 ZIP。静态模板 `apps/api/src/assets/templates/outbound-import-template.zip`。
|
||||
|
||||
备份:格式 `2.0.0` ZIP(manifest/database.json/storage 全目录),覆盖全局流水、逐码任务、上链分片/凭证、出库模型、系统设置(raw 值,含明文 UserKey)。创建/下载/上传/恢复均流式(archiver/unzipper,Zip64);恢复前精确校验 app/版本/模型全集/媒体清单/路径/大小/CRC/磁盘/`nextSeq > max(serialNo)`,完整落盘后才自动快照并清库/清媒体;CAS 防并发;不恢复正在执行的批量导入(PARSING/IMPORTING 安全终止)。后台可定时备份+保留策略;恢复必须“上传预校验 → 确认恢复”两步。备份包存非公开目录。
|
||||
@@ -0,0 +1,36 @@
|
||||
---
|
||||
title: 出库/上链不变量与审核流约束
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/出库-上链不变量与审核流约束
|
||||
stable_id: a9739d28-4318-492e-bad3-53e9ea2769a8
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-rule-04
|
||||
created_at: '2026-09-03T03:33:34.778904+00:00'
|
||||
updated_at: '2026-09-03T03:33:34.778904+00:00'
|
||||
tags:
|
||||
- outbound
|
||||
- blockchain
|
||||
- audit
|
||||
- business-rule
|
||||
---
|
||||
|
||||
出库/上链(前后端一致硬校验):
|
||||
1. 上链与出库完全解耦:上链只发行追溯码数字身份,链上不含出库时间/备注/图片;可先上链后出库。
|
||||
2. 出库不可撤销但可修改:每码至多一个 `OutboundRecord`,出库时间必填;`OutboundImage` 独立存储、不限张数、分页读取。
|
||||
3. 批量上链不逐件调用:按作品元数据分组,每个 publish 请求最多 5000 个 productId;分片全局串行保护 `baseTokenId`。
|
||||
4. 不允许重复铸造:`PENDING/SUBMITTING/CONFIRMING/ONCHAIN/UNKNOWN` 均禁止新铸,只有明确 `FAILED` 可重试;重试复用已持久化的精确请求与 `operateId`。
|
||||
5. 未知结果优先保链上安全:网络中断/超时/HTTP 408、409、425、429、5xx/响应不完整 → UNKNOWN,禁止换新 operateId 重铸;只能原参数同步、补录交易哈希,或超管填原因确认失败后重试。
|
||||
- 批量选择语义 IDS(跨页手选)/ FILTER(筛选全集+排除 ID);`JobItem.traceCodeId` 刻意允许为空(保留失败占位),不要改回非空外键。
|
||||
- 上链作品必须启用、审核通过且有真实主图;本地 `/uploads/` 主图在发行前以 BASE_URL 转绝对地址。
|
||||
|
||||
审核变更流:
|
||||
- 修改已通过档案写 `artwork_revision` 快照,审核通过才覆盖正式数据,C 端期间展示上一版。
|
||||
- 超级管理员创建/修改自动审批通过(提交人/审核人为本人,不进待审);普通运营进待审;模板无审核模型直接生效。
|
||||
- 节点、证书、showcaseImages、traceLayout、showOutboundTimeline 均无独立写接口,必须随作品快照提交;快照应用后统一触发证书水印 Worker。
|
||||
- 历史修订快照缺字段时:showcaseImages 按空数组、showOutboundTimeline 按 false、traceLayout **不覆盖**当前正式布局。
|
||||
- 空修改前后端双重拦截(“内容未变化,无需提交审核”)。
|
||||
@@ -0,0 +1,42 @@
|
||||
---
|
||||
title: 前端与业务实现踩坑及沟通教训
|
||||
type: experience
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/前端与业务实现踩坑及沟通教训
|
||||
stable_id: 67a86e88-a750-4cd8-9650-c1b7cfbf22b9
|
||||
scope: project
|
||||
memory_type: experience
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 2
|
||||
request_id: artveris-migrate-2026-09-03-exp-04-fix
|
||||
created_at: '2026-09-03T03:47:27.319265+00:00'
|
||||
updated_at: '2026-09-03T03:48:31.568783+00:00'
|
||||
tags:
|
||||
- frontend
|
||||
- communication
|
||||
- pitfall
|
||||
- lesson
|
||||
---
|
||||
|
||||
前端:
|
||||
- PC 点击轮播卡片打不开查看器:`pointerdown` 即 `setPointerCapture` 会把后续 click 改派到容器,改为确认横向拖动后才捕获。
|
||||
- 轮播无缝循环:首尾各加克隆张,`transitionend` 时无动画跳回真实张。
|
||||
- 上传 FormData 不要手动设 Content-Type(交由 axios 设边界)。
|
||||
- C 端切换短码不刷新:需 watch route param。
|
||||
- 上链状态前端 `rowIsOnchain` 要认 ONCHAIN/CONFIRMING/PENDING(确认中即已上链不可重触),仅 FAILED 可重试。
|
||||
- 接口入参:多处 `BigInt(id)` 非法入参会 500,统一用 `parseBigId` 返回 400。
|
||||
|
||||
业务实现:
|
||||
- 首扫激活必须条件更新 `updateMany(where:{id,status:INACTIVE})`,“读后写”并发会双重首扫且丢增量。
|
||||
- 备份恢复端必须校验 app/版本/模型全集,否则残缺包会清库(先清后写)。
|
||||
- “先写库后入队”需入队失败补偿(回写 FAILED/回滚),Redis 抖动否则留悬挂记录。
|
||||
- `hashData` 必须稳定序列化(JSON.stringify 受 key 顺序影响)。
|
||||
- `void promise` 无 catch 会 unhandled rejection(操作日志拦截器曾中招)。
|
||||
- ZIP 解析:倒序定位真实 EOCD/ZIP64,按实际解压字节流计数,不能信任中央目录声明大小;`100002` 条目是防恶意内存耗尽的技术阈值非业务上限。
|
||||
|
||||
沟通教训:
|
||||
- 用户描述“显示 X 而不是 Y”大概率是吐槽现状 X、想要 Y(AppKey 掩码事件连错两轮),拿不准先确认。
|
||||
- UI 布局任务必须附截图级验收标准,否则容易做成“能编译但难看”。
|
||||
- 甲方“不做 NFT”、“SKU”等用词与技术含义不同(实为不做二级交易 / 一款档案),关键口径必须反复澄清后再动模型。
|
||||
- QA 后彻底清理测试数据(档案/修订/日志/查询计数/上传文件),回滚到种子基线。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: 前端编码约定(admin/client)
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/前端编码约定-admin-client
|
||||
stable_id: ada12b65-afa2-415e-98b3-2a24ff57feb9
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-rule-05
|
||||
created_at: '2026-09-03T03:34:24.566615+00:00'
|
||||
updated_at: '2026-09-03T03:34:24.566615+00:00'
|
||||
tags:
|
||||
- frontend
|
||||
- admin
|
||||
- client
|
||||
- vue
|
||||
- naive-ui
|
||||
---
|
||||
|
||||
- 后台列表页:复用 `apps/admin/src/composables/useTablePage.ts`,根容器 `class="page table-page"`,`n-data-table` 用 `class="table-fill" flex-height` 并关内置分页,底部外置 `n-pagination`;后端列表继承 `PaginationDto` 遵守 `pageSize=0` 不分页。操作列右固定,长文本省略悬停。
|
||||
- 筛选:输入型检索放工具栏,枚举/下拉型放表头下拉,所有条件集中到同一 query 对象。
|
||||
- 上传:单文件/少量用 `MediaUpload.vue`,多图排序用 `MediaSorter.vue`(captionable/disabled);选文件后必须立即有可见反馈。提交时存存储 key,展示时用 `utils/mediaUrl.ts` 的 `resolveMediaUrl` 解析。
|
||||
- `n-data-table` 单元格内样式(如 `.cell-link`)必须用 `:deep()`(子组件渲染不带 scope 属性)。Teleport 弹窗宽度直接在 `n-modal` 上设 `style` + `max-width: 94vw`,不用 scoped 选择器。
|
||||
- i18n:单 json/语言(`locales/zh-CN.json`、`en-US.json`),默认中文;新增键中英同步,后端错误按 `messageKey` 翻译。
|
||||
- `@artveris/shared` 在 admin/client 的 Vite 中用 alias 指向 src(避免 rollup 读 CJS 命名导出失败)。
|
||||
- 主题:Naive 官方 light/darkTheme + 青绿主色,CSS 变量 `--brand`,不硬编码颜色。admin 用 `manualChunks` 拆 naive/echarts/vendor。
|
||||
- 审核/日志/用户/设置等受限路由用 `meta.roles`,菜单按角色隐藏;只读角色(`!auth.canWrite`)隐藏保存/触发按钮。
|
||||
- 客户端图片/视频查看器用 PhotoSwipe v5(`composables/openMediaViewer.ts`),不再使用旧 MediaViewer。
|
||||
@@ -0,0 +1,21 @@
|
||||
---
|
||||
title: 天河链V3证书与现有NFT发行兼容性实测
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/天河链-v3-证书与现有-nft-发行兼容性实测
|
||||
stable_id: 50a1f92f-2808-4e44-9bc2-6bb1fecdbdcc
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-v3-evidence
|
||||
created_at: '2026-09-19T18:06:25.975813+00:00'
|
||||
updated_at: '2026-09-19T18:06:25.975813+00:00'
|
||||
tags:
|
||||
- tianhe
|
||||
- certificate
|
||||
- verified
|
||||
---
|
||||
|
||||
2026-09-20仅在免费测试域名实测:V2 /api/v2/nfr/publish 新建NFT并经transaction/status确认进块后,使用同钱包address和发行operateId调用V3 /v1/deposit/certificate返回业务code400出证失败。对照组同凭据同钱包调用V3 /v1/deposit/text/save创建文本存证后能取得证书。钱包可复用,但发行operateId不能直接作为V3存证编号。证书接口返回天河链/#/certificate网页链接,不是图片直链,官方网页提供下载按钮。V3需要签名请求头,不能沿用V2的code0响应判定。当前新增证书按实物维护独立状态和稳定operateId,保存文本快照与链接;请求超时或重启后仅查询原操作,禁止盲目重提。所有联调使用测试凭据,未调用正式付费接口。相关代码说明见docs/消费者按需存证证书.md与docs/天河链按需出证测试结论.md。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: 天河链官方文档勘误与联调坑
|
||||
type: experience
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/天河链官方文档勘误与联调坑
|
||||
stable_id: 92e5c8d9-c4ef-4ab7-99ac-1b81f3228b59
|
||||
scope: project
|
||||
memory_type: experience
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-exp-01
|
||||
created_at: '2026-09-03T03:44:33.692130+00:00'
|
||||
updated_at: '2026-09-03T03:44:33.692130+00:00'
|
||||
tags:
|
||||
- blockchain
|
||||
- tianhe
|
||||
- pitfall
|
||||
---
|
||||
|
||||
勿被官方文档(语雀版)误导,以 APIFox 在线文档 + 实测为准:
|
||||
- 交易详情接口(接口5)真实路径 `/api/v2/nfr/transaction/detail`(语雀少 `/nfr`)。
|
||||
- 确认接口(接口9)是 GET 但参数放 JSON 请求体(query 会报 "request body missing"),需用 `node:http/https` 底层发带 body 的 GET,appKey 不进 URL;`status` 语义 "0x0"=成功否则失败。
|
||||
- upload 的 multipart 必须手工构造:whatwg FormData+Blob 会被 undici 强加 filename 导致 500;userDto 分段需“无 filename + Content-Type: application/json”。
|
||||
- publish 的 `operateId` 限 20 字符;name≤42、author≤120、feature≤500。
|
||||
- 确认接口对纯存证 upload 交易结构性返回 `500 "Index: 3, Size: 1"`(非偶发),仅对 token 交易有效。
|
||||
- 发行可能返回 tokenId=-1,需确认后回填。
|
||||
- 接口成功只代表交易已提交,不代表链上最织确认;实测 mint 提交同秒即可查到进块。
|
||||
- 严格校验 `code===0` 且 publish 必须返回交易哈希,否则走 FAILED,杜绝用本地 dataHash 冒充链上哈希的“假上链”。
|
||||
- 本地 `/uploads/` 相对路径不能直接写链(feature),发行前以 BASE_URL 转绝对地址。
|
||||
- 天河请求/响应/异常文本与持久化 raw 必须脱敏 appKey/userKey/newUserKey(先脱敏再截断)。
|
||||
@@ -0,0 +1,32 @@
|
||||
---
|
||||
title: 天河链接入范围定稿(甲方 2026-07-10 确认)
|
||||
type: decision
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/天河链接入范围定稿甲方-2026-07-10-确认
|
||||
stable_id: dd22c710-2822-4515-a28c-ead99162caac
|
||||
scope: project
|
||||
memory_type: decision
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-decision-01
|
||||
created_at: '2026-09-03T03:42:44.823176+00:00'
|
||||
updated_at: '2026-09-03T03:42:44.823176+00:00'
|
||||
tags:
|
||||
- blockchain
|
||||
- tianhe
|
||||
- client-decision
|
||||
---
|
||||
|
||||
| 决策 | 结论与理由 |
|
||||
|---|---|
|
||||
| 接入范围 | 官方“三步接入”的①②步 + ③步“首发”:链上注册 → 部署合约 → 铸造 → 首发。首发=铸到平台钱包,publish 已覆盖 |
|
||||
| NFT 二级交易 | 不做 transfer/burn。甲方“不做 NFT”指不做二级交易,铸造/发行照做 |
|
||||
| 元数据上链 | 不做。upload 接口已从链路移除,每件=仅一次 publish(按次计费更省);若要恢复“存证+发行”双层,在 `attestWithTianhe` 恢复两步调用 |
|
||||
| 媒体与摘要上链 | 不做(L1/L2/L3 全不做)。图片/视频只存自有存储/OSS;feature 仅放主图 URL;链上只发行以追溯码为 productId 的数字身份。副作用甲方已知接受:媒体被替换无法靠链上记录发现 |
|
||||
| 删除功能 | 不做。链上不可删;平台删除不触链,有码/日志的档案禁删 |
|
||||
| 计费口径 | 按每次调用上链接口计费(非容量);“是否每件都上链”是运营决策与代码无关 |
|
||||
| 钱包粒度 | 单平台托管钱包(公证者),UserID `artveris-platform`;因不转移无需一物一钱包;每件 txHash/tokenId 独立,钱包地址不在 C 端展示 |
|
||||
| 已售出标记 | 不需要链上交易账单/已售出标记 |
|
||||
| C 端查验入口 | 跳天河区块浏览器交易详情页 `#/tiChain/transDetail?hash=`(不选藏品详情页,因不传媒体会显示“未获取到媒体内容”) |
|
||||
| 确认接口对纯存证 | 接口9/5 对 upload 交易结构性 500,仅对 token 交易(mint)有效——这也是选“仅发行”能拿到区块信息的原因 |
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: 天河链集成现状
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/天河链集成现状
|
||||
stable_id: 46eb1720-910a-4e4e-b56b-b6ac43b0cec1
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-06
|
||||
created_at: '2026-09-03T03:39:46.758410+00:00'
|
||||
updated_at: '2026-09-03T03:39:46.758410+00:00'
|
||||
tags:
|
||||
- blockchain
|
||||
- tianhe
|
||||
- nft
|
||||
---
|
||||
|
||||
驱动:`mock`(默认,拟真一次完成)/ `tianhe`,每次上链动态读系统设置(后台“系统设置 → 区块链存证”可切驱动/环境/AppID/AppKey,无需重启)。测试 API `https://test.api.tichain.tianhecloud.com`,正式 `https://api.tichain.tianhecloud.com`。
|
||||
链路:每件上链 = 仅一次 `publish` 发行(接口2),铸一个链上数字商品:productId=追溯码,name≤42,author≤120,feature≤500(仅放作品主图公开 URL),operateId≤20 字符;确认走接口9 `GET /api/v2/nfr/transaction/status`(参数放 JSON body,status "0x0"=成功)回填 tokenId/区块高度;tokenId 可能返回 -1 待确认回填。不调 upload(元数据存证)/transfer/burn。`TianheProvider.attest`(upload) 代码保留未用。
|
||||
状态机:`PENDING → SUBMITTING → CONFIRMING → ONCHAIN | FAILED | UNKNOWN`;确认节奏:提交后立即【不到】再 10s【再】再 30s 共 3 次自动,之后停等手动“重新确认”;未完成任务由启动与周期恢复扫描重投。
|
||||
身份:单平台托管钱包(公证者),UserID 固定 `artveris-platform`,UserKey 一次性随机生成并明文存 `system_setting`(MASKED_KEYS,UI 掩码,揭示/复制 POST 带审计);AppKey 加密存(SECRET_KEYS),揭示走 `POST /settings/tianhe/app-key/reveal` 返回明文并记日志。支持 UserKey 轮换(接口7)。重装后“手动录入”原 UserID/UserKey 复用钱包,切勿重新注册。合约地址存 `tianheContractAddress`,最大 tokenId 存 `tianheMaxTokenId`。
|
||||
测试环境凭据见密码库“artveris · 天河链测试环境凭据”;生产必须另注册。
|
||||
C 端:区块链卡展示交易哈希/合约/区块高度/上链时间,不展示 dataHash/tokenId;“查看存证”动态拼 `https://{test.}explorer.tianhecloud.com/#/tiChain/transDetail?hash=<txHash>`(按 `tianheEnv` 或 API base 是否含 `test.`),不信任 DB 历史 explorerUrl。
|
||||
`BlockchainProof.dataHash` 是平台内部结构化摘要,不上链,不能作为链上防篡改证据。详细集成文档:`docs/天河链集成说明.md`(`docs/天河链文档.md` 是过时官方快照,以 APIFox 为准)。
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: 官方证书作者显示单选及钱包身份边界
|
||||
type: decision
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/官方证书作者显示单选及钱包身份边界
|
||||
stable_id: 50fe77c5-ad21-4837-8bd4-3ee5f1b5ecbf
|
||||
scope: project
|
||||
memory_type: decision
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-certificate-author-mode
|
||||
created_at: '2026-09-20T01:59:20.148145+00:00'
|
||||
updated_at: '2026-09-20T01:59:20.148145+00:00'
|
||||
tags:
|
||||
- certificate
|
||||
- author
|
||||
- confirmed
|
||||
- verified
|
||||
---
|
||||
|
||||
用户要求系统设置单选证书作者显示:默认存证钱包地址(WALLET),可选择作品作者名称(ARTWORK_ARTIST)。已检查官方测试和生产网页静态代码并在测试证书页实测,页面通过{author:query.address,...query}允许独立author参数显示姓名。平台保留官方原始certificateUrl及address,在公开读取返回链接时按设置添加或移除author;不改变钱包、证据正文、digest、交易哈希和生成时间,不新增存证API调用。作品作者取已审核作品artist字段,空则回退钱包地址。此显示模式在已有证书再次打开时也生效;与正文模板仅影响新申请的规则不同。该姓名仅为显示,不代表链上签名身份改为艺术家本人。测试示例显示黄志伟且原address保持不变,已回归验证。
|
||||
@@ -0,0 +1,27 @@
|
||||
---
|
||||
title: 开发流程与提交规范
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/开发流程与提交规范
|
||||
stable_id: 6b129c78-a412-41e9-af9f-63ab071e03d9
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-rule-01
|
||||
created_at: '2026-09-03T03:30:58.493085+00:00'
|
||||
updated_at: '2026-09-03T03:30:58.493085+00:00'
|
||||
tags:
|
||||
- workflow
|
||||
- git
|
||||
- commit
|
||||
---
|
||||
|
||||
- 与用户沟通一律中文;开发环境为 Windows + PowerShell 5。
|
||||
- 遵循 YAGNI/KISS:用最简单正确实现解决当前问题,不为假设需求做抽象/基础设施,不引入非必要依赖,优先复用项目既有能力。
|
||||
- 完成顺序:实现 → 清理(删临时文件/注释代码/无用导入/调试日志)→ 更新项目记忆(MemRelay)→ 必要文档 → 检查 .gitignore → 提交。不得静默跳过。
|
||||
- 提交信息格式 `<type>: <中文一句话描述>`,type ∈ feat/fix/refactor/style/docs/chore/revert;只提交有意义的真实变更。
|
||||
- 分支约定:`main` 为远端默认主分支,`dev` 为长期开发分支;功能在 dev 完成并经用户确认后再合并 main,合并后保留 dev;推送时全部分支都推。网络不通可用代理 127.0.0.1:7897。
|
||||
- 远程:origin fetch = https://git.asio.asia/nixevol/Artveris.git,push 同时到该地址与 https://github.com/nixevol/artveris.git(私有)。
|
||||
- 项目为商业闭源(PolyForm Strict License 1.0.0,版权 Nixevol)。
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: 数据与持久层红线
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/数据与持久层红线
|
||||
stable_id: dc70f54c-8e29-4834-a5c1-a63bc9ac9e68
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-rule-03
|
||||
created_at: '2026-09-03T03:32:31.018549+00:00'
|
||||
updated_at: '2026-09-03T03:32:31.018549+00:00'
|
||||
tags:
|
||||
- data
|
||||
- migration
|
||||
- backup
|
||||
- security
|
||||
---
|
||||
|
||||
- 升级永不覆盖持久层:运行目录根 `.env`、`storage/`(上传)、`backups/`、数据库。代码/镜像是可替换层。
|
||||
- Prisma 迁移基线为 `20260715000000_init`,备份格式 `2.0.0`,不兼容此前数据库/备份/旧追溯码;只能全新安装或升级已用该基线的环境。新变更一律走增量迁移。
|
||||
- 全局流水 `trace_code_sequence.next_seq` 禁止手工回退;耗尽 999999 后停止生码不循环;恢复备份强制校验 `nextSeq > max(serialNo)`。
|
||||
- 已有追溯码/查询记录的档案禁止删除(只能停用/归档);已 ONCHAIN/处理中/UNKNOWN 的追溯码禁止删除和重复上链。
|
||||
- 媒体统一以存储 key 入库,展示时经 `StorageService.getUrl` 转 URL;上传禁止 SVG(防存储型 XSS)。
|
||||
- 短链/追溯码 URL 一律动态生成 `{clientBaseUrl}/#/trace/{shortCode}`,勿依赖 DB 的 url 列(已废弃固化)。
|
||||
- seed 的追溯码短码必须符合 12 位数字 `TRACE_CODE_PATTERN`,否则 C 端判 INVALID。
|
||||
- 在线存储切换(local↔OSS)必须单 API 实例;OSS bucket policy/CDN 必须排除 `.private/` 前缀匿名访问。
|
||||
- 生产无默认管理员口令(由安装向导设置);seed 弱口令仅限本地开发。
|
||||
@@ -0,0 +1,29 @@
|
||||
---
|
||||
title: 构建、测试与本地开发硬约束
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/构建、测试与本地开发硬约束
|
||||
stable_id: e1b8d25d-f638-4fbe-8a8d-0eda8f2d7d46
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-rule-02
|
||||
created_at: '2026-09-03T03:31:46.141500+00:00'
|
||||
updated_at: '2026-09-03T03:31:46.141500+00:00'
|
||||
tags:
|
||||
- build
|
||||
- test
|
||||
- dev
|
||||
- windows
|
||||
---
|
||||
|
||||
- 包管理器锁定 `pnpm@10.28.0`(根 package.json `packageManager`,corepack 激活);Node 最低 20.11.1,推荐 24 LTS。原生依赖(prisma/sharp)在根 `pnpm.onlyBuiltDependencies` 放行。
|
||||
- 本地启动:`python scripts/dev.py`(自动进 .venv;无 .env 进安装向导;`--stop` 停服;`--no-seed` 跳过种子)。端口 api 3000 / admin 5173 / client 5174。
|
||||
- 验证基线:`pnpm build`(全量)、`pnpm --filter @artveris/api test`(后端单测)、Prisma `format/validate/generate`。改 admin/client 文案后必须校验中英文语言包键数量一致。不要在文档中固化测试数量。
|
||||
- Prisma CLI 手动执行需 `pnpm --filter @artveris/api exec dotenv -e ../../.env -- prisma <cmd>`,否则报 DATABASE_URL 未找到。
|
||||
- `nest start --watch` 运行中勿删 `apps/api/dist`,也勿在此时跑 `nest build`/`build.py`(会清空重建 dist 导致 dev API 崩);打升级包前先停本地 API,打完再拉起。
|
||||
- Windows PowerShell 5:`&&` 不可用(用 `;` 或分步执行);读中文输出前设 `[Console]::OutputEncoding = UTF8`;ps1 脚本正文用纯 ASCII(UTF-8 无 BOM 的中文会被解析乱码)。
|
||||
- 改后端 enum/模型需同步 `packages/shared/src/enums.ts` 并新增 Prisma 增量迁移(不改已发布基线 `20260715000000_init`);运行时可配项走系统设置而非硬编码。
|
||||
- `docs/系统测试信息.md`(真实凭据)、`.env`、`scripts/.dev.local.json`、`.deploy/` 必须保持 gitignore,绝不提交或输出内容。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: 核心数据模型与业务流程
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/核心数据模型与业务流程
|
||||
stable_id: 7e83a02d-9eb6-4e97-9f23-102f34ae8b1e
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-02
|
||||
created_at: '2026-09-03T03:36:11.667015+00:00'
|
||||
updated_at: '2026-09-03T03:36:11.667015+00:00'
|
||||
tags:
|
||||
- data-model
|
||||
- prisma
|
||||
- business-flow
|
||||
---
|
||||
|
||||
模型三层:`Artwork(一款/一个档案)1:N Batch(批次)1:N TraceCode(每件实物)`,另 `Artwork 1:N TraceCode`。
|
||||
- `Artwork.archiveNo` 款级唯一档案编号,自动生成 `ARTVERIS-000001`;`TraceCode.shortCode` 件级唯一 12 位纯数字码 = 安全随机六码 + 全局流水六码(`trace_code_sequence` 单例原子分配 000001..999999,允许跳号不回收);`serialNo` 与完整码分别唯一。无日期/Feistel/salt。
|
||||
- 旧概念“未绑定码池→绑定作品”、SKU、18 位完整码、码级 archiveNo 均已移除,文档残留仅作背景。
|
||||
- 审核:`Artwork.auditStatus`(PENDING/APPROVED/REJECTED)+ `ArtworkRevision` 快照(before/after);新建默认 4 个时间轴骨架节点(创作/选胚、制作、仓储/托管、出库/流转)。
|
||||
- 作品内容字段:`images`(仅首屏轮播)、`showcaseImages`(JSON,作品展示图,最多 30)、`traceLayout`(JSON 模块布局)、`showOutboundTimeline`(默认 false)、动态字段(模板驱动);`Template.defaultTraceLayout`。
|
||||
- 出库:`OutboundRecord`(1:1 TraceCode)+ `OutboundImage`(1:N);批量任务 `Job` + `JobItem`(selectionKey+jobId 唯一);上链 `BlockchainProof`(txHash/tokenId/contractAddress/dataHash)+ `OnchainChunk`(分片快照、operateId)。
|
||||
- 查询日志 `QueryLog`:IP/UA/浏览器/OS/结果/档案号/批次号,无地区字段(已移除)。
|
||||
- 系统设置 `system_setting` 键值表:EDITABLE_KEYS 白名单、SECRET_KEYS AES-256-GCM 加密(`enc:v1:`)、MASKED_KEYS 仅展示掩码。
|
||||
|
||||
业务流:模板 → 建档(自动档案号)→ 审核 → 批量生码(批次+12 位码+二维码)→ 批量上链(可先于出库)/ 单件或批量登记出库(时间必填,实况图可后补)→ C 端展示/区块浏览器查验。消费者扫码:首次访问条件更新 INACTIVE→ACTIVE 激活计数=1,重复 +1,写查询日志;仅展示审核通过且未停用的作品。
|
||||
后台菜单:看板、溯源模板、艺术品档案(编辑详情 / 数据管理=批次与追溯码)、内容审核、追溯码管理、上链管理、出库管理、查询日志、操作日志、用户、系统设置(5 tab:平台/日志/区块链/存储/备份,URL `?tab=`)。
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: 生产环境拓扑与一键升级
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/生产环境拓扑与一键升级
|
||||
stable_id: d5bb7f58-99bb-4381-ac98-300cceb128fe
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-05
|
||||
created_at: '2026-09-03T03:38:45.387773+00:00'
|
||||
updated_at: '2026-09-03T03:38:45.387773+00:00'
|
||||
tags:
|
||||
- production
|
||||
- server
|
||||
- pm2
|
||||
- baota
|
||||
- upgrade
|
||||
---
|
||||
|
||||
生产服务器 `8.134.255.136`(阿里云 Alinux 8,宝塔面板):Node 24,pnpm 由 corepack 提供,MySQL 本机 5.7(业务账号无 PROCESS 权限),Redis 本机。
|
||||
- 部署目录 `/www/wwwroot/artveris`,PM2 应用名 **`server`**(非 artveris),API 端口 3000,域名 `https://art.qclh.xyz`(宝塔 Nginx 反代),升级工作目录 `/www/upgrade`(包/备份各保留最近 3 份)。
|
||||
- SSH 免密:本机 `C:\Users\Administrator\.ssh\id_ed25519`,公钥已在 root authorized_keys。凭据条目见密码库“artveris · 生产服务器 SSH (8.134.255.136)”。
|
||||
- PM2 开机自启已配置(2026-09-03):`pm2-root.service` enabled,重启链路 systemd → pm2 resurrect → `server`。
|
||||
|
||||
一键升级:本机运行 `.\scripts\upgrade-remote.ps1`(`-SkipBuild` 部署 `.release` 现有包)。流程:`build.py --upgrade` → scp 包+`upgrade-remote-steps.sh` → 远端备份(mysqldump `--single-transaction --no-tablespaces` 到 `/www/upgrade/backup/`,代码 tar 排除 node_modules/storage/backups)→ `pm2 stop server` → 官方 `upgrade.sh`(替代码/装依赖/prisma generate/migrate deploy)→ `pm2 restart` + `pm2 save` → 回环健康检查(install/status、/admin、/trace 均 200,10×3s)→ 清理旧包。任一步失败立即中止并保留备份,服务保持停止避免带病运行。打包前需先停本地 dev API。
|
||||
- 已完成多次生产升级(含模块化编排迁移 `trace_module_layout`),`.env`/`storage/`/`backups/`/数据库未触碰。
|
||||
- 生产上线检查单(天河链):换生产 AppID/AppKey → 切生产环境 → 生产重新注册钱包并离线保存凭据 → 抽一件真实走通 → 与天河商务核对计费。
|
||||
@@ -0,0 +1,30 @@
|
||||
---
|
||||
title: 生产部署与运维踩坑(宝塔/PM2/升级)
|
||||
type: experience
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/生产部署与运维踩坑宝塔-pm2-升级
|
||||
stable_id: 2939ce96-a6f6-418a-9a70-568980dbdc2a
|
||||
scope: project
|
||||
memory_type: experience
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-exp-03
|
||||
created_at: '2026-09-03T03:46:20.683407+00:00'
|
||||
updated_at: '2026-09-03T03:46:20.683407+00:00'
|
||||
tags:
|
||||
- production
|
||||
- pm2
|
||||
- baota
|
||||
- upgrade
|
||||
- pitfall
|
||||
---
|
||||
|
||||
- **宝塔“Node/PM2 项目”面板不会配置开机自启**:只做 `pm2 save` 不够,服务器重启后应用不在线(2026-09-03 续费重启后发生)。新服务器部署后必须 `pm2 startup systemd -u root --hp /root` + `pm2 save`,并检查 `systemctl is-enabled pm2-root`。resurrect 对在跑应用幂等。
|
||||
- 服务器 MySQL 5.7 业务账号无 PROCESS 权限,`mysqldump` 必须加 `--no-tablespaces`。
|
||||
- 上传到 Linux 的 shell 脚本必须 LF 无 BOM(CRLF 会让 bash 报错);本机 ps1 正文用英文,读远端中文需 `[Console]::OutputEncoding = UTF8`。
|
||||
- 升级包必须解压到线上目录之外;`upgrade.sh/ps1` 会拒绝根目录/同目录/互相嵌套路径,并校验部署哨兵与包完整性;部署目录勿用 NTFS Junction。
|
||||
- 生产包启动报缺 `.prisma/client/default`:安装依赖后必须在 apps/api 执行 `prisma generate`(init/upgrade 脚本已包含)。
|
||||
- 安装向导建库:宝塔/云 DB 通常已预建库+账号,`ensureDatabase` 幂等跳过;自建 MySQL 业务账号需建库权限或填管理员账号,不自动 GRANT。
|
||||
- 升级模式保留旧 `.env`,旧部署无 `SETTING_ENCRYPTION_KEY` 会回退 JWT_SECRET(无回归);Docker/remote 复用 `.deploy/deploy-secrets.json` 保证密钥稳定,否则旧数据因新随机密码连不上。
|
||||
- 历史 `appIconUrl` 若存 `/uploads/...` URL,local→OSS 后可能指向旧路径;前端按所在端回退默认图标 `/admin/app-icon.svg`、`/trace/app-icon.svg`。
|
||||
@@ -0,0 +1,22 @@
|
||||
---
|
||||
title: 证书文本改用可配置作品名称与版本模板
|
||||
type: decision
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/证书文本改用可配置作品名称与版本模板
|
||||
stable_id: de695150-996d-4a85-a9f0-91ac884b19bb
|
||||
scope: project
|
||||
memory_type: decision
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-20260920-configurable-certificate-template
|
||||
created_at: '2026-09-20T01:45:30.831264+00:00'
|
||||
updated_at: '2026-09-20T01:45:30.831264+00:00'
|
||||
tags:
|
||||
- certificate
|
||||
- template
|
||||
- confirmed
|
||||
- backup
|
||||
---
|
||||
|
||||
2026-09-20用户要求证书正文默认从作品名称+追溯码改为 {{作品名称}} {{版本}},例:十二生肖莲花手工杯 一个装。系统设置区块链页增加certificateTextTemplate,多行文本、500字符,帮助说明点击帮助按钮才弹出。支持作品名称、版本、追溯码、档案编号、作者五个占位符,普通文字与换行可组合,仅纯文本替换,不支持表达式或Markdown。版本必须按作品模板显示名“版本”解析实际键,已实测当前键为size,不是version。缺失字段为空,最终正文不能为空或超2000字符。新申请冻结渲染结果,已排队/已生成证据不重写,同实物仍只生成一次。此前短文本格式决策由此新默认替代。用户同时授权提交推送并无损更新正式环境。用户要求清理线上上轮备份,已核对本地备份SHA256后仅删除/www/upgrade/artveris-c5c0168-20260920/backup约601MB及对应回滚副本,生产目录不动、本地备份保留;新上线另建当时状态的备份。
|
||||
@@ -0,0 +1,33 @@
|
||||
---
|
||||
title: 部署形态与配置契约
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/部署形态与配置契约
|
||||
stable_id: b7e0eb44-e38f-40a3-8736-3a7a9de84818
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-04
|
||||
created_at: '2026-09-03T03:37:59.263398+00:00'
|
||||
updated_at: '2026-09-03T03:37:59.263398+00:00'
|
||||
tags:
|
||||
- deployment
|
||||
- config
|
||||
- install
|
||||
- docker
|
||||
- baota
|
||||
---
|
||||
|
||||
配置契约:唯一配置文件 = 运行目录下单一 `.env`(带中文注释,示例 `.env.example`),无 JSON 配置/config 目录;业务可调项(平台名/客户端地址/存储/链/备份/轮播间隔等)在系统设置表,优先于 .env。关键 env:`DATABASE_URL`、`REDIS_*`、`JWT_SECRET`、`SETTING_ENCRYPTION_KEY`、`STORAGE_DRIVER=local|oss`、`BLOCKCHAIN_DRIVER=mock|tianhe`、`BASE_URL`、`API_PORT`。
|
||||
安装向导:无 .env 时 API 进 `InstallAppModule` 安装模式(只托管 admin 静态),访问 `/admin` 自动进向导:填对外地址/端口/MySQL/Redis/管理员 → 自动建库+`migrate deploy`+建超管 → 最后一步写 .env → 退出由 PM2/Docker 重启进正式模式。
|
||||
|
||||
三种部署形态共享上述契约:
|
||||
1. 本地 `scripts/dev.py`。
|
||||
2. 宝塔/PM2 非 Docker 发布包 `python scripts/build.py`(全新 `artveris-fresh-*`,含 `init.sh`/`init.ps1`、`server.cjs`、`ecosystem.config.cjs`、`README-deploy.md`)/ `--upgrade`(`artveris-upgrade-*`,含 `upgrade.sh`/`upgrade.ps1`,只替代码),产物在 `.release/`。init 会配国内 npm/Prisma 镜像、corepack 准备 pnpm 10、装生产依赖、prisma generate。宝塔 PM2 项目:启动文件 `server.cjs`,运行目录=发布根,实例 1。
|
||||
3. 离线 Docker 包 `build_docker.py`(API/MySQL 8/Redis 7/Nginx 四镜像 + compose,Nginx 单入口 `127.0.0.1:18080`,数据 bind-mount `data/{storage,backups,mysql,redis,tmp}`,`up.sh [upgrade|fresh|clean]`)+ `remote.py` SSH 部署;密钥记忆在 `.deploy/deploy-secrets.json`(gitignore)。Docker 基础镜像 `node:24-slim`。
|
||||
|
||||
反向代理必须:`client_max_body_size 0; proxy_read_timeout 3600s; proxy_send_timeout 3600s; proxy_request_buffering off;`(大 ZIP 出库导入)。
|
||||
安全:四角色 RBAC(SUPER_ADMIN 全通/OPERATOR 写/AUDITOR 审核/VIEWER 只读),JWT 每请求回库校验;限流登录 10/min、公开溯源 60/min/IP;安全头 nosniff 等;无效短码 Redis 负缓存;操作日志拦截全部写操作且递归脱敏密钥。
|
||||
预览:后台点追溯码进 `/trace/preview/:code`,类 TOTP 令牌 HMAC(jwt.secret, 窗口号) 10 分钟周期接受当前+上一窗口,接口零副作用。
|
||||
@@ -0,0 +1,31 @@
|
||||
---
|
||||
title: 项目定位、技术栈与仓库结构
|
||||
type: fact
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/项目定位、技术栈与仓库结构
|
||||
stable_id: beb81aaa-8e86-4af7-a6c8-d35f7682d330
|
||||
scope: project
|
||||
memory_type: fact
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-migrate-2026-09-03-fact-01
|
||||
created_at: '2026-09-03T03:35:05.871234+00:00'
|
||||
updated_at: '2026-09-03T03:35:05.871234+00:00'
|
||||
tags:
|
||||
- overview
|
||||
- stack
|
||||
- architecture
|
||||
---
|
||||
|
||||
Artveris:面向艺术品行业的“一物一码、首次激活、多次查询”全生命周期溯源与认证平台(内部代号 artveris,与甲方品牌名解耦,品牌名走系统设置 appName)。商业闭源,单平台模式不做机构隔离。
|
||||
|
||||
三端一库:
|
||||
- `apps/api` NestJS 11 + Prisma 5 + MySQL 8 + Redis + BullMQ(Express 5);全局前缀 `/api`,Swagger `/api/docs`;生产单服务同端口托管 `/admin` `/trace` `/api` `/t/:code` `/uploads`。
|
||||
- `apps/admin` Vue3 + Vite 6 + Naive UI + Pinia + vue-router(hash) + vue-i18n + ECharts 6;内含安装向导 `/install` 页。
|
||||
- `apps/client` Vue3 + Vite 移动优先溯源页,路由 `/trace/:code` 与 `/trace/preview/:code`,PhotoSwipe v5。
|
||||
- `packages/shared` 枚举/错误码/常量/类型/溯源模块契约,tsc 构建 CJS。
|
||||
- `scripts/` Python:`dev.py`(本地)、`build.py`(非 Docker 发布包)、`build_docker.py`(离线 Docker 包)、`remote.py`(SSH Docker 部署)、`upgrade-remote.ps1`+`upgrade-remote-steps.sh`(宝塔一键升级)、`_lib.py`、`config.yaml`。
|
||||
- `docker/` 仅 `Dockerfile.api` + `entrypoint.sh`。`docs/` 产品/技术/天河链集成说明/交接文档。
|
||||
|
||||
其他:图片 sharp、二维码 qrcode、表格 exceljs、ZIP archiver/unzipper、OSS 走 @aws-sdk S3 兼容;中英双语。开发直接连本机 MySQL/Redis(不用 Docker)。
|
||||
@@ -0,0 +1,25 @@
|
||||
---
|
||||
title: 项目记忆托管在 MemRelay,不再维护本地 aidocs/
|
||||
type: rule
|
||||
permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/项目记忆托管在-mem-relay-不再维护本地-aidocs
|
||||
stable_id: dd093dd7-71be-46a2-bcb1-4a87c3d4b9ab
|
||||
scope: project
|
||||
memory_type: rule
|
||||
project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a
|
||||
usage_profile_id: 7aee455b-24cc-4008-bdaf-443721e6f939
|
||||
status: active
|
||||
revision: 1
|
||||
request_id: artveris-rule-memrelay-workflow-20260903
|
||||
created_at: '2026-09-03T03:59:52.985217+00:00'
|
||||
updated_at: '2026-09-03T03:59:52.985217+00:00'
|
||||
tags:
|
||||
- memrelay
|
||||
- workflow
|
||||
- memory
|
||||
---
|
||||
|
||||
- 自 2026-09-03 起,artveris 的项目记忆(规则/事实/决策/经验/检查点)全部托管在 MemRelay 项目 `artveris`(绑定 Git remote git.asio.asia/nixevol/Artveris);仓库中已删除 `aidocs/`,并在 `.gitignore` 忽略 `aidocs/`(仅作 `project_export_prepare` 本地导出目录)。
|
||||
- 每次会话开始:`project_resolve_or_create` → `context_get` + `checkpoint_get`,再读 `docs/项目交接文档.md` → `README.md` → `docs/天河链集成说明.md`。
|
||||
- 工作中:新规则/事实/决策/经验随时 `memory_save`;阶段完成或会话结束前 `checkpoint_save`(做了什么/为什么/验证/下一步)。重大定稿决策同步更新 `docs/项目交接文档.md`。
|
||||
- 历史专题文档(旧 aidocs 五份 + 交接文档 + 天河链集成说明)存放于 MemRelay 文件仓储 `artveris/docs/`,需要追溯来龙去脉时 `file_search` 查阅。
|
||||
- 凭证(天河链测试环境、本地 MySQL/Redis、生产服务器 SSH)在 MemRelay 密码库,记忆中只记条目名。
|
||||
Reference in New Issue
Block a user