基于MySQL的经分系统的实现

[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$$

注:建表语句保存下来 后期可以考虑用来批处理


二 ) 数据的读入

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民工拍砖 交流
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值