مشاهده تعداد بازدیدکنندگان با پروسیجر و معماری سه لایه
دوشنبه 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;
}
}
}
کار تمام شد برنامه اجرا کنید و از آن لذت ببرید
- ASP.net
- 2k بازدید
- 3 تشکر