ورود

View Full Version : سوال: آمار بازدید کننده وکل یازدید کنندگان



r4hgozar
جمعه 19 دی 1393, 08:46 صبح
سلام دوستان.
من جستجو کردم و تمام تاپیک های مربوط رو خوندم اما هیچ کدوم نیومدن بصورت عملی بیان و آماز بازدید کننده رو در mvc توضیح بدن.
یکسری کد در mvc بود که نمی شه دقیقا مثل اون رو در mvc پیاده کرد.
اگه امکان داره دوستان نمونه کد ساده ای رو در اینجا یا یک پروژه که فقط آمار بازدید کننده رو نشون بده در اینجا قرار بدن تا همه استفاده کنن.
ممنون.
موفق باشید

par4parvaz
جمعه 19 دی 1393, 15:07 عصر
سلام
من یه جدول تو دیتابیس ایجاد کردم به این شکل
127408


یه کلاس در پوشه Model ایجاد کردم به اسم StateSites :

public class StateSites
{
public int ToodySee { get; set; }
public int YesterDaySee { get; set; }
public int All { get; set; }
}


بعد یه کلاس ایجاد کردم که عملیات های مربوط به بازدید رو انجام می دن (اسم کلاس p4p گذاشتم)

private static bool CheckDate()
{
KalayeKhab_DBEntities1 db = new KalayeKhab_DBEntities1();
DateTime dt = DateTime.Now.Date;
var statics = db.StateSite.Where(p => p.Date.Equals(dt)).FirstOrDefault();
if (statics == null)
{
return false;
}
else
return true;
}


public static void SeeSite()
{
KalayeKhab_DBEntities1 db = new KalayeKhab_DBEntities1();
if (CheckDate())
{
StateSite st = db.StateSite.Where(p => p.Date.Year == DateTime.Now.Year && p.Date.Month == DateTime.Now.Month && p.Date.Day == DateTime.Now.Day).FirstOrDefault();
st.See = st.See + 1;
db.Entry(st).State = EntityState.Modified;
db.SaveChanges();
}
else
{
StateSite st = new StateSite();
st.Date = DateTime.Now;
st.See = 1;
db.StateSite.Add(st);
db.SaveChanges();
}
}


public static StateSites GetState()
{
KalayeKhab_DBEntities1 db = new KalayeKhab_DBEntities1();
StateSites st = new StateSites();
var states = db.StateSite.ToList();
st.ToodySee = states.Where(p => p.Date.Year == DateTime.Now.Year && p.Date.Month == DateTime.Now.Month && p.Date.Day == DateTime.Now.Day).Select(s => s.See).FirstOrDefault();
st.YesterDaySee = states.Where(p => p.Date.Year == DateTime.Now.Year && p.Date.Month == DateTime.Now.Month && p.Date.Day == DateTime.Now.Day - 1).Select(s => s.See).FirstOrDefault();
st.All = states.Sum(p => p.See);
return st;
}


حالا داخل فایل global.asax در قسمت Seesion_strart این کد رو اضافه کردم:

protected void Session_Start(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
p4p.SeeSite();
Application.UnLock();
}


حالا جایی که خواستم آمار بازدید رو نشون بدم اینطوری عمل کردم:
مثلا در فایل layout.cshtml



KalayeKhab.Models.StateSites st = KalayeKhab.Classes.p4p.GetState();




و

<ul class="footer-social">

<li><a href="#" title="" data-original-title="بازدید امروز @st.ToodySee"><i class="fa fa-eye"></i></a></li>
<li><a href="#" title="" data-original-title="بازدید دیروز @st.YesterDaySee"><i class="fa fa-eye"></i></a></li>
<li><a href="#" title="" data-original-title="بازدید کل @st.All" aria-describedby="tooltip749083"><i class="fa fa-eye"></i></a></li>
<li><a href="#" title="" data-original-title="افراد آنلاین @HttpContext.Current.Application["OnlineUsers"].ToString()"><i class="fa fa-eye"></i></a></li>
</ul>

برای افراد آنلاین هم فقط در فایل global.asax در protected void Application_Start() این کد رو اضافه کردم :

Application["OnlineUsers"] = 0;


و در قسمت Session_End هم اینطوری عمل کردم:



protected void Session_End(object sender, EventArgs e)
{
Application.Lock();
Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
Application.UnLock();
}
و برای Session_Strat هم که بالاتر کدش و گذاشتم.

helpsos
جمعه 19 دی 1393, 15:37 عصر
روشی که شما در بالا گفتین خوبه وا ولی ..........
فکرشو بکن اگه یه سایت پربازدید باشه بانک اطلاعاتیت داغون میشه فکر کنم.

par4parvaz
جمعه 19 دی 1393, 15:41 عصر
از چه نظر میگید داغون میشه؟
به ازای هر روز یک رکورد در جدول ثبت میشه، میشه سالی 365 رکورد.

helpsos
جمعه 19 دی 1393, 15:58 عصر
به ازای هر روز یک رکورد در جدول ثبت میشه، میشه سالی 365 رکورد.
به ازای هر روز یا هر بازدید کننده؟!

par4parvaz
جمعه 19 دی 1393, 16:12 عصر
به ازای هر روز یا هر بازدید کننده؟!
به ازای هر روز.
ما می خوایم بدونیم امروز چند تا بازدید داشتیم، پس برای تاریخ امروز فقط تعداد see رو افزایش می دیم.
نمی تونیم دوتا رکورد با تاریخ یکسان داشته باشیم.

r4hgozar
جمعه 19 دی 1393, 17:58 عصر
ممنون دوست عزیز

r4hgozar
یک شنبه 21 دی 1393, 06:08 صبح
سلام.
این کد خیلی خوبه.
اما مشکلش اینجاست که هر بار میره و از دیتابیس date رو چک می کنه.
این کارایی رو پایین میاره.

alireza_s_84
یک شنبه 21 دی 1393, 10:09 صبح
سلام پیاده سازی یک سیستم آمار خیلی سخت نیست.
برای بازدیدهای امروز شما میتونید توی رویداد Session_Start تعداد افراد آنلاین رو یک واحد افزایش ، یک بازدید به جدول بازدیدها اضافه کنید.
توی رویداد Begin_Request هم میتونید تعداد بازدیدکننده های روز قبل رو بیرون بکشید و توی کش نگهداری کنید و ساعت 12 هرشب کش رو رفرش کنید.



روشی که شما در بالا گفتین خوبه وا ولی ..........
فکرشو بکن اگه یه سایت پربازدید باشه بانک اطلاعاتیت داغون میشه فکر کنم.
اگر نیاز به تحلیل رفتارهای کاربران سایتتون دارین بی شک لازمه توی هر درخواست (حتی درخواست های ایجکس) تمامی درخواست ها رو ثبت کنید. بهترین راه نگهداری درخواست ها دیتابیسه و ممکنه روزانه 1000 تاکاربر 1000 تا درخواست داده باشن پس داغون شدن بانک اطلاعاتی یک نظر کاملا غیرعلمی هست.
اگر منظورتون بار و حجم کاری روی دیتابیس هست ، فقط کمی به دیتابیس گوگل ، فیسبوک ، توییتر و ... بندازید تا ببینید این اطلاعاتی که من و شما ثبت میکنیم تقریبا هیچ هست. پس جای هیچ نگرانی نیست.
موفق باشید

alireza_s_84
یک شنبه 21 دی 1393, 10:18 صبح
سلام دوستان.
من جستجو کردم و تمام تاپیک های مربوط رو خوندم اما هیچ کدوم نیومدن بصورت عملی بیان و آماز بازدید کننده رو در mvc توضیح بدن.
یکسری کد در mvc بود که نمی شه دقیقا مثل اون رو در mvc پیاده کرد.
اگه امکان داره دوستان نمونه کد ساده ای رو در اینجا یا یک پروژه که فقط آمار بازدید کننده رو نشون بده در اینجا قرار بدن تا همه استفاده کنن.
ممنون.
موفق باشید

توی فایل Global.asax به شکل زیر عمل کنید:
protected void Application_Start() {
Application.Lock();
Application["Status"] = new Status();
Application.UnLock();
}
با شروع کار سرویس شما یک شئی از کلاس Status میسازید و توی شئی Application قرار میدین. (کلاس Status رو هم در انتها قرار میدم)
بعد برای ثبت آمار:
protected void Session_Start() {
if (Application["Status"] == null)
{
Application.Lock();
Application["Status"] = new Status();
Application.UnLock();
}


Application.Lock();
Status state = (Status)Application["Status"];
state.LastDayVisits = LastDayVisits();
state.TodayVisits += 1;
state.OnlineUsers += 1;
Application.UnLock();
}

در رویداد Session_Start تعداد افراد آنلاین رو یک واحد افزایش میدیم. متد LastDayVisits کار واکشی و پر کردن کش رو برای ما انجام میده.
private int LastDayVisits() {
int? result = HttpContext.Current.Cache["LastDayVisits"] as int?;
if (!result.HasValue)
{
using (var db = new Nonama_dbEntities())
{
result = db.GetVisitsAtDate(DateTime.Today.AddDays(-1)).First().Value;


HttpContext.Current.Cache.Insert("LastDayVisits", result, null, DateTime.Today.AddHours(24), Cache.NoSlidingExpiration);
Application.Lock();
Status state = (Status)Application["Status"];
state.TodayVisits = db.GetVisitsAtDate(DateTime.Today).First().Value;
Application.UnLock();
}
}




return result.Value;
}
در مورد متد بالا اگر مشکلی داشتین بفرمایید توضیح میدم
و در نهایت با خروج کاربر و اتمام جلسه:
protected void Session_End() {
string sid = Session.SessionID;


Application.Lock();
Status state = (Status)Application["Status"];
state.OnlineUsers -= 1;
Application.UnLock();
}
کلاس Status
public class Status {
public int TotalUsers { get; set; }
public int OnlineUsers { get; set; }
public int LastDayVisits { get; set; }
public int TodayVisits { get; set; }
public int TotalPosts { get; set; }


public Status()
{
using (var db = new Nonama_dbEntities())
{
this.TotalUsers = db.GetUsersCount().First().Value;
this.OnlineUsers = 0;
this.LastDayVisits = db.GetVisitsAtDate(DateTime.Today.Subtract(TimeSpa n.FromDays(1))).First().Value;
this.TodayVisits = db.GetVisitsAtDate(DateTime.Today).First().Value;
this.TotalPosts = db.GetPostsCount().First().Value;
}
}
}