`
Kenrich
  • 浏览: 1320 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

基于MySQL的经分系统的实现

阅读更多
[b]经分系统项目总结[/b]
[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民工拍砖 交流


 
  • 大小: 40.3 KB
  • 大小: 33.4 KB
  • 大小: 36.2 KB
  • 大小: 27.6 KB
分享到:
评论
1 楼 iycrh 2011-08-26  
我来拍一砖头!

相关推荐

Global site tag (gtag.js) - Google Analytics