آمار بازدید سایت در MVC

پنجشنبه 15 مرداد 1394

در این مقاله قصد داریم آمار سایت از قبیل بازدید امروز ، بازدید دیروز ، بازدید کل و افراد آنلاین را به صورت واقعی در MVC بررسی کنیم .

آمار بازدید سایت در MVC

ابتدا یک DataBase با نام StateSite_MVC_DB ایجاد میکنیم و جدول زیر را در آن ایجاد میکنیم

نام جدول : StateSite

 

میتوانید بعد از ساختن بانک اسکریپت زیر را روی بانک اجرا نمایید تا جدول ساخته شود

USE [StateSite_MVC_DB]
GO

/****** Object:  Table [dbo].[StateSite]    Script Date: 08/06/2015 10:02:27 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[StateSite](
	[ID] [int] IDENTITY(1,1) NOT NULL,
	[Date] [date] NOT NULL,
	[Count] [int] NOT NULL,
 CONSTRAINT [PK_StateSite] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO


 

سپس یک پروژه جدید با نام StateSite_Mvc ایجاد کنید

جهت محسابه و افزایش بازدید یک کلاس با نام StateClass.cs ایجاد میکنیم

ما تصمیم داریم که آمار بازدید دقیقی ایجاد کنیم به همین علت باید هر شخص در هر روز یکبار شمارش شود.

ابتدا یک متد با نام CountUpState برای افزایش بازدید ایجاد میکنیم که بعد از صدا زده شدن یک واحد به بازدید سایت و تاریخ امروز اضافه میکند

       static void CountUpState()
        {
            using (StateSite_MVC_DBEntities db = new StateSite_MVC_DBEntities())
            {
                DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                var state = db.StateSite.FirstOrDefault(f => f.Date == dt);
                if (state != null)
                {
                    state.Count += 1;
                }
                else
                {
                    db.StateSite.Add(new StateSite()
                    {
                        Date = dt,
                        Count = 1
                    });
                }
                db.SaveChanges();
            }

            
        }

 

سپس یک متد با نام CounterState ایجاد میکنیم

        public static void CounterState()
        {

            DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
            if (HttpContext.Current.Request.Cookies["StateSite"] != null)
            {
                if (Convert.ToDateTime(HttpContext.Current.Request.Cookies["StateSite"].Value.ToString()) != dt)
                {
                    HttpCookie cookieCode = new HttpCookie("StateSite", dt.ToString());
                    HttpContext.Current.Response.Cookies.Add(cookieCode);
                    CountUpState();
                }
            }
            else
            {
                CountUpState();
                HttpCookie cookie = new HttpCookie("StateSite");
                cookie.Value = dt.ToString();
                HttpContext.Current.Response.Cookies.Add(cookie);
            }


        }

کد بالا توسط کوکی چک میکند که کاربر امروز بادید داشته یا خیر ، اگر خیر بود متد CountUpState را صدا زده و سپس یک کوکی با تاریخ امروز ست میکند

سپس در Global.asax در رویداد Session_Start متد را صدا میزنیم

     protected void Session_Start()
        {
          
            StateClass.CounterState();
        }

برای محاسبه افراد آنلاین در همان Global و در رویداد Application_Start یک کالکشن از Application ایجاد میکنیم برای نگهداری افراد آنلاین

       protected void Application_Start()
        {
            HttpContext.Current.Application["OnlineUser"] = 0;

        }

در رویداد Session_Start یک واحد به افراد آنلاین اضافه میکنیم

      protected void Session_Start()
        {
            HttpContext.Current.Application["OnlineUser"] = ((int) HttpContext.Current.Application["OnlineUser"] + 1);

        }

و در Session_End یک واحد کم کینیم

      protected void Session_End()
        {
            HttpContext.Current.Application["OnlineUser"] = ((int)HttpContext.Current.Application["OnlineUser"] - 1);
        }

سپس برای نمایش یک کلاس با نام ShowStateViewModel ایجاد میکنیم

    public class ShowStateViewModel
    {
        public int SeeToday { get; set; }

        public int SeeYesterday { get; set; }

        public int SeeSum { get; set; }

        public int OnlineUser { get; set; }
    }

یک متد در کلاس StateClass با نام ShowState جهت جمع آوری اطلاعات بازدید امروز ، دیروز ، کل و افراد آنلاین ایجاد میکنیم

        public static ShowStateViewModel ShowState()
        {
            using (StateSite_MVC_DBEntities db = new StateSite_MVC_DBEntities())
            {
                DateTime dt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
                DateTime dt2 = dt.AddDays(-1);
            return new ShowStateViewModel()
            {
                OnlineUser = (int)HttpContext.Current.Application["OnlineUser"],
                SeeSum = db.StateSite.Sum(s=>s.Count),
                SeeToday = db.StateSite.First(s=>s.Date==dt).Count,
                SeeYesterday = db.StateSite.Where(s => s.Date == dt2).Select(s => s.Count).FirstOrDefault()
            };
            }
        }

 

سپس در کنترل Home یک اکشن با نام ایجاد ShowState میکنیم که خروجی آن یک PartialView است

  public ActionResult ShowState()
        {
            return PartialView(StateClass.ShowState());
        }

 

کد View :

@model StateSite_Mvc.Models.ShowStateViewModel
<ul class="list-group">
    <li class="list-group-item">
        <span class="badge">@Model.SeeToday</span>
        بازدید امروز
    </li>
    <li class="list-group-item">
        <span class="badge">@Model.SeeYesterday</span>
        بازدید دیروز
    </li>
    <li class="list-group-item">
        <span class="badge">@Model.SeeSum</span>
        بازدید کل
    </li>
    <li class="list-group-item">
        <span class="badge">@Model.OnlineUser</span>
        افراد آنلاین
    </li>
</ul>

در View ایندکس پارشیال را صدا میزنیم

<div class="row">
    <div class="col-md-4 col-md-offset-4">
@Html.Action("ShowState","Home",new{area=""})
    </div>
</div>

خروجی کار به شکل زیر است

فایل های ضمیمه

ایمان مدائنی

نویسنده 1299 مقاله در برنامه نویسان

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید