Fix mobile viewer chrome and keep pages visible during autoplay.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-19 18:07:45 +03:30
co-authored by Cursor
parent a8374e7d6c
commit d25841aa16
6 changed files with 281 additions and 78 deletions
+48 -14
View File
@@ -1,6 +1,6 @@
# کاتالوگ دیجیتال (Digital Catalog)
سند مرجع پروژه — ۱۸ اوت ۲۰۲۶
سند مرجع پروژه — ۱۸ اوت ۲۰۲۶، به‌روز تا ۱۹ اوت ۲۰۲۶
قبل از پیاده‌سازی نوشته شده است. اگر رفتار محصول عوض شد، همین فایل باید به‌روز شود.
---
@@ -25,10 +25,12 @@
| ثبت‌نام / ورود | ندارد. هر بازدیدکننده دامنه می‌تواند بسازد |
| گالری عمومی | ندارد |
| خروجی ساخت | لینک مشاهده + تصویر QR + لینک حذف |
| ویرایش بعدی | ندارد (صفحات، PDF، افکت بعد از ساخت عوض نمی‌شود) |
| ویرایش بعدی | ندارد (صفحات، PDF، افکت و زمان ورق بعد از ساخت عوض نمی‌شود) |
| انقضای خودکار | ندارد |
| زبان رابط | فارسی، راست‌به‌چپ |
| نسخه اول | ساده؛ بدون حساب کاربری، بدون پنل ادمین، بدون SEO کاتالوگ |
| دامنهٔ زنده | `https://ktg.montzar.ir` |
| دیتابیس نسخه اول | SQLite روی دیسک همین پروژه؛ به Postgres مونتایم/سوپرادمین وصل نمی‌شود |
---
@@ -76,7 +78,7 @@
- یک PDF **یا** چند تصویر (نه هر دو با هم در یک کاتالوگ)
- ترتیب تصاویر = ترتیب انتخاب / ترتیب نام فایل؛ امکان جابه‌جایی قبل از ساخت
- انتخاب یکی از افکت‌های ورق‌زدن
- تعیین زمان ورق‌خوردن (۴۰۰ تا ۵۰۰۰ میلی‌ثانیه؛ پیش‌فرض ۱ ثانیه). بعد از ساخت عوض نمی‌شود
- تعیین زمان ورق‌خوردن (۴۰۰ تا ۵۰۰۰ میلی‌ثانیه؛ پیش‌فرض ۱ ثانیه). بعد از ساخت عوض نمی‌شود. روی مجله، اسلاید، محو و کارت اعمال می‌شود؛ اسکرول عمودی فقط فاصلهٔ پخش خودکار را از همین زمان می‌گیرد
- عنوان اختیاری (اگر خالی باشد: «کاتالوگ»)
### مشاهده
@@ -87,7 +89,7 @@
- بندانگشتی صفحات
- زوم و تمام‌صفحه
- دسکتاپ: فقط افکت `magazine` دو صفحه روبه‌رو نشان می‌دهد؛ بقیه همیشه یک صفحه
- موبایل: همیشه یک صفحه؛ اگر ورق سه‌بعدی روی دستگاه ضعیف بود، همان کاتالوگ با اسلاید افقی دیده می‌شود (تنظیم ذخیره‌شده عوض نمی‌شود)
- موبایل: همیشه یک صفحه؛ نوار عنوان و دکمه‌ها جمع می‌شوند و هنگام پخش خودکار مخفی می‌شوند (دکمهٔ کوچک توقف می‌ماند). اگر ورق سه‌بعدی روی دستگاه ضعیف بود، همان کاتالوگ با اسلاید افقی دیده می‌شود (تنظیم ذخیره‌شده عوض نمی‌شود)
### اشتراک
@@ -97,9 +99,11 @@
### حذف
- حذف فقط با توکن مخفی
- بعد از حذف، لینک و QR دیگر کار نمی‌کنند
- فایل صفحات از دیسک پاک می‌شوند
- لینک حذف فقط روی صفحهٔ نتیجه نشان داده می‌شود؛ باید همان لحظه کپی و ذخیره شود
- بعداً فقط وقتی به کار می‌آید که سازنده بخواهد همین کاتالوگ را پاک کند (باز کردن لینک در مرورگر و تأیید)
- در برنامه ذخیره یا بازیابی نمی‌شود؛ اگر گم شود راهی نیست
- لینک مشاهده برای اشتراک است؛ لینک حذف را نباید پخش کرد
- بعد از حذف، لینک مشاهده و QR دیگر کار نمی‌کنند و فایل صفحات از دیسک پاک می‌شوند
---
@@ -264,29 +268,53 @@ storage/catalogs/{id}/
سه صفحه اصلی، فارسی و RTL:
1. **ساخت:** ناحیه آپلود، لیست صفحات (مرتب‌سازی)، انتخاب افکت، دکمه ساخت
2. **نتیجه:** لینک، QR، هشدار «لینک حذف را ذخیره کن»، دکمه حذف
1. **ساخت:** ناحیه آپلود، لودینگ هنگام خواندن فایل و ساخت، لیست صفحات، انتخاب افکت، اسلایدر زمان ورق‌خوردن، دکمه ساخت
2. **نتیجه:** لینک مشاهده، QR، هشدار «لینک حذف را ذخیره کن»، فیلد لینک حذف، دکمه حذف
3. **نمایش:** استیج کاتالوگ، کنترل‌ها، بندانگشتی
ظاهر نسخه اول تمیز و ساده باشد، نه داشبورد شلوغ.
---
## ۱۴. اجرا و پیکربندی
## ۱۴. اجرا، دامنه و استقرار
یک سرور Node کافی است. SQLite و پوشه `storage/` کنار اپ می‌مانند.
توسعه محلی: `npm run dev` — فرانت `http://127.0.0.1:3000`، API روی `3010` و از طریق `/api` پروکسی می‌شود.
### دامنهٔ زنده (۱۹ اوت ۲۰۲۶)
- آدرس عمومی: `https://ktg.montzar.ir`
- کد: `http://get.feep.ir/Mahdi/digitalcatalog.git` (شاخه `main`)
- مسیر روی سرور: `/var/www/ktg`
- PM2: نام `ktg-catalog`، **یک اینستنس، fork** (نه cluster؛ sql.js با چند پروسه خراب می‌شود)
- پورت داخلی: `3020` — تداخل نکند با مونتایم (`3000`)، فوری‌سند (`3001`)، سوپرادمین (`3010`)
- Nginx: فقط `server_name ktg.montzar.ir`؛ همهٔ مسیرها به `127.0.0.1:3020` پروکسی می‌شوند (`client_max_body_size 100M` فقط در همین vhost)
- راهنمای قدم‌به‌قدم: [`deploy/DEPLOY.md`](../deploy/DEPLOY.md)
این اپ روی همان هاست مشترک مونتایم است (`185.50.38.53`) ولی **جدا** می‌ماند: پوشه، پورت، پروسهٔ PM2، فایل SQLite و دامنهٔ خودش. دیتابیس Postgres و JWT سوپرادمین لمس نمی‌شود. اگر بعداً لاگین/پروفایل آمد، باز هم داخل همین دامنه و دیتابیس همین پروژه است؛ کوکی نباید روی `.montzar.ir` باشد.
متغیرهای محیط:
```text
# توسعه
PORT=3000
API_PORT=3010
PUBLIC_BASE_URL=https://ktg.montzar.ir
PUBLIC_BASE_URL=http://localhost:3000
STORAGE_DIR=./storage
DATABASE_PATH=./data/catalogs.sqlite
# سرور ktg.montzar.ir
NODE_ENV=production
PORT=3020
PUBLIC_BASE_URL=https://ktg.montzar.ir
STORAGE_DIR=/var/www/ktg/storage
DATABASE_PATH=/var/www/ktg/data/catalogs.sqlite
```
`PUBLIC_BASE_URL` همان دامنه‌ای است که داخل QR نوشته می‌شود.
`PUBLIC_BASE_URL` همان دامنه‌ای است که داخل QR نوشته می‌شود. کاتالوگ‌های ساخته‌شده با `localhost` روی دامنهٔ زنده معتبر نیستند؛ باید روی سرور دوباره ساخته شوند.
آپدیت کد روی سرور: `git pull` سپس `npm ci && npm run build && pm2 restart ktg-catalog`. پوشه‌های `storage` و `data` و فایل `.env` پاک نشوند.
---
@@ -305,7 +333,7 @@ DATABASE_PATH=./data/catalogs.sqlite
نسخه اول وقتی تمام است که:
- [x] با چند تصویر کاتالوگ ساخته شود (تست API با JPEG)
- [ ] با PDF چندصفحه‌ای در مرورگر (نیاز به بررسی دستی)
- [x] با PDF چندصفحه‌ای در مرورگر (بررسی دستی روی دامنهٔ زنده)
- [x] پنج افکت در UI پیاده شده‌اند (بررسی ظاهری باقی است)
- [x] لینک `/c/:id` از API متادیتا می‌گیرد
- [x] QR همان لینک را کد می‌کند
@@ -314,6 +342,7 @@ DATABASE_PATH=./data/catalogs.sqlite
- [x] گالری یا لیست عمومی وجود نداشته باشد
- [ ] روی موبایل بررسی دستی
- [x] سقف تعداد صفحه پیام خطا بدهد
- [x] روی `https://ktg.montzar.ir` زنده است؛ ساخت کاتالوگ و لینک `/c/:id` کار می‌کند
---
@@ -326,7 +355,7 @@ DATABASE_PATH=./data/catalogs.sqlite
- انقضای اختیاری
- رمز روی کاتالوگ
- هاست چند سروره / S3
- حساب کاربری برای تیم
- حساب کاربری، پروفایل و «کاتالوگ‌های من» — جدا از سوپرادمین/مونتایم؛ دیتابیس و کوکی مال `ktg.montzar.ir`
---
@@ -340,3 +369,8 @@ DATABASE_PATH=./data/catalogs.sqlite
| ۲۰۲۶-۰۸-۱۸ | بدون گالری؛ فقط لینک و QR |
| ۲۰۲۶-۰۸-۱۸ | بعد از ساخت: لینک + QR + لینک حذف؛ بدون ویرایش و بدون انقضا |
| ۲۰۲۶-۰۸-۱۸ | استک: Vue 3 + Hono + SQLite + pdf.js + StPageFlip |
| ۲۰۲۶-۰۸-۱۸ | زمان ورق‌خوردن هنگام ساخت (۴۰۰–۵۰۰۰ms)؛ روی مجله/اسلاید/محو/کارت |
| ۲۰۲۶-۰۸-۱۸ | لودینگ هنگام خواندن فایل، آماده‌سازی صفحات و ساخت کاتالوگ |
| ۲۰۲۶-۰۸-۱۹ | استقرار روی هاست مشترک؛ دامنه `ktg.montzar.ir`؛ پورت ۳۰۲۰؛ SQLite جدا |
| ۲۰۲۶-۰۸-۱۹ | مخزن Gitea: `http://get.feep.ir/Mahdi/digitalcatalog.git` |
| ۲۰۲۶-۰۸-۱۹ | لاگین بعدی اگر آمد به Nest/Postgres بقیه وصل نمی‌شود |