SSM图书管理系统(增强版,附源码)

news2024/11/24 1:47:18

前篇引入(新人必看):SSM图书管理系统(原版)

之前给大家分享过SSM图书管理系统项目的源码,热度较高,但我也发现功能并不是很全面,所以这次对系统进行了功能增强,以下是系统改动的几个方面

1、数据库改动

  • users表添加了两个字段:major(专业)、gender(性别)

  • books表添加了一个字段:times(书籍被借次数)

  • 添加了log表,也就是记录日志的表

如果已经搭建过之前的项目,这里建议各位重新创建个数据库,名称为librarydb,避免跟之前的数据库冲突

2、普通用户页面,添加了个人中心菜单

个人中心,显示当前用户的基本信息,如用户名、密码、性别等属性,也可编辑修改

3、超级管理员页面,添加了日志管理和图表分析菜单

日志管理,所有角色登录系统后都会记录下来,日志记录了用户名、用户角色、浏览器类型、用户IP、登录时间。
下载项目文件夹后你会发现比以前多了util包,该包下的BrowserUtil和IpUtil就是获取浏览器类型和IP的工具类
在查询方面,可根据用户名精准查询

图表分析,以书籍分类为准,统计每个分类下书籍的数目,使用到了Echats技术,功能效果如图

Echarts官网:https://echarts.apache.org/zh/index.html

关于修改

当然如果你先只添加以上的某个功能,可以找到对应页面的代码,改变你要显示的菜单即可,下面以超级管理员菜单对应的sysadmin/index.jsp文件为例:

<script>
    BUI.use('common/main',function(){
        var config = [
        {id:'1',menu:[
                {text:'系统管理',items:[
                    {id:'3',text:'用户管理',href:'<%=request.getContextPath()%>/sysadmin/showUser'},
                    {id:'12',text:'书籍管理',href:'<%=request.getContextPath()%>/sysadmin/show'},
                    {id:'13',text:'类别管理',href:'<%=request.getContextPath()%>/sort/findAll'},
                    {id:'14',text:'登录日志',href:'<%=request.getContextPath()%>/sysadmin/log'}
                   ]
                },
                {
                    text: '图表管理', items: [
                        {id: '15', text: '图表分析', href: '<%=request.getContextPath()%>/sysadmin/chart'},
                    ]
                }
            ]
        },

    ];
        new PageUtil.MainPage({
            modulesConfig : config
        });
    });
</script>


核心代码

日志实体类:

package com.xian.pojo;

import com.fasterxml.jackson.annotation.JsonFormat;

import java.sql.Timestamp;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;

//登录日志实体类
public class Log {
    private Integer id;
    private String code;
    private String role;
    private String browser;
    private Timestamp datetime;
    private String ip;
    // 页面数据
    private int start;
    // 当前页数
    private int currentPage;
    public Log() {}

    public Log(Integer id, String code, String role, String browser, Timestamp datetime, String ip) {
        this.id = id;
        this.code = code;
        this.role = role;
        this.browser = browser;
        this.datetime = datetime;
        this.ip = ip;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getBrowser() {
        return browser;
    }

    public void setBrowser(String browser) {
        this.browser = browser;
    }

    public Date getDatetime() {
        return datetime;
    }

    public void setDatetime(Timestamp datetime) {
        this.datetime = datetime;
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public void setCurrentPage(int currentPage) {
        this.currentPage = currentPage;
    }

    @Override
    public String toString() {
        return "Log{" +
                "id=" + id +
                ", code='" + code + '\'' +
                ", role='" + role + '\'' +
                ", browser='" + browser + '\'' +
                ", datetime=" + datetime +
                ", ip='" + ip + '\'' +
                '}';
    }
}

控制层PageController,当请求/login时,而且用户成功登录,就会调用LogService的redcord方法,对登录日志保存到数据库

package com.xian.controller;

@Controller
public class PageController {
	@Autowired
	private BooksService bookService;

	@Autowired
	private AdminService adminService;

	@Autowired
	private SysAdminService sysAdminService;

	@Autowired
	private SortService sortService;

	@Autowired
	private LogService logService;

	@RequestMapping("/index")
	public String toIndex() {
		return "login";
	}

	@RequestMapping("/login")
	public String login(Users user, int loginType, Model model, HttpServletRequest request, HttpSession session) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Timestamp timestamp = null;
		try {
			Date date = sdf.parse(sdf.format(new Date()));
			timestamp = new Timestamp(date.getTime());
		}catch (Exception e){
			e.printStackTrace();
		}
		// 普通用户
		if (loginType == 1) {
			Users users = bookService.selectUser(user);
			if (users != null) {
				logService.record(new Log(null,user.getCode(),"普通用户", BrowserUtil.getBrower(request),timestamp, IpUtil.getIpAddr(request)));
				session.setAttribute("user", users);
				return "redirect:/user/index";
			} else {
				model.addAttribute("msg", "账号或密码错误");
				return "login";
			}
		} else if (loginType == 2) {
			Admin admin = adminService.getAdmin(user);
			if (admin != null) {
				session.setAttribute("admin", admin);
				logService.record(new Log(null,admin.getCode(),"管理员", BrowserUtil.getBrower(request), timestamp, IpUtil.getIpAddr(request)));
				return "redirect:/admin/index";
			} else {
				model.addAttribute("msg", "账号或密码错误");
				return "login";
			}
		} else if (loginType == 3) {
			SysAdmin sysAdmin = sysAdminService.getSysAdmin(user);
			if (sysAdmin != null) {
				session.setAttribute("sysAdmin", sysAdmin);
				logService.record(new Log(null,sysAdmin.getCode(),"超级管理员", BrowserUtil.getBrower(request),timestamp, IpUtil.getIpAddr(request)));
				return "redirect:/sysadmin/index";
			} else {
				model.addAttribute("msg", "账号或密码错误");
				return "login";
			}
		}
		return "login";
	}

}

如何获取源码?

进入《亦码》小程序,查看SSM源码分类下即可获得

 

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

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

相关文章

新手入门搭建一个spring boot项目

1. 打开Idea,新建一个maven项目&#xff0c;详细情况见下图&#xff0c;&#xff08;idea版本2021.1.2&#xff09; 2.查看新建项目的maven包是否存在&#xff0c; 注意&#xff1a;maven包需要自己去下载&#xff0c;注意要下载与版本对应匹配的包 3.导入spring boot 相关的依…

springboot 连接不上 redis 的三种解决方案!

针对于springboot 连接不上 redis 这种情况&#xff0c;首先&#xff0c;我们最简单直接的方法就是需要确认Redis是否已经正常启动&#xff08;验证方法&#xff1a;如果安装在Linux下的话可以使用ps-ef|grep redis来进行确认是否开启&#xff09; 如果未开启&#xff0c;我们可…

STL-string的接口使用及模拟实现

文章目录string类的介绍string类的常用接口介绍 构造相关 无参构造字符串构造拷贝构造 容量相关的接口 sizereserveresizecapacityemptyclear 数据访问及遍历相关的接口 operator[]begin endrbegin rend 修改数据相关的接口 push_backoperatorinserterasec_strfind npossubs…

Redis搭建主从集群

搭建集群 建集群的第一件事情我们需要一些运行在 集群模式的Redis实例。这意味这集群并不是由一些普通的Redis实例组成的&#xff0c;集群模式需要通过配置启用&#xff0c;开启集群模式后的Redis实例便可以使用集群特有的命令和特性了。 下面是一个最少选项的集群的配置文件…

@Builder注解在子类中使用遇到的问题

场景 在项目开发中&#xff0c;需要基于某个类进行一些字段的拓展&#xff0c;那么自然而然想到的做法是extends该类。而两个类都需要使用Builder进行构造。代码如下&#xff1a; Data Builder AllArgsConstructor NoArgsConstructor public class EmployeeDto {private Stri…

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~

详解 Vue3 中如何使用 Proxy 来实现响应式的技术~写在前面剖析 Vue2 中是如何实现响应式的Vue2 的响应式存在什么问题&#xff1f;Vue3 响应式一、ref 函数二、reactive 函数reactive 响应式原理 - ProxyVue3 中的响应式解决了 Vue2 中存在的问题写在前面 Vue3 中的响应式原理…

C++:STL:常见容器:stack,queue, list

一&#xff1a;stack容器 1.1: stack基本概念 概念&#xff1a;stack是一种先进后出 &#xff08;First in last out FILO&#xff09;的数据结构&#xff0c;它只有一个出口。 栈中&#xff1a; 1&#xff1a;只有栈顶的元素才可以被外界使用&#xff0c;因此栈不允许有遍历…

从FrameDebugger看Unity渲染

从FrameDebugger看Unity渲染(一) Unity如何渲染一个3D2D的游戏画面&#xff0c;今天通过FrameDebugger来看下Unity内置渲染管线的渲染策略, 后续再出一些URP渲染管线相关的文章。 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c…

MyBatis 实现复杂 Sql 查询

resultMap 结果映射 resultMap 元素是 MyBatis 中最重要最强大的元素&#xff0c;之前所写的 sql 语句&#xff0c;返回值都是简单的基本数据类型或者某一个实体类&#xff0c;比如下面这段 sql 返回的就是最简单的 User 类型。 <select id"getUserById" result…

微信HOOK 协议接口 实战开发篇 3.收发文本消息 附详细步骤

前言&#xff1a;本次文章附带详细的HOOK步骤&#xff0c;感兴趣可以尝试一番 使用了之前文章提到的字符搜索法 接收消息 1.OD打开微信&#xff0c;点击e&#xff0c;进入模块列表 2.双击wechatwin模块进入汇编代码页面 3.右键菜单&#xff0c;选择如图示选项 4.进入字符页…

【 uniapp - 黑马优购 | tabBar】如何创建和配置标签栏

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大二在校生&#xff0c;讨厌编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;小新爱学习. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc…

zabbix监控redis修正nodata问题

之前根据网上的资料尝试监控redis&#xff0c;完成后编写了文档。 https://blog.csdn.net/bigwood99/article/details/128404063 这几天观察数据&#xff0c;发现没有数据被采集。 在图标中显示no data。 检查模板中item和graphs设置&#xff0c;发现key中没有使用引号。 …

修复U盘【笔记】

修复U盘【笔记】前言参考修复U盘问题0.芯片精灵查看1.用APTool软件擦除量产信息2.用CBMTool量产U盘结果我的版本最后前言 以下内容源自网络 仅供学习交流使用 参考 总体步骤&芯片精灵下载&#xff1a;https://www.xpwin7.com/jiaocheng/25627.html 资源下载网址来源&am…

组织上线 | 资源共享,协作自如

新功能&#xff5e;&#xff01;期待已久的组织协作上线啦&#xff01; 上线后支持在组织下创建镜像&#xff0c;组织成员可查看、拉取镜像&#xff0c;快速实现镜像资源共享&#xff0c;组织高效协同。 具体怎么操作呢&#xff1f;跟我一起来看一下吧&#xff5e; 创建组织 …

Pandas计算历史均值

在用Python进行时间序列分析时&#xff0c;我们可能经常需要计算历史的一些特征。一般会使用rolling()函数&#xff0c;这里介绍一下计算包括当前行的历史特征和不包括当前行的历史特征 1. 包括当前行 这里先简单介绍一下rolling()函数 pandas.DataFrame.rolling官方文档 Dat…

数据库,计算机网络、操作系统刷题笔记19

数据库&#xff0c;计算机网络、操作系统刷题笔记19 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

Vue后台项目的记录 (二)

1、品牌静态管理组件 表单 分页器 2、品牌列表展示 创建相关接口文件 获取品牌管理数据的模块 统一接口管理 在main.js中引入&#xff0c;之后在任意组件中就可以使用了 发请求&#xff0c;获取品牌列表的接口 展示数据 current-change"handlecurrentchange curren…

贤鱼的刷题日常(数据结构队列学习)-2406:Card Stacking--题目详解

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解2406:Card Stacking ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&#xff0c;欢…

LabVIEW如何减少下一代测试系统中的硬件过时5

LabVIEW如何减少下一代测试系统中的硬件过时5 Steps to Replace Instruments Performance Requirements The important consideration to make when replacing instruments isthat the replacements must meet your requirements, usually by having equal orbetter measure…

6.1 微服务-Redis

6.1.1 Redis 6.1.1.1 前言 前面使用到的mysql数据库会出现以下问题 由于用户量增大&#xff0c;请求数量也随之增大&#xff0c;数据压力过大 多台服务器之间数据不同步 多台服务器之间的锁&#xff0c;已经不存在互斥性了。 6.1.1.2 Redis 6.1.1.2.1 什么是Redis Redi…