using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
using System.IO;
using Hippo;
namespace WebBeta20Test
{
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// 페이지 로드
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
Uri uri = Request.UrlReferrer;
if (uri != null)
{
this.WebLogging(Request.UserHostAddress, uri.Host, uri.PathAndQuery, this.GetNationForIP(), DateTime.Now.ToString());
}
else
{
this.WebLogging(Request.UserHostAddress, "Favorate", "", this.GetNationForIP(), DateTime.Now.ToString());
}
if (!IsPostBack)
{
this.Draw1();
}
}
/// <summary>
/// 웹로그 데이터 등록
/// </summary>
/// <param name="ip"></param>
/// <param name="domain"></param>
/// <param name="query"></param>
/// <param name="Nation"></param>
/// <param name="registerdate"></param>
private void WebLogging(string ip, string domain, string query, string Nation, string registerdate)
{
string error = string.Empty;
string connString = "server=localhost; uid=sa; pwd=1; database=HippoChart";
int effecedRowcount = 0;
string querystring = string.Format("INSERT INTO HIPPOLOG VALUES('{0}','{1}','{2}','{3}','{4}' )",
ip,
domain,
query,
Nation,
registerdate);
bool ret = this.ExcuteNonquery(connString, querystring, ref error, ref effecedRowcount);
if (!ret)
{
//Response.Write(error);
}
}
/// <summary>
/// 차트 그리기
/// </summary>
private void Draw1()
{
HippoEngine en = new HippoEngine();
en.ConnectionString = "server=localhost; uid=sa; pwd=1; database=HippoChart";
en.DataType = DataSourceType.Default;
string query = "select B.thistime, count(A.ip) as visit ";
query += " from hippolog A right outer join ";
query += " ( select '00' as thistime ";
query += " union select '01'";
query += " union select '02'";
query += " union select '03'";
query += " union select '04'";
query += " union select '05'";
query += " union select '06'";
query += " union select '07'";
query += " union select '08'";
query += " union select '09'";
query += " union select '10'";
query += " union select '11'";
query += " union select '12'";
query += " union select '13'";
query += " union select '14'";
query += " union select '15'";
query += " union select '16'";
query += " union select '17'";
query += " union select '18'";
query += " union select '19'";
query += " union select '20'";
query += " union select '21'";
query += " union select '22'";
query += " union select '23' ) B on substring(Convert(varchar(13), A.regdate, 121), 12, 2) = B.thistime and ";
query += " CONVERT(VARCHAR(10), A.regdate, 121) = CONVERT(VARCHAR(10) , GETDATE() , 121)";
query += " group by thistime order by thistime ";
en.Query = query;
SeriesList sList = en.GetSeriesList("thistime", "visit");
// 포인트 크기 설정
sList.SeriesCollection[0].Points.Width = 6;
sList.SeriesCollection[0].Points.PointType = PointType.FillRectangle;
// x축 간격을 한 칸마다 표시로 설정
sList.AxisFactor.XAxis.Interval = 1;
// 최대값과 평균 값을 차트에 표시해준다.
sList.AxisFactor.YAxis.AnalysisItems[AnalysisCategory.Max].Visible = true;
sList.AxisFactor.YAxis.AnalysisItems[AnalysisCategory.Average].Visible = true;
// 지난 최대 방문자 수 Extratick 표시
AxisTick extk = new AxisTick(26, "26");
extk.Label.Text = "지난최대\r\n방문자수(26)";
extk.Label.ForeColor = Color.Blue;
extk.IsShowGridLine = true;
extk.GridLine.LineColor = Color.Blue;
sList.AxisFactor.YAxis.ExtraTicks.Add(extk);
// 현재 시간 표시
AxisTick tk = new AxisTick(DateTime.Now.Hour.ToString("00"), "현재");
tk.Label.ForeColor = Color.YellowGreen;
tk.IsShowGridLine = true;
tk.GridLine.LineColor = Color.YellowGreen;
tk.GridLine.LineWidth = 2;
tk.GridLine.DashStyle = System.Drawing.Drawing2D.DashStyle.Dash;
sList.AxisFactor.XAxis.Ticks.Add(tk);
// x축 타이틀 등록
sList.AxisFactor.XAxis.TitleLabel.Text = "방문 시간(h)";
this.WHippoChart1.Titles.Label.Text = "웹로그(Weblog) 분석 그래프 - " + DateTime.Now.ToString("yy년 MM월 dd일");
this.WHippoChart1.SeriesListDictionary.Add(sList);
this.WHippoChart1.DrawChart();
// 차트를 한 번 그린 후 하루 최대 방문 시간대 풍선도움말로 표시하고
foreach (SeriesItem item in this.WHippoChart1.SeriesListDictionary[0].SeriesCollection[0].items)
{
// 최대값인 아이템을 찾는다.
if (item.YValue ==
this.WHippoChart1.SeriesListDictionary[0].AxisFactor.YAxis.AnalysisItems[AnalysisCategory.Max].Value)
{
// 풍선도움말
item.Balloon = new Balloon();
item.Balloon.Label.Text = "최고방문시간대 : " + item.Name + "시";
item.Balloon.BalloonType = BalloonType.Rectangle;
}
}
// 다시 그려준다.
this.WHippoChart1.DrawChart();
}
/// <summary>
/// 아이피를 통해 국가알아내기
/// </summary>
/// <returns></returns>
private string GetNationForIP()
{
try
{
string ip = Request.UserHostAddress;
string[] temparray = ip.Split('.');
double NationVAlue = int.Parse(temparray[0]) * 16777216 + int.Parse(temparray[1]) * 65536 + int.Parse(temparray[2]) * 256 + int.Parse(temparray[3]);
string FilePath = Server.MapPath("worldip.txt");
using (StreamReader sr = new StreamReader(FilePath))
{
String line;
while ((line = sr.ReadLine()) != null)
{
string[] tempVAlues = line.Split('\t');
double sVal = double.Parse(tempVAlues[0]);
double eVal = double.Parse(tempVAlues[1]);
if (NationVAlue >= sVal && NationVAlue <= eVal)
{
return tempVAlues[3];
}
}
}
return "UnKnown";
}
catch
{
return "UnKnown";
}
}
/// <summary>
/// DB 등록 메소드
/// </summary>
/// <param name="ConnectionString"></param>
/// <param name="queryString"></param>
/// <param name="error"></param>
/// <param name="effecedRowcount"></param>
/// <returns></returns>
private bool ExcuteNonquery(string ConnectionString, string queryString, ref string error, ref int effecedRowcount)
{
bool ret = false;
SqlConnection conn = new SqlConnection(ConnectionString);
try
{
conn.Open();
SqlCommand comm = new SqlCommand(queryString, conn);
comm.CommandTimeout = 20;
comm.CommandType = CommandType.Text;
effecedRowcount = comm.ExecuteNonQuery();
if (effecedRowcount > 0)
{
ret = true;
}
else
{
ret = false;
error = "영향받은 행이 없습니다.";
}
}
catch (SqlException ex)
{
error = "[" + ex.Number + "]" + ex.Message + ex.TargetSite + ex.StackTrace;
}
finally
{
conn.Close();
conn = null;
}
return ret;
}
}
}
|