تقييم الموضوع :
  • 1 أصوات - بمعدل 5
  • 1
  • 2
  • 3
  • 4
  • 5
إنشاء موقع لبيع برامج المنتدى
#1
نحمده ونصلي على رسوله الكريم
السلام عليكم ورحمة الله

نبدأ مشروع جديد من نوع ASP.NET Web Application اسمه VB4ArbPrograms، ثم بعد ذلك نقوم بإضافة قاعدة بيانات للمشروع من خلال:





نضيف جدول اسمه Titles:
* لتخزين عنوان الموقع ونص الحقوق.



الأعمدة كما يلي:



لا ننسى أن نجعل خاصية العمود ID مفتاح اساسي وترقيم تلقائي، بالضغط على العمود برز الفأرة الأيمن:



ثم من الخصائص أسفل الصفحة:



نضيف جدول آخر اسمه EMailOptions:
* لتخزين بيانات الإيميل، التي سوف نحتاجها عند التواصل مع الزبائن.



وجدول آخر اسمه UserInfo:
* لتخزين بيانات المستخدمين.



وآخر اسمه Websites:
* مواقع مفيدة.



وآخر اسمه Guestbook:
* سجل الزوار.



وآخر اسمه ContactUs:
* اتصل بنا.



وآخر اسمه Parts:
* أقسام الموقع، سواء الرئيسية أو الفرعية.



وآخر اسمه Programs:
* برامج المستخدمين وبياناتها.



وآخر اسمه Orders:
* طلبات الزبائن.



والأخير اسمه Details:
* جدول فرعي تابع لطلبات الزبائن، قد يشتري الزبون أكثر من برنامج دفعة واحدة.



الآن ننتقل للعلاقات:



قم بإضافة الجداول التالية:



اضغط على حقل ID من جدول Part واسحبه على حقل PID من جدول Programs.
اضغط موافق بعد التأكد من الاعمدة الظاهرة في النموذج، ثم عدل الخيارات كما يلي:



ثم حقل ID من جدول Orders اسحبه على حقل OID من جدول Details، واصنع كما سبق.



نذهب لجدول Titles ونضغط بزر الفأرة الأيمن، ثم نختار:



ثم ندخل بيانات افتراضية عليه:

HeaderText: برامج منتدى فجوال بيسك لكل العرب.
FooterText: جميع الحقوق محفوظة © 2013.
الرد }}}}
تم الشكر بواسطة:
#2
شراح رائع انا متابعك يا اخ الغالي ...
الرد }}}}
تم الشكر بواسطة:
#3
احمد ربى ان لى صديق اسمه الاستاذ ربيع (DreamsDotNet)
لما به من صفات تجعل الانسان يحترمه ويحبه.
ذادك الله من علمه وبارك فيك اخى ربيع
والى الامام دائماّ
"الناس نيام فإذا ماتوا إنتبهوا"
الرد }}}}
تم الشكر بواسطة:
#4
السلام عليكم

جزاك الله كل خير اخي ربيع بارك الله فيك

موفق ان شاءالله بانتظار تكملة الموضوع
الرد }}}}
تم الشكر بواسطة:
#5
من الـ Solution Explorer، نختار المشروع ونضيف اليه مجلدات جديدة:



مجلد باسم: Admin
وآخر باسم: Programmers
وآخر باسم: Programs

نعود لتحديد المشروع، ثم نختار:



* الخطوات التالية، للحماية وإضافة الصلاحيات على الموقع.























قم بتحميل أدوات Ajax Control Toolkit، واضفهن لصندوق الادوات.

الرد }}}}
تم الشكر بواسطة:
#6
نذهب لصفحة Site.Master، داخل كود HTML الخاص بالصفحة نضع Label بدل العنوان الافتراضي:[HTML]<div class="title">
   <h1>
       <asp:Label ID="title" runat="server" Text="برامج منتدى فجوال بيسك لكل العرب"></asp:Label>
   </h1>
</div>
[/HTML]ونضع Label آخر في ذيل الصفحة:[HTML]<div class="footer">
   <asp:Label ID="footer" runat="server" Text="جميع الحقوق محفوظة © 2013"></asp:Label>
</div>
 [/HTML]
نرجع لعنوان الصفحة، من داخل التصميم وليس من كود الـ HTML، نضع بجانبه أداة LoginView، ثم نعدل فيها كما يلي:







داخل الأداة - وبعد أن نختار منها العرض بصلاحيات Admin - نضع أداة Image (سوف ارفق الصورة المطلوبة إن شاء الله)، وأداة Panel، وداخل الـ Panel نضع جدول:





في الصف الثاني من الجدول وفي الحقل الأول نضع Label نصه: نص العنوان.
وفي الحقل الثاني نضع أداة TextBox خاصية الـ ID = tbox وبجانبها أداة RequiredFieldValidator:



خاصية الـ ErrorMessage = مطلوب.
وخاصية الـ ControlToValidate = tbox
في الحقل الثاني من الصف الأخير، نضع زرين، الأول نصه (حفظ) والثاني نصه (إلغاء الأمر).
نرجع للصف الأول وندمج الحقلين مع بعضهما، بعد تحديدهما:



ثم نضع بداخله أداة Panel، وداخل الـ Panel نضع Label نصه: عنوان الموقع.
لنضبط الشكل قليلا، من الـ Solution Explorer نذهب لمجلد الـ Styles ثم نضيف إليه عنصر جديد من نوع Style Sheet، ليكن اسمه Config. سوف ارفقه مع المشاركة إن شاء الله.
الآن نحدد الصورة التي وضعناها فيما سبق، ثم نذهب لصندوق الأدوات، ونضغط مرتين على أداة ModalPopupExtender التابعة لحزمة أدوات Ajax Control Toolkit:



وبعد ذلك نتوجه لنافذة الخصائص، سنجد فيها خاصية جديدة مدرج تحتها مجموعة من الخصائص:



قم بتغيير الخصائص كما الصورة.
نختار زر (حفظ) ونضغط عليه مرتين لنكتب الكود التالي:
في أعلى الكود وخارج الإجراءات نكتب:
:#C
كود :
[align=left][SIZE=4]private DB.ProgramsDB db = new DB.ProgramsDB();
[/SIZE][/align]

:VB
كود :
[align=left][SIZE=4]private DB.ProgramsDB db = new DB.ProgramsDB()[/SIZE][/align]

وفي حدث تحميل الصفحة Page_Load نكتب:
:#C
كود :
[align=left][SIZE=4]if (IsPostBack) return;

try
{
   var data = (from d in db.Titles select d).SingleOrDefault();
   title.Text = data.HeaderText;
   footer.Text = data.FooterText;

   ((TextBox)LoginView1.FindControl("tbox")).Text = title.Text;
}
catch { }
[/SIZE][/align]

:VB
كود :
[align=left][SIZE=4]If IsPostBack Then Exit Sub

Try
   Dim data = (From d In db.Titles Select d).SingleOrDefault()
   title.Text = data.HeaderText
   footer.Text = data.FooterText

   CType(LoginView1.FindControl("tbox"), TextBox).Text = title.Text
Catch
End Try[/SIZE][/align]

وفي حدث ضغط زر (حفظ):
:#C
كود :
[align=left][SIZE=4]try
{
   var data = (from d in db.Titles select d).SingleOrDefault();
   data.HeaderText = ((TextBox)LoginView1.FindControl("tbox")).Text;
   db.SubmitChanges();
   title.Text = data.HeaderText;
}
catch { }[/SIZE][/align]

:VB
كود :
[align=left][SIZE=4]Try
   Dim data = (From d In db.Titles Select d).SingleOrDefault()
   data.HeaderText = CType(LoginView1.FindControl("tbox"), TextBox).Text
   db.SubmitChanges()
   title.Text = data.HeaderText
Catch
End Try
[/SIZE][/align]

سوف نصنع مع ذيل الصفحة كذلك، وسأكتفي بشرح ما السابق، وأرفق الملفات....
* اعتمدت على مترجم لترجمة الكود من C# لـ VB.
* ضع الملفات والمجلدات المرفقة كما هي داخل المشروع، وقم باستبدال القديم.


الملفات المرفقة
.zip   VB4ArbPrograms.zip (الحجم : 17.37 ك ب / التحميلات : 21)
الرد }}}}
تم الشكر بواسطة:
#7
لنضيف صفحة لاستعراض القسم باسم Part:





وصفحة أخرى لاستعراض البرنامج باسم Program، بنفس الطريقة.

عند طلب احدى هذه الصفحات لابد وأن نرسل لها رقم القسم أو البرنامج لاستعراضه، من خلال الـ QueryString، وسيكون العنوان كما يلي:

http://localhost/Part.aspx?id=38
http://localhost/Program.aspx?id=641

هناك خاصية في الـ asp.net اسمها urlrewrite، ماذا تعني هذه الخاصية؟ تعني أن يصبح الرابط السابق بهذا الشكل:

http://localhost/Part/38
http://localhost/Program/641

سوف نستخدم هذه الخاصية في تطبيقنا إن شاء الله، وذلك بالذهاب لملف Global.asax من نافذة Solution Explorer، ثم نضع الإجراء التالي بداخله:
:#C
كود :
[align=left][SIZE=4]public static void RegisterRoutes(RouteCollection routeCollection)
{
    routeCollection.MapPageRoute("Part", "Part/{Id}", "~/Part.aspx");
    routeCollection.MapPageRoute("Program", "Program/{Id}", "~/Program.aspx");
}
[/SIZE][/align]


:VB
كود :
[align=left][SIZE=4]Public Shared Sub RegisterRoutes(ByVal routeCollection As RouteCollection)
    routeCollection.MapPageRoute("Part", "Part/{Id}", "~/Part.aspx")
    routeCollection.MapPageRoute("Program", "Program/{Id}", "~/Program.aspx")
End Sub[/SIZE][/align]


وفي إجراء Application_Start نضع:
:#C
كود :
[align=left][SIZE=4]RegisterRoutes(RouteTable.Routes);[/SIZE][/align]


:VB
كود :
[align=left][SIZE=4]RegisterRoutes(RouteTable.Routes)[/SIZE][/align]

الرد }}}}
تم الشكر بواسطة:
#8
سوف نخصص صفحة الخطأ 404 في تطبيقنا:
نضيف صفحة جديدة للمشروع اسمها 404.aspx ترث من الـ Site.Master.
ثم نكتب الكود التالي داخل ملف Web.config، بين:
[HTML]<system.web>
</system.web>
[/HTML]في أي مكان:[HTML]<customErrors>
<error statusCode="404" redirect="~/404.aspx"/>
</customErrors>
[/HTML]في صفحة الـ Default.aspx نضيف جدول من صف واحد وعمودين، في الحقل الأول نضع Label اسمه parts، وفي الحقل الثاني نضع Label اسمه newprog، نجعل النص فارغ في كلا الـ Label، ثم نذهب للكود لنكتب:
:#C
كود :
[align=left]private DB.ProgramsDB db = new DB.ProgramsDB();

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    try
    {
        // الأقسام
        var partdata = from d in db.Parts
                       where d.MainPart == 0
                       select d;

        parts.Text += "<b style=\"font-size: 14pt;\">تصنيفات البرامج</b><br /><table class=\"pt\">";

        int i = 1;

        foreach (var d in partdata)
        {
            if (i == 1) { parts.Text += "<tr>"; ++i; }

            parts.Text += string.Format("<td class=\"ptd\"><a href=\"Part/{0}\"><img src=\"Images/part.png\" /><br />{1}</a><br />{2}</td>", d.ID, d.PartName, d.Description);

            if (i > 2) { parts.Text += "</tr>"; i = 1; }
        }

        if (!parts.Text.EndsWith("</tr>")) parts.Text += "</tr>";
        parts.Text += "</table>";
        // ------------------------------

        // آخر خمس برامج مضافة
        var progdata = (from d in db.Programs
                       select d).Take(5).OrderByDescending(id => id.ID);

        newprog.Text = "<b style=\"font-size: 14pt;\">البرامج المضافة حديثاً</b><br /><br />";

        foreach (var d in progdata)
            newprog.Text += string.Format("<a href=\"Program/{0}\">{1}</a><br />", d.ID, d.ProgName);
    }
    catch { }
}
[/align]

:VB
كود :
[align=left]Private db As New DB.ProgramsDB()

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If IsPostBack Then Exit Sub

    Try
        ' الأقسام
        Dim partdata = From d In db.Parts
                       Where d.MainPart = 0
                       Select d

        parts.Text &= "<b style=""font-size: 14pt;"">تصنيفات البرامج</b><br /><table class=""pt"">"

        Dim i As Integer = 1

        For Each d In partdata
            If i = 1 Then
                parts.Text &= "<tr>"
                i += 1
            End If

            parts.Text += String.Format("<td class=""ptd""><a href=""Part/{0}""><img src=""Images/part.png"" /><br />{1}</a><br />{2}</td>", d.ID, d.PartName, d.Description)

            If i > 2 Then
                parts.Text &= "</tr>"
                i = 1
            End If
        Next d

        If Not parts.Text.EndsWith("</tr>") Then
            parts.Text &= "</tr>"
        End If
        parts.Text &= "</table>"
        ' ------------------------------

        ' آخر خمس برامج مضافة
        Dim progdata = (
            From d In db.Programs
            select d).Take(5).OrderByDescending(Function(id) id.ID)

        newprog.Text = "<b style=""font-size: 14pt;"">البرامج المضافة حديثاً</b><br /><br />"

        For Each d In progdata
            newprog.Text += String.Format("<a href=""Program/{0}"">{1}</a><br />", d.ID, d.ProgName)
        Next d
    Catch
    End Try
End Sub
[/align]

في صفحة الـ Part نضع Label فقط، خالي من النص واسمه: viewer، ثم نكتب الكود التالي داخل الصفحة:
:#C
كود :
[align=left]private DB.ProgramsDB db = new DB.ProgramsDB();

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack) return;

    try
    {
        // الأقسام الفرعية
        var subpart = from d in db.Parts
                      where d.MainPart == int.Parse(RouteData.Values["id"].ToString())
                      select d;

        if (subpart.Count() > 0)
        {
            viewer.Text = "<b style=\"font-size: 14pt;\">اقسام فرعية داخل هذا القسم</b><br /><table class=\"pt\">";
            int i = 1;

            foreach (var d in subpart)
            {
                if (i == 1) { viewer.Text += "<tr>"; ++i; }

                viewer.Text += string.Format("<td class=\"ptd\"><a href=\"../Part/{0}\"><img src=\"../Images/part.png\" /><br />{1}</a><br />{2}</td>", d.ID, d.PartName, d.Description);

                if (i > 2) { viewer.Text += "</tr>"; i = 1; }
            }

            if (!viewer.Text.EndsWith("</tr>")) viewer.Text += "</tr>";
            viewer.Text += "</table><br /><br />";
        }
        // ------------------------------

        // البرامج المدرجة في هذا القسم
        var prog = from d in db.Programs
                   where d.PID == int.Parse(RouteData.Values["id"].ToString())
                   select d;

        if (prog.Count() > 0)
        {
            viewer.Text += "<b style=\"font-size: 14pt;\">البرامج داخل هذا القسم</b><br /><table width=\"100%\" border=\"3\">";
            viewer.Text += "<tr><td align=\"center\"><b>اسم البرنامج</b><td align=\"center\"><b>اسم المبرمج</b></td></td>";

            foreach (var d in prog)
                viewer.Text += string.Format("<tr><td><a href=\"../Program/{0}\">{1}</a></td><td>{2}</td></tr>", d.ID, d.ProgName, d.PName);

            viewer.Text += "</table>";
        }
    }
    catch { }
}[/align]

:VB
كود :
[align=left]Private db As New DB.ProgramsDB()

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    If IsPostBack Then Exit Sub

    Try
        ' الأقسام الفرعية
        Dim subpart = From d In db.Parts
                      Where d.MainPart = Integer.Parse(RouteData.Values("id").ToString())
                      Select d

        If subpart.Count() > 0 Then
            viewer.Text = "<b style=""font-size: 14pt;"">اقسام فرعية داخل هذا القسم</b><br /><table class=""pt"">"
            Dim i As Integer = 1

            For Each d In subpart
                If i = 1 Then
                    viewer.Text &= "<tr>"
                    i += 1
                End If

                viewer.Text += String.Format("<td class=""ptd""><a href=""../Part/{0}""><img src=""../Images/part.png"" /><br />{1}</a><br />{2}</td>", d.ID, d.PartName, d.Description)

                If i > 2 Then
                    viewer.Text &= "</tr>"
                    i = 1
                End If
            Next d

            If Not viewer.Text.EndsWith("</tr>") Then
                viewer.Text &= "</tr>"
            End If
            viewer.Text &= "</table><br /><br />"
        End If
        ' ------------------------------

        ' البرامج المدرجة في هذا القسم
        Dim prog = From d In db.Programs
                   Where d.PID = Integer.Parse(RouteData.Values("id").ToString())
                   Select d

        If prog.Count() > 0 Then
            viewer.Text &= "<b style=""font-size: 14pt;"">البرامج داخل هذا القسم</b><br /><table width=""100%"" border=""3"">"
            viewer.Text &= "<tr><td align=""center""><b>اسم البرنامج</b><td align=""center""><b>اسم المبرمج</b></td></td>"

            For Each d In prog
                viewer.Text += String.Format("<tr><td><a href=""../Program/{0}"">{1}</a></td><td>{2}</td></tr>", d.ID, d.ProgName, d.PName)
            Next d

            viewer.Text &= "</table>"
        End If
    Catch
    End Try
End Sub[/align]

في صفحة الـ Program:



الكود الخاص بالصفحة:
خارج أي إجراء:
:#C
كود :
[align=left]private DB.ProgramsDB db = new DB.ProgramsDB();
[/align]

:VB
كود :
[align=left]private db As new DB.ProgramsDB()
[/align]


في حدث تحميل الصفحة:
:#C
كود :
[align=left]if (IsPostBack) return;

try
{
    var data = (from d in db.Programs
                where d.ID == int.Parse(RouteData.Values["id"].ToString())
                select d).SingleOrDefault();

    if (data == null) { Response.Redirect("~/404.aspx"); return; }

    pgname.Text = data.ProgName;
    about.Text = data.Description;
    pname.Text = data.PName;
    price.Text = data.Price.ToString();
}
catch { }[/align]

:VB
كود :
[align=left]If IsPostBack Then Exit Sub

Try
    Dim data = (From d In db.Programs
        Where d.ID = Integer.Parse(RouteData.Values("id").ToString())
        Select d).SingleOrDefault()

    If data Is Nothing Then
        Response.Redirect("~/404.aspx")
        Return
    End If

    pgname.Text = data.ProgName
    about.Text = data.Description
    pname.Text = data.PName
    price.Text = data.Price.ToString()
Catch
End Try[/align]

في حدث ضغط الـ LinkButton:
:#C
كود :
[align=left]Session[RouteData.Values["id"].ToString()] = 1;
[/align]

:VB
كود :
[align=left]Session(RouteData.Values("id").ToString()) = 1[/align]
الرد }}}}
تم الشكر بواسطة:
#9
غفلت عن أمر مهم، والتمس عذرا منكم :o

اعتمدت في المشروع تقنية اللينك linq في التعامل مع قاعدة البيانات، نسيت ذكرها بعد أن أنشأنا قاعدة البيانات، فلنقم بذلك الآن:
نضيف عنصر جديد للمشروع من نوع LINQ to SQL Classes، اسمه ProgramsDB، ثم من Server Explorer نسحب جميع الجداول اليه:





نضغط في مكان فارغ من محتوى البيانات، ونختار خصائص Properties، ثم نغير الخصائص التالية:
Context Namespace = DB
Entity Namespace = DB
Name = ProgramsDB
الرد }}}}
تم الشكر بواسطة:
#10
نضيف صفحة جديدة للمشروع اسمها Basket، سوف يكون فيها من الأدوات ما يلي:



نختار أداة GridView ونجعل اسمها: viewer، ثم نضيف إليها عمود لإزالة البرنامج من السلة:





في حدث تحميل الصفحة نكتب:
:#C
كود :
[align=left]try
{
    if (Session.Count == 0) { err.Text = "<br />لا يوجد برامج في سلة المشتريات"; Button1.Visible = false; return; }

    List<int> prog = new List<int>();
    foreach (var p in Session) prog.Add(Convert.ToInt32(p));

    DB.ProgramsDB db = new DB.ProgramsDB();

    var data = from d in db.Programs
               where prog.Contains(d.ID)
               select new { _ = d.ID, اسم_البرنامج = d.ProgName, السعر = d.Price };

    decimal am = 0;
    foreach (var d in data) am += d.السعر;

    Amount.Text = string.Format("المبلغ الإجمالي: {0} دولار.", am.ToString("00.00"));

    viewer.DataSource = data;
    viewer.DataBind();
}
catch { }
[/align]

:VB
كود :
[align=left]Try
    If Session.Count = 0 Then
        err.Text = "<br />لا يوجد برامج في سلة المشتريات"
        Button1.Visible = False
        Return
    End If

    Dim prog As New List(Of Integer)()
    For Each p In Session
        prog.Add(Convert.ToInt32(p))
    Next p

    dim db As new DB.ProgramsDB();

    Dim data = From d In db.Programs
               Where prog.Contains(d.ID)
               Select New With {Key ._ = d.ID, Key .اسم_البرنامج = d.ProgName, Key .السعر = d.Price}

    Dim am As Decimal = 0
    For Each d In data
        am += d.السعر
    Next d

    Amount.Text = String.Format("المبلغ الإجمالي: {0} دولار.", am.ToString("00.00"))

    viewer.DataSource = data
    viewer.DataBind()
Catch
End Try
[/align]

داخل حدث RowCommand التابع للأداة GridView والتي اسميناها viewer:



نكتب:
:#C
كود :
[align=left]if (e.CommandName == "remove")
{
    try
    {
        Session.Remove(viewer.Rows[Convert.ToInt32(e.CommandArgument.ToString())].Cells[1].Text);
        Page_Load(null, null);
    }
    catch { }
}
[/align]

:VB
كود :
[align=left]If e.CommandName = "remove" Then
    Try
        Session.Remove(viewer.Rows(Convert.ToInt32(e.CommandArgument.ToString())).Cells(1).Text)
        Page_Load(Nothing, Nothing)
    Catch
    End Try
End If[/align]
الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
Big Grin [مقال] تصميم موقع بيسط فى اقل من ساعة alims 5 2,693 11-08-14, 06:33 AM
آخر رد: العزابي
  بالراحة خالص(خطوة بخطوة شرح كافة صفحات المنتدى) سعود 12 1,588 22-08-13, 10:35 PM
آخر رد: سعود
  إنشاء مكتبة إلكترونية لبيع الكتب ربيع 18 2,712 16-04-13, 09:24 PM
آخر رد: م احمد فهد
  22 طريقة لتحسين أداء وتسريع موقع مبرمج ب asp.net RaggiTech 1 546 29-09-12, 12:40 PM
آخر رد: RaggiTech
  دورة تصميم موقع اخباري بasp.net الجزء الثاني ......... محمد الساعدي 4 1,479 24-09-12, 11:46 PM
آخر رد: محمد الساعدي
  اضخم موقع لتحميل القوالب المجانية مصطفى ايتي 0 519 21-09-12, 08:43 PM
آخر رد: مصطفى ايتي

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم