مشاهده تعداد بازدیدکنندگان با پروسیجر و معماری سه لایه
دوشنبه 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 تشکر