第23章 网站流量统计系统
本章视频教学录像:29分钟
想知道你建立的网站有多少人访问过吗?想知道你的网站哪一天访问的人最多吗?如果想解决类似这样的问题,一个能够统计网站流量的系统是必不可少的。
本章要点(已掌握的在方框中打钩)
□ 系统分析
□ 数据库分析和设计
□ 系统设计
□ 流量统计的代码实现
□ 将网站流量统计系统添加至已有网站中
23.1 系统分析
本节视频教学录像:8分钟
每一个网站建设者或管理者都希望自己辛辛苦苦创建的网站能够人气爆棚,这可以通过网站的访问量看出,但是又如何才能得知网站的访问量呢?如果在网站中加入网站流量统计系统,统计网站当天、当月、当年总的访问量,这样网站的人气就一目了然了。
本章使用ASP.NET和SQL Server 2008来创建一个网站流量统计系统。
23.1.1 系统目标
本系统需要实现的目标有以下6点。
⑴实现对网站运行天数的统计。
⑵实现对网站本日访问人数的统计。
⑶实现对网站本周访问人数的统计。
⑷实现对网站本月访问人数的统计。
⑸实现对网站本年访问人数的统计。
⑹实现对网站访问IP流量的统计。
23.1.2 系统原理
当用户打开网页访问时,会创建一个Session对象,我们可以把用户的登录信息,如登录IP、登录时间等信息统统记录下来,放到此Session对象中,然后将这些信息插入数据库当中,利用这些信息来统计各种流量。当用户关闭浏览器或者使该Session超时,则该Session就会失效。如果用户在1分钟内连续刷新网页来增加流量,也视为无效。
23.1.3 技术要点
在项目中添加Global.asax文件,在该文件的Session_Start事件中使用Request对象获取客户端的IP地址、登录时间、浏览器信息等,然后插入数据库中。Session的超时时间默认为20分钟,这里可以将其超时时间设为1分钟。代码如下。
01 //在新会话启动时运行的代码
02 void Session_Start(object sender,EventArgs e)
03 {
04 Session.Timeout= 1; //设置Session的有效时间为1分钟
05 Session["IP"]=Request.UserHostAddress; //获取客户端 IP
06 //根据登录用户的 IP,判断该用户是否在1分钟之内重复登录
07 if (!DataClass.IsValidLogin(Session["IP"].ToString()))
08 {
09 Session["LoginTime"]=DateTime.Now; //获取用户访问时间,即当前时间
10 Session["BrowserInfo"]=Request.Browser.Browser; //获取用户使用的浏览器信息
11 DataClass.ExecSql("insert into tabStatInfo(IpAddress,LoginTime,BrowserInfo) values('"+Session["IP"]+ "','"+Session["LoginTime"]+ "','"+Session["BrowserInfo"]+ "')");
12 }
13 }
在Session_End事件中清空Session,代码如下。
01 //在会话结束时运行的代码
02 void Session_End(object sender,EventArgs e)
03 {
04 Session["IP"]= null; //清空Session中名为 IP的值
05 Session["LoginTime"]= null; //清空Session中名为LoginTime的值
06 Session["BrowserInfo"]= null; //清空Session中名为BrowserInfo的值
07 }
注意
只有在Web.config.文件中的sessionstate模式设置为InProc时,才会引发Session_End.事件。如果会话模式设置为.State Server或SQL Server,则不会引发该事件。
在公共类DataClass.cs文件中编写了GetSqlServerConn、ExecSql、returnDataSet、IsValidLogin等4个方法,方法的功能说明和代码设计如下。
1. GetSqlServerConn()方法
该方法主要用来创建数据库的连接对象。
01 private static SqlConnection GetSqlServerConn()
02 {
03 SqlConnection sqlConn; //定义SQlServer连接对象
04 string strConn =WebConfigurationManager.ConnectionStrings["FlowStat"].ConnectionString; //读取web.config配置文件的ConnectionString节点获取连接字符串
05 sqlConn= new SqlConnection(strConn); //生成数据库连接对象
06 return sqlConn; //返回数据库连接对象以供调用
07 }
2. ExecSql(string str_sqltxt) 方法
该方法用来根据输入的SQL语句作为参数,对数据库进行查询、插入、更新、删除等操作(代码23-2-2.txt)。
01 public static bool ExecSql(string str_sqltxt)
02 {
03 SqlConnection sqlConn=GetSqlServerConn(); //创建连接对象
04 sqlConn.Open(); //打开连接
05 SqlCommand cmd= new SqlCommand(str_sqltxt, sqlConn);
06 try
07 {
08 cmd.ExecuteNonQuery(); //执行SQl语句
09 return true; //执行成功
10 }
11 catch (Exception e)
12 {
13 return false; //执行失败
14 }
15 finally
16 {
17 if (sqlConn.State !=ConnectionState.Closed)
18 {
19 sqlConn.Close(); //关闭连接
20 }
21 }
22 }
3. returnDataSet(string str_sqltxt)方法
该方法用来根据输入的SQL语句作为参数,对数据库进行查询操作,将查询得到的结果集存放到程序集中。
01 public static DataSet returnDataSet(string str_sqltxt)
02 {
03 SqlConnection sqlConn=GetSqlServerConn(); //创建连接对象
04 SqlDataAdapter sda= new SqlDataAdapter(str_sqltxt, sqlConn);
05 DataSet ds= new DataSet();
06 sda.Fill(ds, "table1");
07 return ds;
08 }
4. IsValidLogin(string str_ip)方法
该方法用来根据输入的IP地址作为参数,对数据库进行查询操作,并比较当前时间和登录时间的时间间隔是否大于1分钟(代码23-2-4.txt)。
01 public static bool IsValidLogin(string str_ip)
02 {
03 string sqltxt= "select IPAddress,max(LoginTime) LastTime from tabStatInfo where
04 IPAddress='"+str_ip+"'group by IPAddress";
05 SqlConnection sqlconn=GetSqlServerConn(); //创建连接对象
06 SqlDataAdapter sda= new SqlDataAdapter(sqltxt, sqlconn);
07 DataSet ds= new DataSet();
08 sda.Fill(ds, "table1");
09 TimeSpan ts=new TimeSpan();
10 //得到登录的时间间隔
11 ts=DateTime.Now.Subtract(DateTime.Parse(ds.Tables[0].Rows[0]["LastTime"].ToString()));
12 if (ts.TotalSeconds<= 60)
13 {
14 return true; //是1分钟之内重复登录
15 }
16 else
17 return false; //不是1分钟之内重复登录
18 }
【代码详解】
在函数IsValidLogin()中第3、4行的SQL语句“select IPAddress,max(LoginTime) LastTime from tabStatInfo where IPAddress=‘"+str_ip+"’group by IPAddress”主要用来根据用户的IP地址获得该用户登录的最近时间。第12行DateTime.Now.Subtract()用来得到当前时间与该IP地址的最近登录时间之间的时间间隔。
23.2 数据库分析及设计
本节视频教学录像:1分钟
根据分析,本系统需要用到数据库来存储以及统计所记录的数据,所以在系统开发之前,首先要进行数据库的设计。
23.2.1 数据库分析
在网站流量统计系统中,需要统计访问用户的IP和访问的时间。为了更好地统计和管理这些数据,我们选择SQL Server 2008数据库来满足系统的需求。在数据库中需要有一张数据表来存储访问IP数据和访问时间数据,所以在这个数据表中需要包含id、IPAddress以及LoginTime等字段。
23.2.2 创建数据库
在SQL Server 2008中创建数据库的具体步骤如下。
⑴选择【开始】【所有程序】【Microsoft SQL Server 2008】【SQL Server Management Studio】,以【Windows身份验证】模式登录。
⑵在【对象资源管理器】窗口中的【数据库】节点上右击,在弹出的快捷菜单中选择【新建数据库】菜单项,弹出【新建数据库】对话框。
⑶在【数据库名称】文本框中输入“db_flow”,在【数据库文件】列表框中分别设置“db_flow”和“db_flow_log”文件的路径为“D:\Final\ch23\数据库”,单击【确定】按钮即可完成db_flow数据库的创建。
23.2.3 创建数据表
本实例中需要一张记录登录IP地址和登录时间信息的表,下面来创建数据表。
⑴在【对象资源管理器】中展开db_flow节点,右击【表】节点,在弹出的快捷菜单中选择【新建表】菜单项。
⑵在打开的表编辑窗口中,按照下表进行输入。
⑶在【表-dbo.Table_1*】选项卡上右击,在弹出的快捷菜单中选择【保存】菜单项,弹出【选择名称】对话框,在【输入表名称】文本框中输入“tabStatInfo”,单击【确定】按钮,即可完成表的创建。
提示
以上步骤是创建数据库的过程,大家也可以直接附加光盘db_flow.mdf文件。
23.3 系统设计
本节视频教学录像:15分钟
在23.1.1小节中,已经提出了网站流量统计系统需要实现的6个目标,所以在系统设计时,需要设计出这些模块来实现各个目标。
23.3.1 母版页展示
母版页(Main.master)实现整个网站的布局和导航功能,其他的页面只需要引用该母版页就可以使用母版所提供的所有功能。该页面主要使用Menu控件来实现流量统计功能的导航。运行结果如图所示。
具体代码如下。
01 <table width="100%" height="768px">
02 <tr style="height:20%">
03 <td align="center" class="link">
04 <asp:Menu ID="Menu1" runat="server"Width="100%"
05 DynamicVerticalOffset="2"Orientation="Horizontal">
06 <Items>
07 <asp:MenuItem NavigateUrl="~/Default.aspx" Text="首页 "/>
08 <asp:MenuItem NavigateUrl="~/DayStat.aspx" Text="今日流量统计 "/>
09 <asp:MenuItem NavigateUrl="~/MonthStat.aspx" Text="本月流量统计 "/>
10 <asp:MenuItem NavigateUrl="~/YearStat.aspx" Text="本年流量统计 "/>
11 <asp:MenuItem NavigateUrl="~/IPStat.aspx" Text="IP流量统计 "/>
12 < /Items>
13 < /asp:Menu>
14 < /td>
15 < /tr>
16 <tr style="height:80%">
17 <td valign="top">
18 <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
19 < /asp:ContentPlaceHolder>
20 < /td>
21 < /tr>
22 < /table>
23.3.2 系统首页展示
接下来,我们先来设计系统的首页面(Default.aspx),该页面中需要有系统的首页、今日流量统计、本月流量统计、本年流量统计以及IP流量统计等导航内容,而这些内容直接引用自母版页即可。在页面上放置12个Label控件,分别用来显示网站运行天数、今日访问人数、本周访问人数、本月访问人数、最高日访问量、最高日访问日期、最高月访问量、最高月访问日期、最高年访问量、最高年访问日期、总访问人数、统计日期等。
系统的首页如图所示。
23.3.3 配置网站的Web.config
数据库和系统页面都设计好了,如何将它们连接起来呢?这就需要通过配置系统的Web.config文件来连接数据库。
在【解决方案资源管理器】中双击Web.config文件,打开Web.config的代码窗口,然后将<connectionStrings>和< /connectionStrings>之间的代码更换为以下代码。
<add name="FlowStat" connectionString="Data Source=.\sqlexpress; Initial Catalog=db_flow;User ID=sa;Password=123"/>
【代码详解】
此段代码的作用是增加一个数据库的连接,name属性表示该标签的名称,connectionString属性表示数据库的连接字符串。在连接字符串中,DataSource表示此处数据库服务器的名称或者数据库服务器所在的IP地址,InitialCatalog表示数据库的名称,User ID表示登录数据库的用户名,Password表示密码。数据库连接字符串中的各个属性值都要根据自己的情况来设置。
23.3.4 首页代码设计
因为在首页中要显示网站运行天数、今日访问人数、本周访问人数、本月访问人数、最高日访问量、最高日访问日期、最高月访问量、最高月访问日期、最高年访问量、最高年访问日期、总访问人数、统计日期等内容,所以要分别编写相应的方法进行统计。
1. 今日访问人数统计代码设计
只要确定查询的时间段,就可以统计出今日访问人数。查询的时间段应该是在当天的零点到第2天的零点之间,在这期间查询的记录数就是今日访问人数。
在Default.aspx.cs中的Page_Load()方法中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 if (!IsPostBack)
04 {
05 ds= new DataSet();
06 }
07 }
08 //统计今日访问人数
09 private void showCurrDay()
10 {
11 startTime=DateTime.Now.ToShortDateString()+ " 0:00:00";
12 endTime=DateTime.Now.AddDays(1).ToShortDateString()+ " 0:00:00";
13 str_sql= "select * from tabStatInfowhere LoginTime>='"
14 + startTime+ "' and LoginTime<'"+ endTime+ "'";
15 ds.Clear();
16 ds=DataClass.returnDataSet(str_sql);
17 lblCurrDayStat.Text=ds.Tables[0].Rows.Count.ToString();
18 }
2. 本周访问人数统计代码设计
如果要统计出本周访问人数,就需要知道当天是星期几,然后根据当天所在的星期,得到该星期一到星期日的日期,再通过该时间段查询出所有的记录数,就是本周访问人数。
紧接上面的代码,输入以下代码。
01 //统计本周访问人数
02 private void showCurrWeek()
03 {
04 switch (DateTime.Now.DayOfWeek)
05 {
06 case DayOfWeek.Monday:
07 startTime=DateTime.Now.AddDays(0).ToShortDateString()+ " 0:00:00";
08 endTime=DateTime.Now.AddDays(6).ToShortDateString()+ " 0:00:00";
09 break;
10 case DayOfWeek.Tuesday:
11 startTime=DateTime.Now.AddDays(-1).ToShortDateString()+ " 0:00:00";
12 endTime=DateTime.Now.AddDays(5).ToShortDateString()+ " 0:00:00";
13 break;
14 case DayOfWeek.Wednesday:
15 startTime=DateTime.Now.AddDays(-2).ToShortDateString()+ " 0:00:00";
16 endTime=DateTime.Now.AddDays(4).ToShortDateString()+ " 0:00:00";
17 break;
18 case DayOfWeek.Thursday:
19 startTime=DateTime.Now.AddDays(-3).ToShortDateString()+ " 0:00:00";
20 endTime=DateTime.Now.AddDays(3).ToShortDateString()+ " 0:00:00";
21 break;
22 case DayOfWeek.Friday:
23 startTime=DateTime.Now.AddDays(-4).ToShortDateString()+ " 0:00:00";
24 endTime=DateTime.Now.AddDays(2).ToShortDateString()+ " 0:00:00";
25 break;
26 case DayOfWeek.Saturday:
27 startTime=DateTime.Now.AddDays(-5).ToShortDateString()+ " 0:00:00";
28 endTime=DateTime.Now.AddDays(1).ToShortDateString()+ " 0:00:00";
29 break;
30 case DayOfWeek.Sunday:
31 startTime=DateTime.Now.AddDays(-6).ToShortDateString()+ " 0:00:00";
32 endTime=DateTime.Now.AddDays(0).ToShortDateString()+ " 0:00:00";
33 break;
34 }
35 ds.Clear();
36 str_sql= "select * from tabStatInfowhere LoginTime>='"+ startTime+ "' and LoginTime<'"+ endTime+ "'";
37 ds=DataClass.returnDataSet(str_sql);
38 lblCurrWeekStat.Text=ds.Tables[0].Rows.Count.ToString();
39 }
3. 本月访问人数统计代码设计
可以根据当日的时间,抽取出年和月,然后根据该年和月查询出所有的登录记录数就是本月访问人数。
在Default.aspx.cs页面中紧接上面的代码输入以下代码。
01 //统计本月访问人数
02 private void showCurrMonth()
03 {
04 str_sql= "select * from tabStatInfowhere Year(LoginTime)='"+DateTime.Now.Year+ "' and Month(LoginTime)='"+DateTime.Now.Month+ "'";
05 ds.Clear();
06 ds=DataClass.returnDataSet(str_sql);
07 lblCurrMonthStat.Text=ds.Tables[0].Rows.Count.ToString();
08 }
4. 最高日访问量统计和该日日期代码设计
根据访问时间的年、月、日分组,得到该日的访问量,然后对每日的访问量进行比较,找到最高日访问量放到MaxDayCount中,该日的日期放到MaxDayDate中。
在Default.aspx.cs的代码窗口中输入以下代码。
01 //统计最高日访问量和最高日访问日期
02 private void showDayMax()
03 {
04 str_sql = "select count(*) as count,max(LoginTime) as date from tabStatInfo group byyear(LoginTime),month(LoginTime),day(LoginTime)";
05 ds.Clear();
06 ds=DataClass.returnDataSet(str_sql);
07 int MaxDayCount= 0;
08 string MaxDayDate= "";
09 foreach (DataRow dr in ds.Tables[0].Rows)
10 {
11 if (dr != null)
12 {
13 if (MaxDayCount<=Convert.ToInt32(dr[0]))
14 {
15 MaxDayCount=Convert.ToInt32(dr[0]);
16 MaxDayDate=dr[1].ToString();
17 }
18 }
19 }
20 lblMaxDayStat.Text=MaxDayCount.ToString(); //最高日访问量
21 if (MaxDayDate != "")
22 {
23 lblMaxDayDate.Text = (Convert.ToDateTime(MaxDayDate).Year).ToString() + "年 " +(Convert.ToDateTime(MaxDayDate).Month).ToString()+ "月 "+ (Convert.ToDateTime(MaxDayDate).Day).ToString()+ "日 "; //最高日访问日期
24 }
25 }
26 }
5. 最高月访问量统计和该月的日期代码设计
要统计出最高月访问量,首先要查询出访问时间中的年份集合,然后求出年份集合当中的各年的每个月份的访问人数。
在Default.aspx.cs的代码窗口中输入以下代码。
01 //最高月访问量和最高月访问日期
02 private void showMonthMax()
03 {
04 int MaxMonCount= 0;
05 string MaxMonDate= "";
06 str_sql= "select year(LoginTime) from tabStatInfogroupby year(LoginTime)";
07 ds.Clear();
08 ds=DataClass.returnDataSet(str_sql);
09 foreach (DataRowdr in ds.Tables[0].Rows)
10 {
11 str_sql= "select count(*) as count,max(Month(LoginTime)) asmonth from tabStatInfowhere year(LoginTime)='"+dr[0].ToString()+ "'"+"groupbymonth(LoginTime)";
12 DataSet dsMonth=DataClass.returnDataSet(str_sql);
13 foreach (DataRowdrMonth indsMonth.Tables[0].Rows)
14 {
15 if (drMonth != null)
16 {
17 if (MaxMonCount<=Convert.ToInt32(drMonth[0]))
18 {
19 MaxMonCount=Convert.ToInt32(drMonth[0]);
20 MaxMonDate=dr[0].ToString()+ "年 "+drMonth[1].ToString()+ "月 ";
21 }
22 }
23 }
24 }
25 lblMaxMonthStat.Text=MaxMonCount.ToString(); //最高月访问量
26 lblMaxMonthDate.Text=MaxMonDate; //最高月访问日期
27 }
6. 最高年访问量统计和该年日期代码设计
根据访问时间分组,得到各年的访问量,然后对各年的访问量进行比较,然后求出最高年访问量和访问日期。
在Default.aspx.cs的代码窗口中输入以下代码。
01 //最高年访问量和最高年访问日期
02 private void showYearMax()
03 {
04 intMaxYearCount= 0;
05 string MaxYearDate= "";
06 str_sql= "select count(*),max(LoginTime) from tabStatInfo group by year(LoginTime)";
07 ds.Clear();
08 ds=DataClass.returnDataSet(str_sql);
09 foreach (DataRow dr in ds.Tables[0].Rows)
10 {
11 if (dr != null)
12 {
13 if (MaxYearCount<=Convert.ToInt32(dr[0]))
14 {
15 MaxYearCount=Convert.ToInt32(dr[0]);
16 MaxYearDate=dr[1].ToString();
17 }
18 }
19 }
20 lblMaxYearStat.Text=MaxYearCount.ToString(); //最高年访问量
21 lblMaxYearDate.Text=MaxYearDate; //最高年访问日期
22 }
7. 总访问人数统计代码设计
查询数据库中的所有记录数,就是总访问人数。
在Default.aspx.cs的代码窗口中输入以下代码。
01 //显示总访问人数
02 private void showTotal()
03 {
04 ds.Clear();
05 ds=DataClass.returnDataSet("select count(*) from tabStatInfo");
06 this.lblTotalNumber.Text=ds.Tables[0].Rows[0][0].ToString();
07 }
8. 网站运行天数代码设计
查询数据库中的最早的访问时间,然后计算当前时间与最早访问时间的间隔天数,就是网站运行天数。
在Default.aspx.cs的代码窗口中输入以下代码。
01 //统计网站运行天数
02 private void showRunDays()
03 {
04 str_sql= "select LoginTime from tabStatInfowhere id=1";
05 TimeSpan sp= new TimeSpan();
06 ds.Clear();
07 ds=DataClass.returnDataSet(str_sql);
08 sp=DateTime.Now.Subtract(DateTime.Parse(ds.Tables[0].Rows[0][0].ToString()));
09 string spToStr= sp.TotalDays.ToString();
10 string TotalDayNumber= spToStr.Substring(0, spToStr.IndexOf('.'));
11 intdays= Int32.Parse(TotalDayNumber);
12 if (TotalDayNumber== "0")
13 TotalDayNumber= "1";
14 lblRunDays.Text= "网站已运行 "+ TotalDayNumber+ "天 ";
15 }
23.3.5 今日流量统计页展示
今日流量统计页面需要显示当前日期和今日总流量,以及当前日期的时间段、该时间段的访问人数、该时间段访问人数占该日访问量的比例。
1. 界面设计
添加一个DayStat.aspx。在该页面添加两个Label控件,用来显示当前日期和今日总流量,还要添加一个DataList控件用来显示时间段、人数和该时间段流量与总流量的百分比。
页面代码如下。
01 <div style="width: 100%;">
02 今日访问统计:<br />
03 日期:<asp:Label ID="lblDate" runat="server" Text="">< /asp:Label> 今日累计:
04 <asp:Label ID="lblDayCount" runat="server" Text="">< /asp:Label>< /div>
05 <div>
06 <asp:DataList ID="DataList1" runat="server"Width="100%">
07 <HeaderTemplate>
08 <table>
09 <tr align="center">
10 <td>日期< /td>
11 <td>人数< /td>
12 <td colspan="2">比例%< /td>
13 < /tr>
14 < /HeaderTemplate>
15 <ItemTemplate>
16 <tr style="height: 10px">
17 <td><asp:Label ID="lblTime" runat="server"
18 Text="<%#Time(Container.ItemIndex)%>">< /asp:Label>
19 < /td>
20 <td><asp:Label ID="lblCount" runat="server"
21 Text="<%#Count(Container.ItemIndex)%>">< /asp:Label>
22 < /td>
23 <td align="left"><asp:Image ID="imgPercent" runat="server"
24 Width="<%#Percent(Container.ItemIndex)%>"Height="8"
25 ImageUrl="~/images/progress.gif" />
26 < /td>
27 <td align="left"><asp:Label ID="lblPercent" runat="server"
28 Text="<%#Percent(Container.ItemIndex)%>">< /asp:Label>
29 < /td>
30 < /tr>
31 < /ItemTemplate>
32 <FooterTemplate>
33 < /table>
34 < /FooterTemplate>
35 < /asp:DataList>
36 < /div>
2. 今日访问人数统计代码设计
只要确定查询的时间段,就可以统计出今日访问人数。查询的时间段应该是当天的零点到第2天的零点之间,在这期间查询的记录数就是今日访问人数。
在DayStat.aspx.cs的代码窗口中输入以下代码。
//一天的开始时间和结束时间
string startTime=DateTime.Now.ToShortDateString()+ " 0:00:00";
string endTime=DateTime.Now.AddDays(1).ToShortDateString()+ " 0:00:00"; //今日访问人数统计
01 protected int Total()
02 {
03 string str_sql= "select * from tabStatInfo where LoginTime>='"+startTime+"' and
04 LoginTime<'"+endTime+"'";
05 DataSet ds=DataClass.returnDataSet(str_sql);
06 int totalCount=ds.Tables[0].Rows.Count; //今日总访问人数
07 return totalCount;
08 }
3. 时间段代码设计
Time()方法用于绑定到DataList控件中的Time列,DataList控件的数据源是一个从0到23的整数数组,Time()方法根据该数组传入的数据,用于划分时间段。
在DayStat.aspx.cs的代码窗口紧接上面的代码输入以下代码。
01 //确定时间段
02 protected string Time(int i)
03 {
04 string TimePhase="";
05 if (i>= 0&& i< 24)
06 {
07 TimePhase= i.ToString()+ ":00--"+ (i+ 1).ToString()+ ":00";
08 }
09 return TimePhase;
10 };
4. 各时间段访问人数统计代码设计
Count()方法用于绑定到DataList控件中的Count列,DataList控件的数据源是一个从0到23的整数数组,Count()方法根据该数组传入的数据,统计各个时间段的访问人数。
在DayStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //各时间段的访问人数
02 protected int Count(int i)
03 {
04 int TimeCount= 0;
05 string str_sql= "select count(*) as count,datepart(hh,LoginTime) as hour from tabStatInfo
06 where LoginTime>'"+startTime+"' and LoginTime<'"+endTime+"' and
07 datepart(hh,LoginTime)="+i+"groupbydatepart(hh,LoginTime)";
08 DataSet ds=DataClass.returnDataSet(str_sql);
09 if (ds.Tables[0].Rows.Count != 0)
10 {
11 TimeCount=Convert.ToInt32(ds.Tables[0].Rows[0]["count"]);
12 }
13 return TimeCount;
14 }
5. 各时间段访问量占当日访问量的百分比代码设计
Percent()方法用于绑定到DataList控件中的Percent列,DataList控件的数据源是一个从0到23的整数数组,Percent()方法根据该数组传入的数据,统计各个时间段的访问人数,然后用某时间段的访问量除以总的日访问量求出百分比。
在DayStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //各时间段访问量占当日访问量的百分比
02 protected double Percent(int i)
03 {
04 double CountPercent= 0;
05 if (Total() != 0)
06 {
07 CountPercent=Math.Round(Convert.ToSingle(Count(i)) /Convert.ToSingle(Total()) *100,2);
08 }
09 return strPercent;
10 }
23.3.6 本月流量统计页设计
本月流量统计页面需要显示本月日期、本月累计总访问量,以及该月份每一天的访问人数和当天访问人数占该月总访问人数的比例。
1. 界面设计
添加一个MonthStat.aspx页面,与今日流量统计页面相似,如图所示。
2. 初始化页面代码设计
在页面初始化之前,首先定义两个String类型的变量,用来存放这个月的开始时间和结束时间。代码如下。
//一天的开始时间和结束时间
string startTime = DateTime.Now.ToShortDateString() +" 0:00:00";
string endTime = DateTime.Now.AddDays(1).ToShortDateString() +" 0:00:00";
在DayStat.aspx.cs的代码窗口中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 if (!IsPostBack)
04 {
05 lblMonth.Text=DateTime.Now.Year+ "-"+DateTime.Now.Month;
06 //得到当前年中当月的天数
07 int MonthDays=DateTime.DaysInMonth(DateTime.Now.Year,
08 DateTime.Now.Month);
09 startTime= lblMonth.Text+ "-1 0:00:00";
10 endTime= lblMonth.Text+ "-"+MonthDays+ " 23:59:59";
11 int[] daysList= new int[MonthDays];
12 for (int i= 0; i<MonthDays; i++)
13 {
14 daysList[i]= i+ 1;
15 }
16 DataList1.DataSource=daysList;
17 DataList1.DataBind();
18 lblMonthCount.Text= Total().ToString(); //本月累计访问人数
19 }
20 }
3. 本月访问人数统计代码设计
可以根据当日的时间,抽取出年和月,然后根据该年和月查询出所有的登录记录数就是本月访问流量。
在MonthStat.aspx.cs的代码窗口中输入以下代码。
01 //本月访问人数统计
02 protected int Total()
03 {
04 string str_sql= "select * from tabStatInfo where LoginTime>='"+ startTime+ "' and
05 LoginTime<'"+ endTime+ "'";
06 DataSet ds=DataClass.returnDataSet(str_sql);
07 int totalCount=ds.Tables[0].Rows.Count; //当月总访问人数
08 return totalCount;
09 }
4. 时间段代码设计
Time()方法用于绑定到DataList控件中的Time列,DataList控件的数据源是一个存放当月天数的数组,Time()方法根据该数组传入的数据,用于确定当天所处的日期。
在MonthStat.aspx.cs的代码窗口紧接上面的代码输入以下代码。
01 //确定时间段
02 protected string Time(int i)
03 {
04 //得到当前年中当月的天数
05 int Month=DateTime.DaysInMonth(DateTime.Now.Year,DateTime.Now.Month);
06 string MonthDays= "";
07 if (i>= 0&& i<Month)
08 {
09 MonthDays= (i+ 1).ToString();
10 }
11 return MonthDays;
12 }
5. 一天的访问人数统计代码设计
Count()方法用于绑定到DataList控件中的Count列,DataList控件的数据源是一个存放当月天数的数组,Count()方法根据该数组传入的数据,统计当天访问人数。
在MonthStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //统计一天的访问人数
02 protected int Count(int i)
03 {
04 int TimeCount= 0;
05 string str_sql= "select count(*) as count,datepart(dd,LoginTime) as hour from tabStatInfo
06 where LoginTime>'"+ startTime+ "' and LoginTime<'"+ endTime+ "' and
07 datepart(dd,LoginTime)="+ (i+1)+ "groupbydatepart(dd,LoginTime)";
08 DataSet ds=DataClass.returnDataSet(str_sql);
09 if (ds.Tables[0].Rows.Count != 0)
10 {
11 TimeCount=Convert.ToInt32(ds.Tables[0].Rows[0]["count"]);
12 }
13 return TimeCount;
14 }
6. 每天访问量占当月访问量的百分比代码设计
Percent()方法用于绑定到DataList控件中的Count列,DataList控件的数据源是一个存放当月天数的数组,Count()方法根据该数组传入的数据,统计当天访问的人数,然后用某天的访问量除以总的月访问量求出百分比。
在MonthStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //每天访问量占当月访问量的百分比
02 protected double Percent(int i)
03 {
04 double CountPercent= 0;
05 if (Total() != 0)
06 {
07 CountPercent=Math.Round(Convert.ToSingle(Count(i)) /Convert.ToSingle(Total()) * 100,2);
08 }
09 return strPercent;
10 }
23.3.7 本年流量统计页设计
本年流量统计页面需要显示当前年份、本年累计总访问量,以及该年每一月的访问人数和该月访问人数占该年总访问人数的比例。
1. 界面设计
添加一个YearStat.aspx页面,与今日流量统计页面相似,如图所示。
2. 初始化页面代码设计
在页面初始化Page_Load()事件之中,显示当前的年份和本年累计访问人数。
在YearStat.aspx.cs的代码窗口中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 if (!IsPostBack)
04 {
05 int[] monthList= new int[12];
06 for (int i= 0; i< 12; i++)
07 {
08 monthList[i]= i+ 1;
09 }
10 DataList1.DataSource=monthList;
11 DataList1.DataBind();
12 lblYear.Text=DateTime.Now.Year+"年 "; //年份
13 lblYearCount.Text= Total().ToString(); //本年累计访问人数
14 }
15 }
3. 本年访问人数统计代码设计
根据当前日期的年份,可以查询出所有的登录记录数,就是本年的访问人数。
在YearStat.aspx.cs的代码窗口中输入以下代码。
01 //年访问人数统计
02 protected int Total()
03 {
04 string str_sql= "select * from tabStatInfo where year(LoginTime)="+DateTime.Now.Year;
05 DataSet ds=DataClass.returnDataSet(str_sql);
06 int totalCount=ds.Tables[0].Rows.Count; //年访问人数
07 return totalCount;
08 }
4. 时间段代码设计
Time()方法用于绑定到DataList控件中的Time列,DataList控件的数据源是一个存放本年月数的数组,Time()方法根据该数组传入的数据,用于确定当天所处的月份。
在YearStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //确定时间段
02 protected string Time(int i)
03 {
04 string Month= "";
05 if (i>= 0&& i< 12)
06 {
07 Month= (i+ 1).ToString();
08 }
09 return Month;
10 }
5. 每月的访问人数统计代码设计
Count()方法用于绑定到DataList控件中的Count列,DataList控件的数据源是一个存放当年月数的数组,Count()方法根据该数组传入的数据,统计当月访问的人数。
在YearStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 //统计每月的访问人数
02 protected int Count(int i)
03 {
04 int TimeCount= 0;
05 string str_sql= "select count(*) as count,month(LoginTime) as month from tabStatInfo
06 where year(LoginTime)='"+DateTime.Now.Year+ "' and month(LoginTime)='"+(i+1)+ "'
07 group by Month(LoginTime)";
08 DataSet ds=DataClass.returnDataSet(str_sql);
09 if (ds.Tables[0].Rows.Count != 0)
10 {
11 TimeCount=Convert.ToInt32(ds.Tables[0].Rows[0]["count"]);
12 }
13 return TimeCount;
14 }
6. 每月访问量占当年访问量的百分比代码设计
Percent()方法用于绑定到DataList控件中的Count列,DataList控件的数据源是一个存放当年月数的数组,Percent()方法根据该数组传入的数据,统计当月访问人数,然后用某月的访问量除以总的年访问量求出百分比。
在YearStat.aspx.cs的代码窗口中紧接上面的代码输入以下代码。
01 protected double Percent(int i)
02 {
03 double CountPercent= 0;
04 if (Total() != 0)
05 {
06 CountPercent=Math.Round(Convert.ToSingle(Count(i)) /Convert.ToSingle(Total()) *100,2);
07 }
08 return strPercent;
09 }
23.3.8 IP流量统计页设计
IP流量统计页面需要显示累计总IP访问量,以及每个IP访问量和该IP访问量占所有IP访问量的比例。
1. 界面设计
添加一个IpStat.aspx页面,界面基本与今日流量统计页面一致,如图所示。
页面代码如下。
01 <asp:DataList ID="DataList1" runat="server"Width="100%">
02 <ItemTemplate>
03 <tr>
04 <td><asp:Label ID="lblIP" runat="server"
05 Text='<%#Eval("IPAddress")%>'>< /asp:Label>
06 < /td>
07 <td><asp:Label ID="lblCount" runat="server"
08 Text='<%#Eval("countNumber")%>'>< /asp:Label>
09 < /td>
10 <td align="left"><asp:Label ID="lblPercent" runat="server"
11 Text='<%#Eval("per")%>'>< /asp:Label>
12 < /td>
13 < /tr>
14 < /ItemTemplate>
15 < /asp:DataList>
2. 初始化页面代码设计
在页面初始化Page_Load()事件之中,显示IP累计访问量。
在IPStat.aspx.cs的代码窗口中输入以下代码。
01 protected void Page_Load(object sender,EventArgs e)
02 {
03 if (!IsPostBack)
04 {
05 //IP统计
06 DataSet ds=DataClass.returnDataSet("select count(*) as
07 countNumber,IPAddress,cast(count(*)*100.0/(select count(*) from tabStatInfo) as
08 numeric(10,2)) asper from tabStatInfogroupby IPAddress");
09 DataList1.DataSource=ds.Tables[0];
10 DataList1.DataBind();
11 lblIPCount.Text=Total().ToString();
12 }
13 }
3. 累计访问IP数统计代码设计
可以查询出所有的登录记录数,就是累计访问IP数。
在IPStat.aspx.cs的代码窗口中输入以下代码。
01 //累计访问 IP数统计
02 protected int Total()
03 {
04 string str_sql= "select count(*) from tabStatInfo";
05 DataSet ds=DataClass.returnDataSet(str_sql);
06 int totalCount=Convert.ToInt32(ds.Tables[0].Rows[0][0]); //累计访问 IP数
07 return totalCount;
08 }
技巧
SQL语句中的cast函数用于将一种数据类型转换为另一种数据类型。
如cast(countNumber.as.numeric(10,2)),是将整型字段转换为numeric类型。
23.4 运行系统
本节视频教学录像:2分钟
下面来看系统运行的效果。
⑴按【F5】或【Ctrl+F5】快捷键,在浏览器中运行该程序,页面中将显示网站运行天数、今日访问人数、本周访问人数、本月访问人数、最高年访问人数等内容。
⑵当在一分钟内刷新该网页时,系统将不增加流量值。
⑶当点击今日流量统计时,页面将显示今日流量统计页面。
⑷当点击本月流量统计时,页面将显示本月流量统计页面。
⑸当点击本年流量统计时,页面将显示本年流量统计页面。
⑹当点击IP流量统计时,页面将显示IP流量统计页面。
23.5 在我的网站中应用本系统
本节视频教学录像:1分钟
系统开发完成之后,需要将系统添加到一些现有的网站中,以执行统计网站流量的功能。
⑴首先在原有系统的数据库中添加相应的存放访问数据的表。
⑵在原有系统的Global文件中对Session_Start()方法和Session_End()添加相应的代码。
⑶最后在原有的网站中加入首页、今日流量统计页面、本周流量统计页面、本月流量统计页面和IP流量统计页面即可。
23.6 开发过程中的常见问题及解决方式
本节视频教学录像:2分钟
⑴因为我们的所有网页跳转都需要网站的导航,所以就要把网站的导航功能放到母版页上,供其他页面来使用。
⑵为了防止有用户快速刷新页面来刻意增加网站流量,需要在用户访问网页的时候,写一个方法来判断该用户的访问时间间隔是否小于1分钟,如果小于1分钟则该次访问不计入流量统计中。
⑶在获取某IP流量占IP访问量的百分比的时候,SQL语句中整数字段比整数字段得到的还是整型。因此需要使用SQL内置函数cast()将整型字段转换成实型,从而得到带小数位的百分比。