- Alt/Title تصویر شاخص اکنون ذخیره میشود (ستونهای جدید image_alt/image_title — قبلاً بیصدا دور ریخته میشد)
- Alt و Title تصاویر داخل متن پس از درج هم قابل ویرایشاند (کنار کپشن)
- نام فایل ذخیرهسازی خوانا: نام دلخواه هنگام درج یا نام خود فایل (بهجای UUID خالی)
- پنل پرسشوپاسخ پایان مقاله (ستونهای faqs/faqs_en) با ظاهر آکاردئونی سایت و اسکیمای FAQPage
- چسباندن از Outline و هر منبع خارجی: تصاویر خودکار دانلود و در Object Storage سایت میزبانی میشوند (endpoint جدید import-image با محافظ SSRF) + دکمه میزبانی مجدد روی تصاویر خارجی موجود
- مقالهها ستون status (draft/published) گرفتند — GET /api/site و همه انتهای عمومی فقط منتشرشده را برمیگردانند؛ autosave دیگر پیشنویس نیمهکاره را زنده نمیکند
- کلمه کلیدی هدف چکلیست سئو فیلد seo_keyphrase شد (قبلاً localStorage بود)
- robots.txt و sitemap.xml از بکاند + سرو /blog و /projects با تزریق title/description/OG/JSON-LD از دیتابیس برای خزندههای بدون JS (app/seo_pages.py)
- فرانت: applySeo در seo.ts (OG/توییتر/canonical/JSON-LD)، ادغام پیشنویس برای ادمین، برچسب پیشنویس در وبلاگ، حالت خالی وبلاگ، دکمه انتشار در صفحه نوشتن
- تغییر رمز ادمین POST /api/auth/change-password + دیالوگ «رمز» در نوار مدیریت
- محدودسازی ورود: ۵ تلاش ناموفق در ۱۵ دقیقه از هر IP → 429
- ساخت دکمه + برای ردیف سئوی صفحههای بدون ردیف (SingletonPill)
- تستهای pytest (۱۵ مورد) + پینکردن requirements + حذف package.json سرگردان فرانت
- پنل «بررسی سئو» در صفحه نوشتن مقاله — سبز/نارنجی/قرمز سازگار با فارسی:
طول عنوان، کلمه کلیدی هدف (در عنوان/پاراگراف اول/تیتر H2)، طول چکیده،
تعداد واژه، تیتربندی، متن جایگزین تصاویر، پیوندها و slug.
کلمه کلیدی در localStorage نگه داشته میشود (راهنمای ویرایشگر است، نه محتوا)
- جدول seo_meta: عنوان و توضیح متای هر صفحه (page_key برای هر ۸ صفحه،
seed خودکار، CRUD در /api/admin/seo-meta، خواندن در GET /api/site)
- تزریق عنوان/توضیح متا در فرانتاند: صفحههای فهرست از دیتابیس؛ صفحه
مقاله و پروژه از محتوای خودشان (بدون تداخل با اثر سطح والد)
- دکمه سئو روی هیرو هر صفحه و کنار هیرو صفحه اصلی (فقط حالت ویرایش)
- PATCH /api/admin/{resource}/{id} — ویرایش جزئی؛ فقط فیلدهای ارسالشده
بهروزرسانی میشوند (PUT قبلاً کل رکورد را جایگزین میکرد و برای
ویرایش زنده قابل استفاده نبود). اسکیماهای Patch بهصورت خودکار از
اسکیماهای In با create_model ساخته میشوند (هر ۲۴ منبع).
- ستون position برای ۱۴ جدول مجموعهای (خدمات، پروژهها، مقالات، نظرات،
سوالات، تیم، تایملاین، آمار، چرا آرامش، مدلهای سرمایهگذاری، مراحل کار،
دفاتر، گالری، منو) — مهاجرت سبک idempotent در startup و seed
(ALTER TABLE ADD COLUMN IF NOT EXISTS) تا دیتابیسهای موجود هم ارتقا یابند
- POST /api/admin/{resource}/reorder — ذخیره ترتیب جدید بر اساس لیست id
- خواندن عمومی بر اساس (position, id) مرتب میشود؛ رکورد جدید در انتهای لیست
- seed فقط جدولهای خالی را با position صحیح پر میکند
- main.py: عنوان و توضیحات اپ FastAPI و نام اپ در پاسخ سلامت (ArameshPlaza API به Aramesh Building Group API)
- api/public.py: نام اپ در پاسخ سلامت
- seed.py و seed_data.py: توضیحات اسکریپت و دادههای اولیه (نام برند، ایمیل، تایملاین، تستیمونیال، FAQ)
- README و README بکاند: متنهای مرتبط با برند
شناسههای داخلی دیتابیس (نام دیتابیس arameshplaza) بدون تغییر باقی ماندهاند.
- اتصال کامل فرانت به API: همه محتوای سایت (پروژهها، مقالات، خدمات، برند و...) از بکاند خوانده میشود (SiteProvider + useSite)
- فرم تماس و خبرنامه متصل به بکاند و تستشده در مرورگر
- ساختار مونوریپو: frontend/ + backend/
- Dockerfile برای هر دو بخش + docker-compose (PostgreSQL + FastAPI + nginx)
- nginx با پروکسی /api — بدون نیاز به CORS در حالت داکر
- README کامل فارسی