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

دوشنبه 25 مرداد 1395

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

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

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 آن قرار میدهیم . 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="home.aspx.cs" Inherits="OnlineUser.home" %>

<!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;
        }
    }
}

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

 

 

 

 

 

 

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

jamaljaj

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

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

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