WHYBIGDATA
WHYBIGDATA的博客

校园论坛(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.3 回帖数Top5的普通帖子

统计回帖数量前5的帖子

从数据库获取到的数据样例为: [Java,3,全流程调度,1]

第一个变量为帖子标题,第二个变量为回帖数量

如下图所示:

图片4

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、项目代码

posted on 2022-12-05 05:30  WHYBIGDATA  阅读(43)  评论(0编辑  收藏  举报