איך בונים אפליקציה חדשה מהתבנית
דף ההנחיות הקנוני — לבני אדם ול-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 רק באישור מפורש.