مشاهده تعداد بازدیدکنندگان با پروسیجر با معماری سه لایه ، در این آموزش می خوایم با هم نمایش تعداد افراد بازدیدکندده رو در 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; } } }
کار تمام شد برنامه اجرا کنید و از آن لذت ببرید
زمان پاسخ گویی روز های شنبه الی چهارشنبه ساعت 9 الی 18
فقط به موضوعات مربوط به محصولات آموزشی و فروش پاسخ داده می شود