论文管理系统(用户列表显示功能)

news2024/12/26 9:32:38

上次我们已经实现了论文管理系登录功能,这次我们要实现登录之后的跳转到首页,并且让首页列表显示出数据库的信息并在Mapper中写入模糊查询功能语句,这次我们不使用MybatisPlus写这个功能,这次使用Mybatis来写,区别就是Plus是继承于<BaseDAO>Mapper,Mybatis则是我们通过读取Mapper.xml文件中的sql语句,实现效果如下图所示,:

 

一、后端部分 

1.1 实体类

再次强调我们每次传递数据是通过HttpResult 实体类来响应前端的数据

package com.woniu.paper.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class HttpResult {
    private Object data;
    private int pageTotle;
    private int code;//200=成功,500=失败
    private String msg;//给前端的提示
}

 实体类paper

package com.woniu.paper.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Paper  {
    private Long id;
    private String title;
    private Long typeId;
    private String paperSummary;
    private String paperPath;
    private String createdBy;
    private LocalDateTime creationData;
    private String modifyBy;
    private LocalDateTime modifyData;
    private String fileName;
    private String typeName;

}

 这里大家发现实体类里面多了一个属性typeName,这是方便我们后面模糊查询,因为paper数据表中的的论文类型是id,不是文本形式,没有办法进行模糊查询,所以我们需要在里面自己加入typeName这个变量

1.2 paperMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.woniu.paper.mapper.PaperMapper">
    <!--    建立数据库t_paper表和实体Paper的映射关系-->
    <resultMap id="paperResult" type="Paper">
        <result column="id" property="id"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="title" property="title"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="type_id" property="typeId"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="paper_summary" property="paperSummary"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="paper_path" property="paperPath"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="created_by" property="createdBy"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="creation_data" property="creationData"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="modify_by" property="modifyBy"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="modify_data" property="modifyData"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="file_name" property="fileName"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
        <result column="type_name" property="typeName"/> <!-- column:数据库字段名 property:实体的属(变量)名 -->
    </resultMap>
    <select id="selectPaperListByCondition" resultMap="paperResult">
        select p.*, t.type_name from t_paper as p LEFT JOIN t_type as t on
        p.type_id=t.id
        <where>
            <if test="title!=null and title!=''">
                and title like '%${title}%'
            </if>
            <if test="typeName!=null and typeName!=''">
                and type_name=#{typeName}
            </if>
        </where>
        limit #{start},#{size}
    </select>
    <select id="count" resultType="int">
        select count(t.type_name) from t_paper as p LEFT JOIN t_type as t on
        p.type_id=t.id
        <where>
            <if test="title!=null and title!=''">
                and title like '%${title}%'
            </if>
            <if test="typeName!=null and typeName!=''">
                and type_name=#{typeName}
            </if>
        </where>
    </select>
    <insert id="insertPaper">
        insert into t_paper (title,type_id,paper_summary,paper_path,created_by,modify_by,file_name) values (#{title},#{typeId},#{paperSummary},#{paperPath},#{createdBy},#{modifyBy},#{fileName})
    </insert>
</mapper>

数据库内外链接补充

 1.3 PaperMapper类

public interface PaperMapper extends BaseMapper<Paper> {
     List<Paper> selectPaperListByCondition(String title, String typeName, int start, int size);
     int count(String title, String typeName);//查询总数,用于列表分页
}

 1.4Service层

接口

package com.woniu.paper.service;

import com.woniu.paper.entity.HttpResult;
import com.woniu.paper.entity.Paper;
import com.baomidou.mybatisplus.extension.service.IService;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author zhang
 * @since 2022-11-18
 */
public interface IPaperService  {
    public HttpResult selectPaperListByCondition(String title, String typeName, int pageIndex, int pageSize);
    public HttpResult insertPaper(String title,Long typeId,String paperSummary,String paperPath,String createdBy,String modifyBy,String fileName);
}

实现类

package com.woniu.paper.service.impl;

import com.woniu.paper.entity.HttpResult;
import com.woniu.paper.entity.Paper;
import com.woniu.paper.mapper.PaperMapper;
import com.woniu.paper.mapper.UserMapper;
import com.woniu.paper.service.IPaperService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author zhang
 * @since 2022-11-18
 */
@Service
public class PaperServiceImpl implements IPaperService {
    @Autowired(required = false)
    private PaperMapper paperMapper;//实例化DAO对象

    @Override
    public HttpResult selectPaperListByCondition(String title, String typeName, int pageIndex, int pageSize) {
        List<Paper> papers = paperMapper.selectPaperListByCondition(title, typeName, (pageIndex - 1) * pageSize, pageSize);
        int count = paperMapper.count(title, typeName);
        HttpResult result=null;
        if (papers!=null&&papers.size()>0){
            result= new HttpResult(papers,count,200,null);
        }else{
            result= new HttpResult(null,0,500,"没有更多数据");
        }
        return result;
    }

   


}

 1.5 Controller层

package com.woniu.paper.controller;


import com.woniu.paper.entity.HttpResult;
import com.woniu.paper.service.IPaperService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author zhang
 * @since 2022-11-18
 */
@RestController
@RequestMapping("/paper/paper")
public class PaperController {
    @Autowired
    private IPaperService paperService;//实例化Service对象
    /**
     * 根据分页查询论文列表
     * @return
     */
    @RequestMapping("/list")
    @CrossOrigin(origins = "*")
    public HttpResult selectPaperListByCondition(String title,String typeName,int pageIndex,int pageSize) {
    return paperService.selectPaperListByCondition(title,typeName,pageIndex,pageSize);
    }
    /**
     * 新增
     */

}

 二、前端部分

效果图

 

源码如下 :


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>论文管理系统</title>
    <!--    导入bootstrap-->
    <link href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="assets/jquery-3.5.1.min.js"></script>
    <script src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <!--    导入VUE-->
    <script src="assets/vue.min-v2.5.16.js"></script>
    <script src="assets/axios.min.js"></script>
    <script src="assets/vue-router.min-2.7.0.js"></script>
<body>
<div id="app">
    <div style="margin-left: auto; margin-right: auto;">
        <div style="width: 1000px; height: 100px; border: 1px solid black; text-align: center;font-size: 18px; line-height: 100px;">
            论文管理系统
        </div>
        <div style="width: 200px; height: 700px; border: 1px solid black; text-align: center; font-size: 18px; line-height: 50px; float: left">
            <div>
                <button class="btn btn-link" @click="doUserManager">用户管理</button>
            </div>
            <div>
                <button class="btn btn-link" @click="doPaperManager">论文管理</button>
            </div>


        </div>
        <div style="width: 800px; height: 700px; border: 1px solid black; float: left">
            <div v-if="isShow">
                论文主题:
                <input type="text" v-model="title">
                论文类型:
                <select v-model="typeName">
                    <option>软件</option>
                    <option>财务</option>
                </select>
                <button @click="doQuery">查询</button>
                <!--使用bootstrap的斑马线样式表格-->
                <table class="table table-striped">
                    <caption>论文列表</caption>
                    <!--表头-->
                    <thead>
                    <tr>
                        <th>论文主题</th>
                        <th>作者</th>
                        <th>论文类型</th>
                        <th>发表时间</th>
                        <th>修改时间</th>
                        <th>操作</th>
                    </tr>
                    </thead>

                    <!--表内容-->
                    <tbody>
                    <!--通过vue的v-for指令循环输出论文信息-->
                    <tr v-for="p in papers">
                        <td>{{p.title}}</td>
                        <td>{{p.createdBy}}</td>
                        <td>{{p.typeName}}</td>
                        <td>{{p.creationData}}</td>
                        <td>{{p.modifyData}}</td>
                        <td>
                            <button class="btn btn-link">修改</button>
                            <button class="btn btn-link">删除</button>
                        </td>
                    </tr>
                    </tbody>
                </table>
                <!--分页-->
                <ul class="pagination" v-for="p in pageNum">
                    <!-- class=active表示被选中-->
                    <li v-if="p == pageIndex" class="active">
                        <a @click="doGo(p)">{{p}}</a>
                    </li>
                    <li v-else="p == pageIndex">
                        <a @click="doGo(p)">{{p}}</a>
                    </li>
                </ul>
            </div>
        </div>
    </div>
</div>
<script>
    new Vue({
        //将id=app的div的管理权交给vue
        el:'#app',
        //需要绑定的数据
        data:{
            papers:null,//论文列表
            isShow:false,//控制列表是否显示
            //用于条件查询
            title:null,
            typeName:null,
            //用户分页
            pageIndex:1,//当前页面
            pageSize:10,//每页显示的条数
            pageTotle:0,//数据总条数
            pageNum:0

        },
        //需要绑定的函数
        methods:{
            //请求论文列表
            requestPapers(url){
                axios.get(url).then(respones =>{
                    console.log(respones.data);
                    this.papers =respones.data.data;//给论文列表赋值
                    this.pageTotle = respones.data.pageTotle;//给总条数赋值
                    //Math.ceril函数=>小数去整,向上取整
                    this.pageNum = Math.ceil(this.pageTotle / this.pageSize);//计算页数

                });
            },
            doGo(p){
                this.pageIndex = p;
                var url="http://localhost:8080/paper/paper/list?pageIndex="+p+"&pageSize="+this.pageSize+"&uid="+localStorage.getItem("uid");
                this.requestPapers(url);//调用请求论文列表的函数发送请求
            },
            //用户管理
            doUserManager(){
                this.isShow = true;//让列表显示
            },
            //论文管理
            doPaperManager(){
                this.isShow = true;//让列表显示
            },
            //点击查询按钮执行
            doQuery(){
                var url="http://localhost:8080/paper/paper/list?pageIndex="+this.pageIndex+"&pageSize="+this.pageSize+"&uid="+localStorage.getItem("uid")+"&title="+this.title+"&typeName="+this.typeName;
                this.requestPapers(url);//调用请求论文列表的函数发送请求
            }
        },
        //页面加载完成后执行
        created:function () {
            //re
            var url="http://localhost:8080/paper/paper/list?pageIndex="+this.pageIndex+"&pageSize="+this.pageSize+"&uid="+localStorage.getItem("uid");
            this.requestPapers(url);//调用请求论文列表的函数发送请求
        }


    });



</script>


</body>
</html>

 代码讲解

整体思路,我们要先保证能显示列表信息,之后进行跳转和模糊查询等等其他功能

<link href="assets/bootstrap-3.3.7-dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="assets/jquery-3.5.1.min.js"></script>
    <script src="assets/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <script src="assets/vue.min-v2.5.16.js"></script>
    <script src="assets/vue-router.min-2.7.0.js"></script>
    <script src="assets/axios.min.js"></script>

这两个按钮是页面左边的菜单栏的选项

 

 分页功能

 

 JS部分都有具体注释,分页功能可参考往期博客

主页面图 

 模糊查询效果图

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

JAVASE(复习)——static

static 关键字是静态的意思,是Java中的一个修饰符,可以修饰成员方法,成员变量 一、被static修饰的特点 被类的所有对象共享&#xff08;在堆内存共享&#xff09; 随着类的加载而加载&#xff0c;优先于对象存在&#xff08;就是你加载类的时候就加载了&#xff09; 可以通过…

@Transactional注解为何会失效

使用 Transactional 注解能保证方法内多个数据库操作要么同时成功、要么同时失败。但是有很多细节需要注意&#xff0c;不然Transactional可能会失效。 1.注解应用在非 public 的方法上 如果Transactional注解应用在非public 修饰的方法上&#xff0c;Transactional将会失效。…

FLink源码 1.13 3 种 命令客户端 Generic CLI 、 yarn-cluster、DefaultCLI使用

先说结论:对于三种Cli,Generic CLI mode、yarn-cluster mode、default mode,无法同时使用,源码使用顺序为Generic CLI mode优先判断,接着是 yarn-cluster mode ,最后是default mode,所以对于三种Cli的参数,不能混用,否则会出现命令不生效的情况,具体使用以及源码见下…

【滤波跟踪】基于matlab扩展卡尔曼滤波的无人机路径跟踪【含Matlab源码 2236期】

⛄一、EKF算法简介 扩展卡尔曼滤波是利用泰勒级数展开方法将非线性滤波问题转化成近似的线性滤波问题,利用线性滤波的理论求解非线性滤波问题的次优滤波算法。其系统的状态方程和量测方程分别如式(1)、式(2)所示: 式中,X(k)为n维的随机状态向量序列,Z(k)为n维的随机量测向量序…

Matlab 对连续时间信号的运算

Matlab 对连续时间信号的运算 1、连续时间系统零状态响应 题目&函数说明 连续时间系统的微分方程为 y"(t) 4y’(t) 3y(t) f’(t) 2f(t) 当 输入信号 f(t) 20e-2tu(t) 时&#xff0c;初始值 y(0-) 2, y’(0-) 1, 求系统的零状态响应 Matlab 库函数中的 lsim(…

GNN Tensorflow packages

tf framework定义 tf.name_scope()函数 tf.name_scope(name)&#xff0c;用于定义python op的上下文管理器。 此上下文管理器将推送名称范围&#xff0c;这将使其中添加的所有操作的名称带有前缀。 例如&#xff0c;定义一个新的Python op my_op&#xff1a; def my_op(a,…

scratch踢足球 电子学会图形化编程scratch等级考试一级真题和答案解析2022年9月

目录 scratch踢足球 一、题目要求 1、准备工作 2、功能实现 二、案例分析

代码随想录算法训练营第三十九天| LeetCode62. 不同路径、LeetCode63. 不同路径 II

一、LeetCode62. 不同路径 1&#xff1a;题目描述&#xff08;62. 不同路径&#xff09; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下…

python 视角下的 6 大程序设计原则

众所周知&#xff0c;python 是面向对象的语言。 但大多数人学习 python 只是为了写出“能够实现某些任务的自动化脚本”&#xff0c;因此&#xff0c;python 更令人熟知的是它脚本语言的身份。 那么&#xff0c;更近一步&#xff0c;如果使用 python 实现并维护一个大的项目…

基于SpringBoot的CSGO赛事管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SpringBoot 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目…

为研发效能而生|一场与 Serverless 的博弈

2022 年 11 月 3 日&#xff0c;第三届云原生编程挑战赛即将迎来终极答辩&#xff0c;18 支战队、32 位云原生开发者入围决赛&#xff0c;精彩即将开启。 云原生编程挑战赛项目组特别策划了《登顶之路》系列选手访谈&#xff0c;期待通过参赛选手的故事&#xff0c;看到更加生…

第1章 计算机系统概述

1.1 操作系统的基本概念 1.1.1 操作系统的概念 操作系统是计算机系统中最基本的系统软件。 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;是指控制和管理整个计算机系统的硬件与软件资源&#xff0c;合理地组织、调度计算机的工作与资源的分配&#xff0c;进…

锐捷端口安全实验配置

端口安全分为IPMAC绑定、仅IP绑定、仅MAC绑定 配置端口安全是注意事项 如果设置了IPMAC绑定或者仅IP绑定&#xff0c;该交换机还会动态学习下联用户的MAC地址 如果要让IPMAC绑定或者仅IP绑定的用户生效&#xff0c;需要先让端口安全学习到用户的MAC地址&#xff0c;负责绑定不生…

如何参与一个开源项目!

今天教大家如何给开源项目提交pr&#xff0c;成为一名开源贡献者。pr是 Pull Request 的缩写&#xff0c;当你在github上发现一个不错的开源项目&#xff0c;你可以将其fork到自己的仓库&#xff0c;然后再改动一写代码&#xff0c;再提交上去&#xff0c;如果项目管理员觉得你…

【建议收藏】回收站数据恢复如何操作?3个方案帮你恢复删除的文件

在使用电脑时&#xff0c;我们经常会清理不需要的文件数据。电脑回收站被清空了&#xff0c;但是里面有我们重要的数据&#xff0c;回收站数据恢复如何操作&#xff1f;不如试试下面的3个方案&#xff0c;一起来了解一下回收站数据恢复吧&#xff01; 一、注册表恢复回收站数据…

电脑视频转换成mp4格式,视频格式转换器转换

怎么把电脑视频转换成mp4格式&#xff1f;使用视频转换器&#xff0c;可以转换来自各种设备的音视频格式&#xff0c;包括相机、手机、视频播放器、电视、平板电脑等。因此&#xff0c;音视频爱好者都可以使用它在各种设备上播放或在社交平台上分享。 主要人群及作用&#xff1…

BHQ-2 NHS,916753-62-3作为各种荧光共振能量转移DNA检测探针中淬灭部分

英文名称&#xff1a;BHQ-2 NHS CAS&#xff1a;916753-62-3 外观&#xff1a;深紫色粉末 分子式&#xff1a;C29H29N7O8 分子量&#xff1a;603.59 储存条件&#xff1a;-20C&#xff0c;在黑暗中 结构式&#xff1a; 凯新生物产品简介&#xff1a; 黑洞猝灭剂-2&#…

pytorch初学笔记(九):神经网络基本结构之卷积层

目录 一、torch.nn.CONV2D 1.1 参数介绍 1.2 stride 和 padding 的可视化 1.3 输入、输出通道数 1.3.1 多通道输入 1.3.2 多通道输出 二、卷积操作练习 2.1 数据集准备 2.2 自定义神经网络 2.3 卷积操作控制台输出结果 2.4 tensorboard可视化 三、完整代码 一、torc…

NestJS 使用体验 | 不如 Spring Boot

本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问. 文章目录前言正文开发体验运行体验总结相关内容推广前言 公司里近期在尝试部署一些业务到阿里云的函数计算上, 受之前迁移已有的 Spring Boot…

TestStand-调试VI

文章目录调试VI调试VI 在LabVIEW PASS/FAIL TEST步骤中放置一个断点。 ExecuteRun MainSequence。执行在LabVIEW PASS/FAIL处暂停测试步骤。 3.完成以下步骤来调试LabVIEW PASS/FAIL TEST VI步骤。 a.在TestStand的调试工具栏上单击step into&#xff08;步进&#xff09;…