آموزش مشاهده تعداد بازدید کنندگان وب سایت با ASP.NET

مشاهده تعداد بازدیدکنندگان با پروسیجر با معماری سه لایه ، در این آموزش می خوایم با هم نمایش تعداد افراد بازدیدکندده رو در Asp.net با معماری سه لایه پیاده سازی کنیم. ابتدا کد های sql رو با هم مرور می کنیم.

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

جدول تاریخ  و تعداد بازدیدکنندگان

CREATE TABLE [dbo].[DateOnlineUser](
	[IdDateOnlinUser] [int] IDENTITY(1,1) NOT NULL,
	[date] [date] NOT NULL,
	[count] [int] NOT NULL,
 CONSTRAINT [PK_DateOnlineUser] PRIMARY KEY CLUSTERED 
(
	[IdDateOnlinUser] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


جدول ip 

CREATE TABLE [dbo].[IpDateOnlinUser](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[IdDateOnlinUser] [int] NOT NULL,
	[IP] [nvarchar](50) NULL,
 CONSTRAINT [PK_IpDateOnlinUser] 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]


چروسیجر محاسبه افراد بازد کننده 
create PROCEDURE [dbo].[onlineuser]
@ip nvarchar(12)
AS
declare @datenow date---- تاریخ امروز 
declare @idDate int -----کد تاریخ امروز 
declare @t int 
set @datenow =  CONVERT (date, SYSDATETIME()) ---گرفتن تاریخ امروز از sql 



if  EXISTS  
(select DateOnlineUser.[date]  
 from DateOnlineUser 
 where DateOnlineUser.[date] = @datenow  
 
 ) ---  چک   تاریخ   در صورت وجود  داشتن 
---- 
begin
        set @idDate=(select IdDateOnlinUser from DateOnlineUser where DateOnlineUser.[date] =@datenow);
		 SELECT @idDate;
         if (select COUNT(*)    
         from IpDateOnlinUser  , DateOnlineUser
         where IpDateOnlinUser.IP = @ip and  DateOnlineUser.IdDateOnlinUser =@idDate ) <1 


BEGIN


update  DateOnlineUser 
          set  [count]= [count]+1
          where DateOnlineUser.[date] = @datenow;
          set @idDate = ( select DateOnlineUser.IdDateOnlinUser from DateOnlineUser  where DateOnlineUser.[date] = @datenow);
 
          insert into  IpDateOnlinUser([IdDateOnlinUser] ,[IP]  )
          values (  @idDate , @ip  ) 
       select 1;

END 
end
-------------------------------------------------------------------------------

ELSE
 BEGIN 

  insert into 
     DateOnlineUser ([date]  , [count] )
     values ( @datenow , 1   );
     set @idDate=@@IDENTITY;

       insert into  IpDateOnlinUser([IdDateOnlinUser] ,[IP]  )
       values (  @idDate , @ip ) 
       select 2;
 END



GO

تعداد افراد 



CREATE PROCEDURE [dbo].[selectomnlineuseer]

AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

select ( [count] ) from DateOnlineUser where [date] =  CONVERT (date, SYSDATETIME())   


END


GO


پروسیجر مشاهده همه بازیدکنندگان


CREATE PROCEDURE [dbo].[viweall]

AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

select sum( [count]) from DateOnlineUser 


END


GO

پروسیجر بازدیدکننگان دیروز 


CREATE PROCEDURE  [dbo].[yesterdayonline]
	-- Add the parameters for the stored procedure here

AS
BEGIN
	declare @y date 
	set @y = DATEADD(DAY ,-1 ,SYSDATETIME() )
select ([count]) from DateOnlineUser
where [date] =  @y

	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	
   
END
GO


دادهای آماده


INSERT [dbo].[DateOnlineUser] ([IdDateOnlinUser], [date], [count]) VALUES (4, CAST(N'2016-08-15' AS Date), 2)
INSERT [dbo].[DateOnlineUser] ([IdDateOnlinUser], [date], [count]) VALUES (5, CAST(N'2016-08-16' AS Date), 1)
SET IDENTITY_INSERT [dbo].[DateOnlineUser] OFF
SET IDENTITY_INSERT [dbo].[IpDateOnlinUser] ON 

INSERT [dbo].[IpDateOnlinUser] ([Id], [IdDateOnlinUser], [IP]) VALUES (3, 4, N'192.168.1.2')
INSERT [dbo].[IpDateOnlinUser] ([Id], [IdDateOnlinUser], [IP]) VALUES (4, 4, N'192.168.1.1')
INSERT [dbo].[IpDateOnlinUser] ([Id], [IdDateOnlinUser], [IP]) VALUES (5, 5, N'192.168.1.1')

ابتدا به پروژه یک فایل Global.asax اضافه میکنیم و کدهای زیر را به آن اضافه میکنیم .

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

بعد از این مرحله میریم سراغ نوشتن کلاسهای برنامه ، یک پوشه به نام bal میسازیم . در این پوشه قرار است کلاسهای connection و کلاس اجرای پراسیجرها در سی شارپ نوشته شوند . یک کلاس به نام SqlCon.cs می سازیم و کدهای زیر را درون آن قرار میدهیم . این کلاس جهت اتصال پروژه به sql می باشد.

public class SqlCon
    {
        public SqlConnection con = null;
        public SqlConnection opencon()
        {
 
            con = new SqlConnection("Data Source=.;Initial Catalog=OnlineUser;Integrated Security=True");
            con.Open();
            return con;
 
        }
        public void closecon()
        {
            if (con != null)
            {
 
                if (con.State == ConnectionState.Open)
                    con.Close();
            }
 
        }
     
}

کلاس دوم را با نام BalExe.cs میسازیم و کدهای زیر را درون آن قرار می دهیم . این کلاس جهت اجرای کدها می باشد.

public class BalExe
{
     SqlCon con = new SqlCon();
    DataTable dt;
    DataSet ds;
    SqlDataAdapter da;
 
    SqlCommand com;
   public BalExe()
    {
 
    }
 
   public int execute(string procname)
   {
       int chek = -1;
       da = new SqlDataAdapter();
       da.SelectCommand = new SqlCommand();
       da.SelectCommand.CommandText = procname;
       da.SelectCommand.CommandType = CommandType.StoredProcedure;
 
       da.SelectCommand.Connection = con.opencon();
       chek = Convert.ToInt32(da.SelectCommand.ExecuteScalar());
       con.closecon();
       return chek;
 
 
   }
 
   public int insert_update(string procname, SqlParameter[] pa)
   {
       da = new SqlDataAdapter();
       da.SelectCommand = new SqlCommand();
       da.SelectCommand.CommandText = procname;
       da.SelectCommand.CommandType = CommandType.StoredProcedure;
       da.SelectCommand.Parameters.AddRange(pa);
       da.SelectCommand.Connection = con.opencon();
       int chek = Convert.ToInt32(da.SelectCommand.ExecuteScalar());
       con.closecon();
       return chek;
 
 
   }
 
}

 

کار با کلاسها تمام شد. پوشه ای دیگری به نام dal میسازیم ، یک کلاس به نام OnlineUserClass.cs میسازیم و کدهای زیر را درون ان قرار میدهیم این کلاس مقدار ip را از برنامه میگیرد و با توجه به وضعیت عمل درج و یا به روز رسانی تعداد کاربران را انجام میدهد.

public class OnlineUserClass
{
    BalExe bal = new BalExe();
 
    public string ip { get; set; }
 
    public int Insert()
    {
        SqlParameter[] pa = new SqlParameter[]
        {     new  SqlParameter ("@ip" , this.ip) ,
            
         };
        return bal.insert_update("onlineuser", pa);//==> onlineuser  is a PROCEDURE
    }
 
    public int selectomnlineuseer()
    {
        return bal.execute("selectomnlineuseer");//==> selectomnlineuseer  is a PROCEDURE
    }
    public int yesterdayonline()
    {
        return bal.execute("yesterdayonline");//==> yesterdayonline  is a PROCEDURE
    }
 
    public int viweall()
    {
        return bal.execute("viweall");//==> yesterdayonline  is a PROCEDURE
    }
}

کلاس دیگری به نام datefarsi میسازیم. این کلاس از نوع static میباشدو برای تبدیل تاریخ میلادی به شمسی از آن استفاده میشود .بر روی نام پروژه کلیک راست میکنیم و یک صفحه جدید به پروژه اضافه میکنیم و کدهای زیر را در بخش Source آن قرار میدهیم .


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml" dir="rtl" lang="fa-ir">
<head runat="server">
    <title>مشاهده افراد آنلاین</title>
     <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
   
    <link href="packages/bootstrap.3.3.6/content/Content/bootstrap-theme.css" rel="stylesheet" />
    <link href="packages/bootstrap.3.3.6/content/Content/bootstrap.min.css" rel="stylesheet" />
        <link href="packages/bootstrap.3.3.6/content/Content/bootstrap-theme.min.css" rel="stylesheet" />
        <script src="packages/jQuery.1.9.1/Content/Scripts/jquery-1.9.1-vsdoc.js"></script>
        <script src="packages/jQuery.1.9.1/Content/Scripts/jquery-1.9.1.min.js"></script>
        <script src="packages/jQuery.1.9.1/Tools/jquery-1.9.1.intellisense.js"></script>
        <script src="packages/bootstrap.3.3.6/content/Scripts/bootstrap.min.js"></script>
    <link href="packages/bootstrap.3.3.6/content/Content/w3.css" rel="stylesheet" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <div class="contaner">
            <div class="row w3-white">
                <div class="col-lg-4">
                </div>
                <div class="col-lg-4">
            <%--      www.ctaap.ir--%>
                    <h3>مشاهده تعداد بازدید کنندگان</h3>

                    <div class="well">
                           <p>
                            <span> افراد آنلاین :  </span><span class="glyphicon glyphicon-ok"></span><span id="onlineuser" runat="server"></span>

                        </p>
                        <p>
                            <span>تاریخ امروز :  </span><span class="glyphicon glyphicon-calendar "></span><span id="datef" runat="server"></span>

                        </p>
                        <hr />
                        <p>
                            <span>آی پی شما :  </span><span id="yourip" runat="server"></span>
                        </p>
                        <p>
                            <span>بازدید امروز:  </span><span id="todayonline" runat="server"></span>
                        </p>
                        <p>
                            <span>بازدید دیروز  :  </span><span id="yesterdayonline" runat="server"></span>
                        </p>
                        <p>
                            <span>بازدید کل  :  </span><span id="viweall" runat="server"></span>
                        </p>
                    </div>

                </div>
                <div class="col-lg-4">
                </div>
            </div>
        </div>
        
    </div>
    </form>
</body>
</html>

و در قمست کد نویسی کدهای زیر را وارد میکنیم :

using DAL.DALCLASS;
using OnlineUser.dal;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace OnlineUser
{
    public partial class home : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            OnlineUserClass online = new OnlineUserClass();
            online.ip = "192.168.1.1";//  ==>برای حالت لوکال آی پی را دستی وارد کردم که فقط نتیجه را ببینیم
            online.Insert();
          //  online.ip = GetLanIPAddress();//==>> در حالت واقعی باید از این متد استفاده کنیم
             
           // yourip.InnerText = GetLanIPAddress();//==>> در حالت واقعی باید از این متد استفاده کنیم
            onlineuser.InnerText = Application["OnlineUsers"].ToString();
 
             yourip.InnerText = "192.168.1.1";
            todayonline.InnerText = online.selectomnlineuseer().ToString();
            yesterdayonline.InnerText = online.yesterdayonline().ToString();
            viweall.InnerText = online.viweall().ToString();
 
 
            datef.InnerText = datef.InnerText.settime();//تاریخ شمسی
        }
 
        public String GetLanIPAddress()//متدی برای گرفتن ip
        {
 
            String ip = HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
 
            if (string.IsNullOrEmpty(ip))
            {
                ip = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
            }
 
            return ip;
        }
    }
}

کار تمام شد برنامه اجرا کنید و از آن لذت ببرید


نظرات