校园论坛(Java)—— 数据报表模块

news2024/11/13 10:05:24

校园论坛(Java)—— 数据报表模块

文章目录

  • 校园论坛(Java)—— 数据报表模块
    • 1、写在前面
    • 2、系统结构设计
      • 2.1 各个页面之间的调用关系
      • 2.2.
    • 3、数据报表设计
      • 3.1 数据报表主界面的实现
      • 3.2 发表数Top5的普通帖子
      • 3.3 回帖数Top5的普通帖子
      • 3.4 发表数Top5的学习专帖
      • 3.5 回帖数Top5的学习专帖
      • 3.6 管理员统计普通帖子发表数量Top5的普通用户
      • 3.7 管理员统计学习专区发表帖子数量Top5的普通用户
    • 4. 总结
    • 5、项目代码


在这里插入图片描述


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

  • GitHub
  • Gitee

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62031.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术人员创业的第一步分析(续,可听音频)

概述&#xff1a;昨天的文章发布以后&#xff0c;在腾讯云TVP专家群里和多个技术群里都引起了一些讨论&#xff0c;基于这些讨论&#xff0c;有了今天的这篇续章。里面谈到了这次创业中&#xff0c;青润经历过的几次生死关头&#xff0c;是真的差点离开人世&#xff0c;而不是想…

2022年物联卡的发展前景如何

在这个万物互联的时代&#xff0c;针对于企业设备联网的物联卡就显得格外重要了&#xff0c;而共享单车&#xff0c;移动支付&#xff0c;智慧城市&#xff0c;自动售卖机等企业采购物联卡会面临着各种问题&#xff0c;低价陷阱&#xff0c;流量虚假&#xff0c;管理混乱&#…

JMeter 做性能测试,YYDS!

2. JMeter下载和安装 JMeter可以在JMeter的官方网站下载&#xff0c;下载链接如下图所示&#xff0c;xmeter君写本文的时候&#xff08;2016/11&#xff09;可以下载到的最新的版本是3.0。 下载后解压到你系统下的任意目录&#xff0c;我们称该目录为%JMETER_HOME%&#xff0c;…

Dart语言简介

简单介绍Dart语言 Dart是一种针对客户优化的语言&#xff0c;亦可在任何平台上快速开发的应用陈旭。 目标是为多平台开发提供最高效的变成语言&#xff0c;并为应用程序框架搭配了领会的运行时执行平台。 Dart特点 Dart语言 类型安全&#xff0c;使用静态型检查来确保变量的…

Linux命令之常用基础命令备查手册

一、前言 家里领导因公司系统部署国产化发展趋势&#xff0c;需要学习Linux。作为Linux初学者&#xff0c;希望能有一篇博文提供学习快速学习和掌握Linux系统的常用基础命令。为了满足领导要求&#xff0c;特编写此博文&#xff0c;尽量将常用Linux命令囊括进来&#xff0c;以示…

基于ssm的宠物商城网站设计与实现

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

HTML5期末大作业:基于HTML+CSS+JavaScript实现中国风文化传媒企业官网源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【一条命令搞定rabbitmq的安装与配置】

提示&#xff1a;宝塔面板安装docker/docker-compose&#xff0c;一条命令搞定rabbitmq的安装与配置 文章目录前言一、docker-compose.yml配置二、安全组规则添加端口三、通过浏览器访问rabbitmq的管控页面总结前言 已经安装好了宝塔面板、并且可以在Docker栏目&#xff0c;选…

[附源码]计算机毕业设计物业管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

微服务框架 SpringCloud微服务架构 16 SpringAMQP 16.2 入门案例的消息发送

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构16 SpringAMQP16.2 入门案例的消息发送16.2.1 直接开干16.2.2 总结16 Spri…

八股文之算法

文章目录剑指offer链表1 从尾到头打印链表方案一&#xff1a;非递归方案二&#xff1a;递归方案三&#xff1a;普通数组存储方案三&#xff1a;递归2 链表反转方案一&#xff1a;使用栈解决方案二&#xff1a;双指针迭代方案三&#xff1a;递归3 反转链表一部分方法一&#xff…

Android 基础知识3-4 Activity的声明周期

引言&#xff1a; 在前面的几个例子中&#xff0c;我们发现所有集成Activity的类都重写了onCreate方法&#xff0c;程序运行就会自动进入这个方法。其实Activity类中还有很多类似onCreate的方法&#xff0c;比如onStart、onReaume、onPause、onDestroy等&#xff0c;而这些方法…

[黑马程序员C++笔记]P168-P173模板-函数模板

视频地址&#xff1a;黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难_哔哩哔哩_bilibili 目录 P167模板-模板的概念 P168模板-函数模板的基本语法 P169模板-函数模板的注意事项 P170模板-函数模板案例-数组排序 P171模板-普通函数与函数模板的区别 P172模板-普通…

Android 接口的default 方法运行时报错AbstractMethodError

【问题描述&#xff1a;接口default方法AbstractMethodError】 记录一个Android项目中遇到的问题&#xff0c;我们通过exclude方式重写了一个依赖&#xff0c;改用本地的实现&#xff0c;其中一个接口的default 方法&#xff0c;在运行时报错&#xff1a;AbstractMethodError&…

Mysql之存储引擎

目录 一、存储引擎概念 二、MyISAM的特点介绍 三.InnoDB特点 对比InnoDB和MyISAM 死锁 查看系统支持的存储引擎 查看表的使用存储引擎 修改存储引擎 一、存储引擎概念 MySQL中的数据用各种不同的技术存储在文件中&#xff0c;每一种技术都使用不同的存储机制、索引技巧…

sql serve数据库基础入门(2)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>: 在上一篇的最后,牛牛介绍了怎么创建表,本篇牛牛介绍如…

【华为上机真题 2022】拼接URL

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

Android-Jetpack Compose的简单运用

一.初步认识Jetpack Compose 1.什么是Jetpack Compose Jetpack Compose 是一个用于构建原生Android UI 的现代化工具包&#xff0c;它基于声明式的编程模型&#xff0c;因此你可以简单地描述UI的外观&#xff0c;而Compose则负责其余的工作-当状态发生改变时&#xff0c;你的…

端口转发工具Rinetd详细入门教程

目录 条件 下载 安装 方法A.shell安装 方法B.shell脚本安装 配置rinetd.conf文件 编辑器A&#xff1a;nano&#xff08;新手友好&#xff09; 编辑器B&#xff1a;vim rinetd开关 A.配置启动 B.脚本启动 创建脚本 启动 测试 参考链接 条件 有root权限rinetd.c…

HTML+CSS抗疫网页设计 疫情感动人物静态HTML网页 web前端开发技术 web课程设计 网页规划与设计

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…