- مقالهها ستون 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 سرگردان فرانت
44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
// انواع مشترک دادهها — همه محتوای متنی سایت از بکاند (GET /api/site) بارگذاری میشود.
|
|
|
|
export type Service = {
|
|
id: number;
|
|
title: string;
|
|
desc: string;
|
|
icon: 'draft' | 'tower' | 'mall' | 'villa' | 'renew' | 'manage' | 'invest' | 'landscape';
|
|
};
|
|
|
|
export type ProjectStatus = 'done' | 'progress';
|
|
|
|
export type Project = {
|
|
id: number;
|
|
slug: string;
|
|
title: string;
|
|
location: string;
|
|
year: string;
|
|
status: ProjectStatus;
|
|
image: string;
|
|
gallery: string[];
|
|
area: string;
|
|
floors: string;
|
|
units: string;
|
|
client: string;
|
|
summary: string;
|
|
body: string[];
|
|
};
|
|
|
|
/** سند TipTap (ProseMirror) — بدنه ساختاریافته مقاله */
|
|
export type ArticleBodyDoc = { type: 'doc'; content: unknown[] };
|
|
|
|
export type ArticleStatus = 'draft' | 'published';
|
|
|
|
export type Article = {
|
|
id: number;
|
|
slug: string; title: string; date: string; category: string; image: string; read: string; excerpt: string;
|
|
/** سند TipTap — ردیفهای قدیمی ممکن است هنوز لیست پاراگراف باشند */
|
|
body: ArticleBodyDoc | string[];
|
|
/** پیشنویس فقط برای ادمین (از انتهای مدیریتی) میآید؛ بازدیدکننده نمیبیند */
|
|
status: ArticleStatus;
|
|
/** کلمه کلیدی هدف چکلیست سئو — راهنمای نوشتن، در سایت نمایش داده نمیشود */
|
|
seo_keyphrase: string;
|
|
};
|