Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

247 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Foliq

Foliq

面向打印与出版的专业结构化文档设计器

Framework-agnostic core · React designer · Versioned template API

Important

当前仓库正在进行 v2 重写。核心模型、渲染组件、React 编辑器、多页面管理、GitHub 登录、文件工作台、模板持久化与版本历史、Datasource v2 和完整自托管容器栈已经落地;打印、PDF/Word、自动分页与外部数据连接器尚未实现。原 Vue 2 版本保存在 legacy/ 中,仅供参考。

项目定位

Foliq 不是一个只能独立运行的页面 Demo,也没有把技术路线限定为 Web Component。内部工程代号继续沿用 PTD;v2 将产品拆成三个可以独立演进的层次:

  • 可嵌入的设计器内核:Schema、单位换算、序列化、数据绑定和组件注册表不依赖 UI 框架。
  • 专业 React 编辑器:提供完整的画布工作区、组件目录、属性面板和编辑命令。
  • 可演进的完整应用:Vite Web Host 已接通 NestJS 模板服务,提供认证、文件工作台、保存、另存为、版本历史与恢复;后续继续接入外部数据连接器、打印和导出。

当前更准确的描述是:已经形成文档设计、数据校样和版本化保存闭环的专业 Web 应用,打印出版链路仍在建设中

当前能力

设计器

  • Canvas-first 工作区:工具坞、资源面板、上下文工具栏、属性面板、状态栏。
  • 选择、多选、框选、拖动、缩放、旋转、锁定、组合与图层操作。
  • 复制、剪切、定位粘贴、Undo/Redo、右键菜单和键盘命令。
  • 真实标尺、悬停预览线、可固定和着色的参考线。
  • 文本框、直线、矩形、椭圆、星形的画布拖拽绘制,以及 Hand Tool。
  • 多页面新增、复制、删除和排序。
  • JSON object / object array 导入、嵌套字段树、字段搜索、格式化、组件绑定、记录切换与实时数据校样。
  • Host 可通过显式 RenderContext 注入临时运行时数据、locale、timeZone 与确定性的 now,不会默认写回模板。
  • 宽屏、标准与紧凑三种响应式工作区布局。
  • 文本、表格、图像、编码、图形五类组件目录,并区分可用组件与规划组件。

引擎与服务

  • 框架无关的 TemplateSchema、canonical Datasource v2、页面配置、序列化、安全数据绑定和组件注册表。
  • 原生 DOM 渲染组件:文本、表格、图像、二维码、条码和基础图形。
  • NestJS + Prisma + PostgreSQL 多用户模板 API,支持 GitHub OAuth、Allowlist、owner 隔离、不可变版本快照、恢复和乐观并发控制。
  • GitHub Actions 构建 Web/Server 镜像并发布到 GHCR;Compose 管理 PostgreSQL、migration、Server 和同源 Web 入口。

成熟度边界

模块 当前状态 说明
@ptd/core 已实现 Schema、单位、canonical v2、JSON 验证/推断、绑定与注册表
@ptd/components 已实现 框架无关 DOM 渲染组件
@ptd/react-designer 已实现,持续打磨 Controlled React 编辑器和专业画布交互
apps/web 应用闭环已实现 文件工作台、CRUD、版本历史、恢复、冲突保护与数据校样
apps/server API 已实现 PostgreSQL、Better Auth、owner 隔离和模板/版本 API
@ptd/export 空脚手架 PDF、打印、Word 和自动溢出分页均未实现

架构

apps/web (React + Vite) ───────────────┐
                                      ▼
                              @ptd/react-designer
                                      │
                         ┌────────────┴────────────┐
                         ▼                         ▼
                  @ptd/components             @ptd/core
                         │                         ▲
                         └─────────────────────────┘

apps/server (NestJS + Prisma + PostgreSQL) ──── @ptd/core

@ptd/export ── 当前仅为脚手架,尚未进入运行链路
packages/
  core/             框架无关的数据模型与引擎
  components/       原生 DOM 渲染组件
  react-designer/   React 专业编辑器
  export/           规划中的导出包
apps/
  web/              独立设计器 Host
  server/           模板持久化与版本 API
docker/             Web/Server 镜像与 Nginx 同源代理配置
legacy/             只读的 Vue 2 版本

更完整的代码边界见 Monorepo 架构规范

快速开始

环境要求

  • Node.js 22.12 或更高版本(CI 与 Docker 使用 Node 22)。
  • 通过 Corepack 使用仓库声明的 pnpm 10.15.1

虽然部分 package 的 engines 仍允许 Node 20,完整开发、CI 与容器环境统一使用 Node 22,以减少工具链和 Prisma 运行时差异。

启动 Web 设计器

corepack enable
corepack pnpm install
corepack pnpm dev

dev 命令会按依赖顺序构建 corecomponentsreact-designer,再同时启动 package watch 和 Vite。默认访问地址通常为 http://localhost:5173

启动模板服务

Web 的登录与准入检查依赖 Server。复制 apps/server/.env.example 并配置 PostgreSQL/GitHub OAuth 后,可单独启动 API:

corepack pnpm --filter server prisma:migrate:deploy
corepack pnpm --filter server start:dev

默认服务地址为 http://localhost:3000,健康检查为 GET /healthzDATABASE_URL 必须指向 PostgreSQL;没有本地文件数据库回退。

更完整的环境、命令和原生依赖排障见 DEVELOPMENT.md

在 React Host 中使用

v2 packages 当前只在本仓库 workspace 中使用,尚未发布到 npm。下面展示真实的受控组件 API,而不是 npm 安装说明:

import { useState } from 'react'
import { Designer, type DesignerHost, type TemplateSchema } from '@ptd/react-designer'
import '@ptd/react-designer/styles.css'

export function TemplateEditor({ initialValue }: { initialValue: TemplateSchema }) {
  const [template, setTemplate] = useState(initialValue)
  const host: DesignerHost = {
    commands: { save: {}, open: {} },
    onCommand: (command, context) => runDocumentCommand(command, context.template),
  }

  return <Designer value={template} onChange={setTemplate} host={host} />
}

DesignerProps 当前只有四项:

属性 类型 说明
value TemplateSchema 必填,Host 持有的当前模板
onChange (value) => void 编辑器产生模板变更时通知 Host
host DesignerHost 文档状态与 New/Open/Save/History 等应用级命令合同
renderContext RenderContext 可选临时校样数据与确定性的 locale/timeZone/now

样式需要由 Host 显式导入。API 与集成约束见 @ptd/react-designer README

Server API

模板服务提供以下 HTTP 端点:

方法 路径 用途
GET /healthz 健康检查
GET / POST /api/templates 列表 / 创建
GET / PUT / DELETE /api/templates/:id 读取 / 更新 / 删除
GET /api/templates/:id/versions 版本列表
GET /api/templates/:id/versions/:version 读取指定快照
POST /api/templates/:id/versions/:version/restore 将历史快照恢复为一个新版本

更新和恢复请求必须携带 expectedVersion。版本过期时返回 409 Conflict,以避免静默覆盖其他写入。请求体和响应语义见 Server README

多页面与自动分页

TemplateSchema.pages 表示用户手动管理、需要持久化的设计页面。未来的数据驱动自动溢出分页属于预览/打印/导出阶段生成的派生页面,不应写回手工页面,也不应污染编辑历史。这两个概念在 v2 中有意保持分离。

Docker 部署

当前生产链路交付完整自托管栈:

GitHub Actions → 前后端质量/容器构建 → GHCR Web + Server 镜像
                                            ↓
                  PostgreSQL → migration → Server → Nginx Web/API

服务器不需要 Node.js 或 pnpm:

git clone https://github.com/ROYIANS/print-template-designer.git
cd print-template-designer
cp .env.example .env
# 编辑 .env 中所有 CHANGE_ME、公开 origin 和 GitHub OAuth 配置
./deploy.sh

默认访问 http://<server-ip>:8080。PowerShell 7、HTTPS 反向代理、GitHub callback、数据库卷、备份、私有 GHCR、版本固定和回滚说明见 DEPLOYMENT.md

模块文档

模块 文档
Web Host apps/web/README.md
Template Server apps/server/README.md
Core packages/core/README.md
Components packages/components/README.md
React Designer packages/react-designer/README.md
Export scaffold packages/export/README.md
开发指南 DEVELOPMENT.md
部署指南 DEPLOYMENT.md
变更记录 CHANGELOG.md

路线图

接下来的主线按依赖顺序推进:

  1. 实现静态/单记录打印预览与浏览器打印。
  2. 在已稳定的数据合同上增加 Excel/CSV 本地文件连接器。
  3. 设计具备 Secret 隔离和 SSRF 防护的 REST Server 连接器。
  4. 实现重复明细、结构表格与派生自动分页。
  5. 实现可复现 PDF 输出并独立评估 Word 版式降级边界。

Excel/XLS/XLSX、CSV、REST、打印、PDF/Word、自动分页、图表、签名、条件显示、字体管理、批量打印和多语言属于后续扩展,不应被理解为当前能力。

Legacy v1

Vue 2 时代的源码、资源和实现记录保存在 legacy/ 中,不再维护,也不会被 v2 运行时代码引用。

  • npm 历史版本:print-template-designer
  • v1 的 ptd-designer / ptd-viewer API 与 v2 不兼容。
  • v1 曾包含的预览和导出实现不代表 v2 已具备同等功能。

联系与参考

联系二维码

主要参考项目:

License

MIT © ROYIANS

Star History Chart

About

A vue2 component for design a page for print / 一个使用Vue2的组件,用于设计打印页面模板[ 可视化 拖拽 设计器 打印 ]。旧版地址:https://royians.github.io/print-template-designer/

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages