אפליקציית דמו אחד ועוד אחד פיתוח תוכנה לוגו

איך בונים אפליקציה חדשה מהתבנית

דף ההנחיות הקנוני — לבני אדם ול-Claude. ‏DemoAppCore הוא קוד-המקור של השיטה: כל אפליקציה חדשה של אחד ועוד אחד מתחילה כהעתק שלו.

1 · מתחילים

  • מעתיקים את מבנה הפתרון: ‏DataAccessLayer, ‏BusinessLogicLayer, ‏UI, ואפליקציית Web (על בסיס DemoApp).
  • ‏DAL ו-UI מועתקים ביט-אחר-ביט — הם הקאנון ואסור לשנות אותם פר-פרויקט. תיקון כללי? קודם כאן בתבנית.
  • שם הפרויקט, ‏namespace, לוגו וכותרת — מוחלפים באפליקציה בלבד.
  • פורט פיתוח ייחודי לכל אפליקציה (‏launchSettings) — לא לשכפל פורטים בין פרויקטים.
  • קיים סקיל אוטומטי: ‏new-app-from-demoappcore.

2 · ישות חדשה (BLL)

public class Invoice : Record
{
    [Column(Size = 300)]
    public override string Description { get; set; }
    [Column] public double Amount { get; set; }
    [Column] public DateTime Issued { get; set; }
    [Column] public bool IsPaid { get; set; }
}
  • הטבלה נוצרת/מתעדכנת לבד ב-SetupAsync — אין כתיבת SQL ואין מיגרציות.
  • שמות טבלאות ביחיד. ‏DateTime.MinValue = אין תאריך.
  • ישות שאינה טבלה אמיתית (דמו/תצוגה): ‏[Table(Ignore = true)].
  • נתוני seed: דריסת CreateAsync בישות (כמו ב-Settings).

3 · מסך ניהול

// DemoApp/Tables/InvoicesTable.cs
public class InvoicesTable : TableMakerEx<Invoice>
{
    public InvoicesTable()
    {
        this["Description"].HeaderText = "תיאור";
        this["Amount"].HeaderText = "סכום";
        this["IsPaid"].HeaderText = "שולם";
        this["IsPaid"].Filterable = true;
    }
}

// Pages/Invoices.html
<h1>חשבוניות</h1>
<div id="InvoicesTable" class="table"></div>

// Code/App.cs
public ReturnDetails Invoices() => AdminPage("Invoices");

// Pages/Main.html — כפתור בתפריט
<input type="button" id="Invoices" value="חשבוניות" />

זה מסך שלם: טבלה, מיון, סינון, טופס, ייצוא. בלי JS ובלי SQL.

4 · דפים שאינם טבלה

  • דף = קובץ HTML ב-wwwroot/Pages + מתודה ב-App שמחזירה ReturnDetails.
  • כפתור מפעיל מתודה לפי ה-id שלו — בלי onclick, בלי endpoint חדש.
  • פרמטרים מהדף מגיעים ב-Data (מילון); תשובת השרת יכולה להזרים html, ‏popUp, ‏script או מילוי רשימות.
  • דפי Pages/ חסומים לגישה ישירה מהדפדפן — הם מוגשים רק דרך ButtonClicked.
  • מצב האפליקציה (מאפייני App) נשמר בין קריאות — מוצפן ודחוס אצל הלקוח.

5 · תוכן, ‏SEO ורב-לשוניות

  • עמוד תוכן = רשומה (ContentPage), לא קובץ: כתובת ידידותית, ‏H1, ‏title נפרד, תיאור, תמונת שיתוף ונתונים מובנים. נערך במסך "עמודי תוכן".
  • רינדור בצד שרת לכל דף ציבורי (Code/Seo.cs): התגובה הראשונה כוללת את התוכן ואת ה-<head> המלא. ממשק הניהול נשאר SPA ומקבל noindex.
  • מסך חדש שאמור להיות באינדקס: להוסיף אותו ל-Seo.PublicMethods ולתת לו PageMeta ב-PageMeta.Screens. מסך ניהול — ל-AdminMethods.
  • מטא שמורה או מחושבת עוברות דרך ממשק אחד — IPageMeta. דף שנוצר דינמית בונה PageMeta.For("/…").Titled(…) בזמן ריצה.
  • כל שינוי כתובת מחייב שורה ב"ניתובים" (PageRedirect), אחרת כל קישור חיצוני נשבר בשקט. הכתובת המספרית הישנה (/Page@41) נשארת פתירה לנצח.
  • sitemap.xml ו-robots.txt נבנים לבד מהנתונים; הצ'רום מתורגם בטוקנים ({טקסט}Word), וקופי ארוך נכתב כרשומה לכל שפה.
  • slug תמיד באנגלית, אותיות קטנות ומקפים. שפת ברירת המחדל על השורש, שאר השפות תחת /en/; תגי hreflang נגזרים לבד מ-Identify המשותף.
  • בייצור: למלא SiteBaseUrl בהגדרות — הקנוניקל והסייטמאפ נשענים עליו.

6 · כללי קוד מחייבים

  • reuse-first: לפני כל פיתוח בודקים מה כבר קיים ב-Util, ‏DAL ו-UI.
  • אסינכרוני בלבד: אין קריאות DB סינכרוניות; ‏async זורם עד הקונטרולר.
  • עדכון ממוקד:UpdatePropertiesAsync("Col") ולא שמירה מלאה.
  • עיצוב ב-CSS בלבד, מידות ב-rem; שינוי CSS/JS ⇐ העלאת ?v=.
  • ‏Settings ב-DB, לא ב-appsettings; ‏DB פיתוח = localhost/SQLite.
  • שדות שאינם עברית (אימייל, טלפון) — ‏LTR.
  • עבודות רקע חייבות להיות ניתנות לחידוש (resumable).

7 · לפני שמסיימים

  • ‏build נקי — בלי אזהרות פתוחות.
  • ‏code-review על ה-diff + חוות דעת שנייה (Gemini).
  • בדיקת עשן אמיתית בדפדפן — הזרימה המלאה, לא רק קומפילציה.
  • ‏commit ל-SVN עם הודעה עניינית; קובצי \u200E.md נכנסים גם הם.
  • פריסה: תיקייה ניידת (self-contained); ל-PROD רק באישור מפורש.