校园论坛(Java)—— 数据报表模块
文章目录
1、写在前面
- Windows版本:Windows10
- JDK版本:Java8
- MySQL版本:MySQL5.7
- Tomcat版本:Tomcat9.0
- IDE:IntelliJ IDEA Ultimate2020.2.3
- 可视化工具:Echarts
2、系统结构设计
2.1 各个页面之间的调用关系
用户管理系统模块
po.jsp
:报表系统主界面releaseCntPo.jsp
:统计发表数量Top5的普通帖子replyCntPo.jsp
:统计回帖数量Top5的普通帖子studyReleaseCntPo.jsp
:统计发表数量Top5的学习专帖studyReplyCntPo.jsp
:统计回帖数量Top5的学习专帖forumCntByUserTop5Po.jsp
:管理员统计普通帖子发表数量Top5的普通用户studyCntByUserTop5Po.jsp
:管理员统计学习专区发表帖子数量Top5的普通用户
2.2.
- Dao层
Dao层分别实现一个
interface
接口类以及一个接口方法
实现类
接口类:
public interface PoDaoInf {
/**
* TODO 按时间(月份)分组统计帖子发表数量
* @return
*/
public List<Object[]> releaseCntByDate(String uid);
/**
* TODO 统计回帖数量前5的帖子
* @param uid
* @return
*/
public List<Object[]> replyCntTop5(String uid);
/**
* TODO 按时间(月份)分组统计学习专区帖子发表数量
* @param u_id
* @return
*/
public List<Object[]> studyReleaseCntByDate(String u_id);
/**
* TODO 统计学习专区回帖数量前5的帖子
* @param uid
* @return
*/
public List<Object[]> studyReplyCntTop5(String uid);
/**
* TODO 普通用户发帖统计Top5
* @param u_id
* @return
*/
public List<Object[]> forumCntByUserTop5(String u_id);
/**
* TODO 普通用户学习发帖统计Top5
* @param u_id
* @return
*/
List<Object[]> studyCntByUserTop5(String u_id);
}
接口类实现方法
public class PoDaoImpl implements PoDaoInf {
/**
* TODO 按时间(月份)分组统计帖子发表数量
* @param uid
* @return
*/
@Override
public List<Object[]> releaseCntByDate(String uid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> list = new ArrayList<Object[]>();
String sql = "select ui.user_name, DATE_FORMAT(create_time,'%Y-%m') as pub_time, count(fid) " +
"from forum_info fi join user_info ui on fi.user_id = ui.user_id " +
"where fi.user_id = " + uid + " " +
"group by pub_time, ui.user_name order by fi.user_id";
System.out.println(sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
String name = rs.getString(1);
String pubTime = rs.getString(2); // 2022-10
String cntStr = rs.getString(3);
String pubYear = pubTime.substring(0, 4);
String pubMonth = pubTime.substring(5);
int cnt = Integer.parseInt(cntStr);
pubTime = pubYear + "年" + pubMonth + "月";
Object[] arr = {pubTime, cnt};
list.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < list.size(); i++) {
Object[] arr = list.get(i);
System.out.println(arr[0] + "-" + arr[1]);
System.out.println("------------ 帖子统计 -----------------");
}
return list;
}
/**
* TODO 统计回帖数量前5的帖子
* @param uid
* @return
*/
@Override
public List<Object[]> replyCntTop5(String uid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> ans = new ArrayList<Object[]>();
String sql = "select title, count(ri.fid) as cnt " +
"from reply_info ri join forum_info fi on ri.fid = fi.fid " +
"where fi.user_id = " + uid + " group by title order by cnt desc, fi.fid limit 5";
System.out.println(sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
String title = rs.getString(1);
String cntStr = rs.getString(2);
int cnt = Integer.parseInt(cntStr);
Object[] arr = {title, cnt};
ans.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < ans.size(); i++) {
Object[] arr = ans.get(i);
System.out.println(arr[0] + "-->" + arr[1]);
System.out.println("-----------------------------");
}
return ans;
}
/**
* TODO 按时间(月份)分组统计学习专区帖子发表数量
* @param u_id
* @return
*/
@Override
public List<Object[]> studyReleaseCntByDate(String u_id) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> list = new ArrayList<Object[]>();
String sql = "select DATE_FORMAT(create_time,'%Y-%m') as pub_time, count(*) as cnt from study_info si " +
"where si.user_id = " + u_id + " GROUP BY pub_time";
System.out.println(sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
String pubTime = rs.getString(1); // 2022-10
int cnt = rs.getInt(2);
String pubYear = pubTime.substring(0, 4);
String pubMonth = pubTime.substring(5);
pubTime = pubYear + "年" + pubMonth + "月";
Object[] arr = {pubTime, cnt};
list.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < list.size(); i++) {
Object[] arr = list.get(i);
System.out.println(arr[0] + "-" + arr[1]);
System.out.println("-------------- 学习专区帖子统计 ---------------");
}
return list;
}
/**
* TODO 统计学习专区回帖数量前5的帖子
* @param uid
* @return
*/
@Override
public List<Object[]> studyReplyCntTop5(String uid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> ans = new ArrayList<Object[]>();
String sql = "select title, count(sri.sid) as cnt from study_reply_info sri join study_info si on sri.sid = si.sid" +
" where si.user_id = " + uid +
" group by title order by cnt desc, si.sid limit 5";
System.out.println(sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
String title = rs.getString(1);
int cnt = rs.getInt(2);
Object[] arr = {title, cnt};
ans.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < ans.size(); i++) {
Object[] arr = ans.get(i);
System.out.println("--------- 学习专区回帖Top5统计 ------------------");
System.out.println(arr[0] + "-->" + arr[1]);
}
return ans;
}
/**
* TODO 普通用户发帖统计Top5
* @param u_id
* @return
*/
@Override
public List<Object[]> forumCntByUserTop5(String u_id) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> ans = new ArrayList<Object[]>();
String sql = "select fi.user_id, count(*) cnt from forum_info fi join user_info ui " +
"on fi.user_id = ui.user_id where ui.isAdmin != 1 GROUP BY user_id limit 5";
System.out.println("sql语句为:" + sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int uid = rs.getInt(1);
int cnt = rs.getInt(2);
Object[] arr = {uid, cnt};
ans.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < ans.size(); i++) {
Object[] arr = ans.get(i);
System.out.println("--------- 普通用户发帖Top5统计 ------------------");
System.out.println(arr[0] + "-->" + arr[1]);
}
return ans;
}
/**
* TODO 普通用户学习发帖统计Top5
* @param u_id
* @return
*/
@Override
public List<Object[]> studyCntByUserTop5(String u_id) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<Object[]> ans = new ArrayList<Object[]>();
String sql = "select si.user_id, count(*) cnt from study_info si join user_info ui " +
"on si.user_id = ui.user_id where ui.isAdmin != 1 GROUP BY si.user_id LIMIT 5";
System.out.println("sql语句为:" + sql);
try {
conn = DBUtil.getConnection();
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
int uid = rs.getInt(1);
int cnt = rs.getInt(2);
Object[] arr = {uid, cnt};
ans.add(arr);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.close(rs, ps, conn);
}
for(int i = 0; i < ans.size(); i++) {
Object[] arr = ans.get(i);
System.out.println("--------- 普通用户学习发帖Top5统计 ------------------");
System.out.println(arr[0] + "==>" + arr[1]);
}
return ans;
}
}
- service层
实现servlet层调用的方法,对数据库进行增删改查操作。
- Servlet层
在该层,通过jsp页面传递的参数,service对象调用相应的方法进行操作。
3、数据报表设计
数据报表主页实现子导航栏,普通用户实现4个数据报表展示,分别是发表数Top5的普通帖子、回帖数Top5的普通帖子、发表数Top5的学习专帖、回帖数Top5的学习专帖,而管理员用户在普通用户的基础上额外实现2个报表,分别是:发帖数Top5的普通用户、学习专帖发表数Top5的普通用户。
除游客模式外,其他用户包括管理员均具有数据报表的功能
3.1 数据报表主界面的实现
设计一个垂直导航栏,用于各个数据报表的呈现。
如下图所示:
3.2 发表数Top5的普通帖子
此数据报表按照时间(年月)分组统计帖子发表数量
对于当前登录用户,按年月作为区间,展示其所有发表的普通帖子的数量。
如下图所示:
3.3 回帖数Top5的普通帖子
统计回帖数量前5的帖子
从数据库获取到的数据样例为: [Java,3,全流程调度,1]
第一个变量为帖子标题,第二个变量为回帖数量
如下图所示:
3.4 发表数Top5的学习专帖
学习专帖发表数Top5的统计和普通帖子发表数Top5程序代码逻辑是一样的。
如下图所示:
3.5 回帖数Top5的学习专帖
学习专帖回帖数Top5的统计和普通帖子回帖数Top5程序代码逻辑是一样的。
如下图所示:
3.6 管理员统计普通帖子发表数量Top5的普通用户
统计普通用户帖子发表数量,数据展示出数量前5的用户账号
如下图所示:
3.7 管理员统计学习专区发表帖子数量Top5的普通用户
学习专帖发表数Top5的用户统计和普通帖子发表数Top5的用户统计的程序代码逻辑是一样的。
如下图所示:
4. 总结
数据报表使用的是开源的数据可视化图表库Echarts
,数据库的查询并不困难,主要是如何将统计的结果输出给Echarts报表,这涉及到java代码在js中如何使用,或者js代码如何在java中引用的两个问题,解决了这两个问题,可视化也就完成了。
5、项目代码
本文来自博客园,作者:{WHYBIGDATA},转载请注明原文链接:https://www.cnblogs.com/shadowlim/p/17051737.html