[align=center][b][size=large]经分系统项目总结[[/size]/b][/align][size=medium][/size]
一 项目概述
利用对浏览器服务器的输出日志文件 进行数据采集和数据挖掘 从而根据基本的数据量得到决策所需的统计量,再进一步制定相应的数据报表 从而为市场和技术提供决策支持。
二 开发工具和环境
MySQL , MySQL workbench, Eclipse, jFreeChart
环境搭建:1 去mysql官网下载mysql和workbench(GUI工具),jdbc驱动
下载eclipse 和 jFreeChart包,
2 安装eclipse和mysql ,JDBC驱动以通过eclipse连接上数据库
3 工程中动态添加mysql 和 jfreeChart Jar包 ,如下:
4 配置环境变量:
Classpath下: 配mysql jdbc的jar包目录 和
jfreeChart的jar包目录
5统计量定义:
活跃用户:每月使用5次
流失用户数:上月有浏览记录但本月没有浏览记录的用户
新用户数:第一次启用的用户数量
使用用户数:在一个时间段(比如一天)内使用了浏览器的用户数量
新浏览:两次访问间隔超过21分钟视为第二次浏览
用户浏览停留时间:用户每次新浏览的时间总和。用户每次新浏览的时间 = (每次新浏览最后一次访问时间 - 每次新浏览第一次访问时间);如果一次新浏览的访问次数只有一次,则默认记浏览停留时间为1分钟。
三 开发过程详述
一)数据库操作
1 连接mysql
1)Dos命令行:输入:mysql –h localhost –u root –p
输入在安装时已设好的密码,就近入了mysql的命令编辑界面了。
2)直接用workbench 连接
Mysql连接的代码部分如下:
// 加载jdbc驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 定义一个数据库连接
myCon = DriverManager.getConnection(url, user, password);
// 根据连接创建一个状态集
myState = myCon.createStatement();
2 建表
1) 用户表
名称 字段 类型
用户名 USER_ID char(20)
用户首次使用日期 first_use_date Varchar(20)
用户首次使用时间 First_use_time Varchar(20)
2) 访问表
名称 字段 类型
网站URI URI Char(20)
用户名 USER_ID char(20)
Page server接受请求的时间 ACCEPTREQUEST_TIME Varchar(20)
page server获得页面内容时间 GETPAGEDATA_TIME Varchar(20)
page server转发请求的时间 TRANSEFORMREQUEST_TIME Varchar(20)
pageserver 返回客户端的时间 RETURNCLIENT_TIME Varchar(20)
客户端UA UA Varchar(20)
页面大小 PAGE_SIZE Int
是否正常访问 IS_NORMAL Varchar(20)
Page server接受请求的日期 ACCEPT_REQUEST_date Varchar(20)
page server获得页面内容日期 GETPAGEDATA_date Varchar(20)
page server转发请求的日期 TRANSEFORMREQUEST_date Varchar(20)
pageserver 返回客户端的日期 RETURNCLIENT_date Varchar(20)
相应的sql语句:
1用户表:
CREATE TABLE `users` (
`user_id` varchar(50) NOT NULL,
`first_use_date` varchar(11) DEFAULT NULL,
`first_use_time` varchar(23) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312$$
2访问表:
CREATE TABLE `visits` (
`user_id` varchar(50) NOT NULL,
`accept_request_date` varchar(11) NOT NULL,
`accept_request_time` varchar(12) NOT NULL,
`get_page_data_date` varchar(11) NOT NULL,
`get_page_data_time` varchar(12) NOT NULL,
`transform_request_date` varchar(11) NOT NULL,
`transform_request_time` varchar(12) NOT NULL,
`return_client_date` varchar(11) NOT NULL,
`return_client_time` varchar(12) NOT NULL,
`uri` varchar(200) NOT NULL,
`user_agent` varchar(100) NOT NULL,
`page_size` int(11) DEFAULT '0',
`is_normal` varchar(20) NOT NULL,
`count` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`count`)
) ENGINE=InnoDB AUTO_INCREMENT=24088 DEFAULT CHARSET=gb2312$$
注:建表语句保存下来 后期可以考虑用来批处理
二 ) 数据的读入
三)操作数据库并进行相应的sql语句查询得到相应的统计量 每种报表一个类获取相应的统计量 如:
四) 根据得到的统计量绘制相应的图表
每种类型的表用一个reportFormsMaker类,制柱状图,曲线图以及混合图的方法都在charttools类中实现,maker方法直接调用即可
最后,见证奇迹的时刻来临了哈哈 当时看到表格从我指定的目录出来还是有点小兴奋的哈哈
可以得到的统计报表:
日表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、使用用户数、总用户数
3、 用户增长数(柱状图): 每个时间段的新用户数
4、 用户使用数(柱状图):每个时间段的使用用户数
5、 正常访问率(曲线图):每个时间段的(正常访问次数/总访问次数)
6、 人均停留时间(柱状图) :每个时间段的(浏览停留时间/用户使用数)
7、 人均访问页面数(柱状图):每个时间段的(总访问页面数/用户使用数 )
8、 数据量(柱状图):每个时间段的所访问页面大小累计
周表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、使用用户数、总用户数
3、 用户增长数(柱状图 + 曲线图): 每天的新用户数 + 每天的新用户比率
4、 用户使用数(柱状图):每天的使用用户数
5、 正常访问率(曲线图):每天的(正常访问次数/总访问次数)
6、 人均停留时间(柱状图) :每天的(浏览停留时间/用户使用数)
7、 人均访问页面数(柱状图):每天的(总访问页面数/用户使用数 )
8、 每日数据量(柱状图):每天的所访问页面大小累计
月表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、活跃用户数、流失用户数、总用户数
3、 用户增长数(柱状图 + 曲线图): 每周的新用户数 + 每周的新用户比率
4、 人均停留时间(柱状图) :每周的(浏览停留时间/用户使用数)
5、 人均访问页面数(柱状图):每周的(总访问页面数/用户使用数 )
6、 每周数据量(柱状图):每周的所访问页面大小累计
年表(半年表)
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、总用户数;
3、 用户数量按月统计表(柱状图:新用户数、活跃用户数、流失用户数;曲线图:新用户比率、用户流失率
4、 人均停留时间(柱状图) :每月的(浏览停留时间/用户使用数)
5、 人均访问页面数(柱状图):每月的(总访问页面数/用户使用数 )
6、 每月数据量(柱状图):每月的所访问页面大小累计
上几张图吧直观点:也是第一次用数据库mysql开发 设计了一周 开发了三周 欢迎各位IT民工拍砖 交流
一 项目概述
利用对浏览器服务器的输出日志文件 进行数据采集和数据挖掘 从而根据基本的数据量得到决策所需的统计量,再进一步制定相应的数据报表 从而为市场和技术提供决策支持。
二 开发工具和环境
MySQL , MySQL workbench, Eclipse, jFreeChart
环境搭建:1 去mysql官网下载mysql和workbench(GUI工具),jdbc驱动
下载eclipse 和 jFreeChart包,
2 安装eclipse和mysql ,JDBC驱动以通过eclipse连接上数据库
3 工程中动态添加mysql 和 jfreeChart Jar包 ,如下:
4 配置环境变量:
Classpath下: 配mysql jdbc的jar包目录 和
jfreeChart的jar包目录
5统计量定义:
活跃用户:每月使用5次
流失用户数:上月有浏览记录但本月没有浏览记录的用户
新用户数:第一次启用的用户数量
使用用户数:在一个时间段(比如一天)内使用了浏览器的用户数量
新浏览:两次访问间隔超过21分钟视为第二次浏览
用户浏览停留时间:用户每次新浏览的时间总和。用户每次新浏览的时间 = (每次新浏览最后一次访问时间 - 每次新浏览第一次访问时间);如果一次新浏览的访问次数只有一次,则默认记浏览停留时间为1分钟。
三 开发过程详述
一)数据库操作
1 连接mysql
1)Dos命令行:输入:mysql –h localhost –u root –p
输入在安装时已设好的密码,就近入了mysql的命令编辑界面了。
2)直接用workbench 连接
Mysql连接的代码部分如下:
// 加载jdbc驱动程序
Class.forName("com.mysql.jdbc.Driver");
// 定义一个数据库连接
myCon = DriverManager.getConnection(url, user, password);
// 根据连接创建一个状态集
myState = myCon.createStatement();
2 建表
1) 用户表
名称 字段 类型
用户名 USER_ID char(20)
用户首次使用日期 first_use_date Varchar(20)
用户首次使用时间 First_use_time Varchar(20)
2) 访问表
名称 字段 类型
网站URI URI Char(20)
用户名 USER_ID char(20)
Page server接受请求的时间 ACCEPTREQUEST_TIME Varchar(20)
page server获得页面内容时间 GETPAGEDATA_TIME Varchar(20)
page server转发请求的时间 TRANSEFORMREQUEST_TIME Varchar(20)
pageserver 返回客户端的时间 RETURNCLIENT_TIME Varchar(20)
客户端UA UA Varchar(20)
页面大小 PAGE_SIZE Int
是否正常访问 IS_NORMAL Varchar(20)
Page server接受请求的日期 ACCEPT_REQUEST_date Varchar(20)
page server获得页面内容日期 GETPAGEDATA_date Varchar(20)
page server转发请求的日期 TRANSEFORMREQUEST_date Varchar(20)
pageserver 返回客户端的日期 RETURNCLIENT_date Varchar(20)
相应的sql语句:
1用户表:
CREATE TABLE `users` (
`user_id` varchar(50) NOT NULL,
`first_use_date` varchar(11) DEFAULT NULL,
`first_use_time` varchar(23) NOT NULL,
PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312$$
2访问表:
CREATE TABLE `visits` (
`user_id` varchar(50) NOT NULL,
`accept_request_date` varchar(11) NOT NULL,
`accept_request_time` varchar(12) NOT NULL,
`get_page_data_date` varchar(11) NOT NULL,
`get_page_data_time` varchar(12) NOT NULL,
`transform_request_date` varchar(11) NOT NULL,
`transform_request_time` varchar(12) NOT NULL,
`return_client_date` varchar(11) NOT NULL,
`return_client_time` varchar(12) NOT NULL,
`uri` varchar(200) NOT NULL,
`user_agent` varchar(100) NOT NULL,
`page_size` int(11) DEFAULT '0',
`is_normal` varchar(20) NOT NULL,
`count` int(11) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`count`)
) ENGINE=InnoDB AUTO_INCREMENT=24088 DEFAULT CHARSET=gb2312$$
注:建表语句保存下来 后期可以考虑用来批处理
二 ) 数据的读入
BufferedReader myReader = null;
try {
// 新建一个阅读器
myReader = new BufferedReader(new FileReader("D:/log.txt"));
String myLine = null;
String result[] = null;
// 读文件并存入result数组中
// 以双空格来区分字段,读一行存一行到数组result中
while ((myLine = myReader.readLine()) != null) {
// if(myLine != null)
// {
// System.out.println("Read File Line Success!!!");
// }
result = myLine.split(" ");
// 对得到的result数组进行处理以得到想要的相应字段
// 插入时间
String first_use_date = result[1].substring(0, 10);
String first_use_time = result[1].substring(11, 23);
String accept_request_date = result[1].substring(0, 10);
String accept_request_time = result[1].substring(11, 23);
String get_page_data_date = result[2].substring(0, 10);
String get_page_data_time = result[2].substring(11, 23);
String transform_request_date = result[3].substring(0, 10);
String transform_request_time = result[3].substring(11, 23);
String return_client_date = result[4].substring(0, 10);
String return_client_time = result[4].substring(11, 23);
// 插入uri
int lastIndex = (result[5].substring(7)).indexOf('/') + 7;
String rootUri = result[5].substring(0, lastIndex);
String pageSize = result[7];
if (pageSize == null || "null".equals(pageSize)
|| "".equals(pageSize)) {
pageSize = "0";
}
/*
* 插入数据库表格
*/
try {
// 插入用户表中
String sqlStr_user = "insert ignore into " + users_table
+ " values('" + result[0] + "'," + "'"
+ first_use_date + "'," + "'" + first_use_time
+ "')";
myState.executeUpdate(sqlStr_user);
myResult = myState.executeQuery("select * from "
+ visits_table);
} catch (SQLException e) {
e.printStackTrace();
System.out.println("myResult:" + myResult);
}
// 插入访问表中
String sqlStr_visit = "insert ignore into "
+ visits_table
+ " ( user_id, accept_request_date, accept_request_time,get_page_data_date,get_page_data_time, transform_request_date,transform_request_time, return_client_date,return_client_time, uri, user_agent, page_size, is_normal) "
+ " values(" + "'" + result[0] + "'," + "'"
+ accept_request_date + "'," + "'"
+ accept_request_time + "'," + "'" + get_page_data_date
+ "'," + "'" + get_page_data_time + "'," + "'"
+ transform_request_date + "'," + "'"
+ transform_request_time + "'," + "'"
+ return_client_date + "'," + "'" + return_client_time
+ "'," + "'" + rootUri + "'," + "'" + result[6] + "',"
+ "'" + pageSize + "'," + "'" + result[8] + "')";
try {
myState.executeUpdate(sqlStr_visit);
myResult = myState.executeQuery("select * from "
+ visits_table);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("myResult:" + myResult);
}
}
} catch (java.io.IOException ioe) {
// 出错处理
ioe.printStackTrace();
} finally { // 关闭文件
try {
//关闭阅读器
if (myReader != null)
myReader.close();
System.out.println("Close the Reader!\n" );
try {
//关闭连接
myCon.close();
System.out.println("Close the Connection!\n" );
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (java.io.IOException ignore) {
ignore.printStackTrace();
}
}
System.out.println("Insert the database Successful!!!\n");
}
三)操作数据库并进行相应的sql语句查询得到相应的统计量 每种报表一个类获取相应的统计量 如:
public static int[] dayDataFlow() {
String[] sqlDataFlow = new String[8];
int[] dayDataFlow = new int[8];
for (int i = 0; i < fromDayTime.length; i++) {
sqlDataFlow[i] = "select sum(page_size) as DataFlow from "
+ visits_table + " where accept_request_date = "
+ "'" + yestodayDateStr + "'"
+ " and accept_request_time <= "
+ toDayTime[i] + " and accept_request_time >= "
+ fromDayTime[i];
try {
myResult = myState.executeQuery(sqlDataFlow[i]);
while (myResult.next()) {
dayDataFlow[i] = myResult.getInt("DataFlow");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
System.out.println("dayDataFlow" + "[" + i + "]=" + dayDataFlow[i]);
}
System.out.println("\n");
return dayDataFlow;
}
四) 根据得到的统计量绘制相应的图表
每种类型的表用一个reportFormsMaker类,制柱状图,曲线图以及混合图的方法都在charttools类中实现,maker方法直接调用即可
最后,见证奇迹的时刻来临了哈哈 当时看到表格从我指定的目录出来还是有点小兴奋的哈哈
可以得到的统计报表:
日表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、使用用户数、总用户数
3、 用户增长数(柱状图): 每个时间段的新用户数
4、 用户使用数(柱状图):每个时间段的使用用户数
5、 正常访问率(曲线图):每个时间段的(正常访问次数/总访问次数)
6、 人均停留时间(柱状图) :每个时间段的(浏览停留时间/用户使用数)
7、 人均访问页面数(柱状图):每个时间段的(总访问页面数/用户使用数 )
8、 数据量(柱状图):每个时间段的所访问页面大小累计
周表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、使用用户数、总用户数
3、 用户增长数(柱状图 + 曲线图): 每天的新用户数 + 每天的新用户比率
4、 用户使用数(柱状图):每天的使用用户数
5、 正常访问率(曲线图):每天的(正常访问次数/总访问次数)
6、 人均停留时间(柱状图) :每天的(浏览停留时间/用户使用数)
7、 人均访问页面数(柱状图):每天的(总访问页面数/用户使用数 )
8、 每日数据量(柱状图):每天的所访问页面大小累计
月表:
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、活跃用户数、流失用户数、总用户数
3、 用户增长数(柱状图 + 曲线图): 每周的新用户数 + 每周的新用户比率
4、 人均停留时间(柱状图) :每周的(浏览停留时间/用户使用数)
5、 人均访问页面数(柱状图):每周的(总访问页面数/用户使用数 )
6、 每周数据量(柱状图):每周的所访问页面大小累计
年表(半年表)
1、 网站访问量表top10(柱状图):根据每个页面访问数量排名
2、 用户数量统计表(柱状图):新用户数、总用户数;
3、 用户数量按月统计表(柱状图:新用户数、活跃用户数、流失用户数;曲线图:新用户比率、用户流失率
4、 人均停留时间(柱状图) :每月的(浏览停留时间/用户使用数)
5、 人均访问页面数(柱状图):每月的(总访问页面数/用户使用数 )
6、 每月数据量(柱状图):每月的所访问页面大小累计
上几张图吧直观点:也是第一次用数据库mysql开发 设计了一周 开发了三周 欢迎各位IT民工拍砖 交流