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

系统原版功能(新人必看)

1、该系统分三种用户角色:普通用户、管理员、超星管理员,分别对应users、admins、sysadmin数据库表

b4a381e280afacf7e8137c9619c172f8.png

2、普通用户基本功能:查询书籍、借阅书籍、归还书籍

e0ad76c32d792bb54c9e2616cd7cf823.png

3、管理员基本功能:借书处理、还书处理

27295dc3b6847a1b47bd5748d578b41a.png

4、超级管理员功能:普通用户管理、书籍管理、类别管理

扫描二维码关注公众号,回复: 14838099 查看本文章

98d49aa4db8609d306a72422d44b8268.png


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

31641add5a8908efefa6afac23bb6fc2.png

1、数据库改动

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

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

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

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

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

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

02c19f1d73feb13b5ff64f5b6e6c636e.png

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

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

3db84d1f2b28c678774f84be35e88d3d.png

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

d53bc8b1f1a72184fe13c417fa63f772.png

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

13fb09525b1222cb8b2928c5d3d233f5.png

关于修改

当然如果你先只添加以上的某个功能,可以找到对应页面的代码,改变你要显示的菜单即可,下面以超级管理员菜单对应的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源码分类下即可获得

 

猜你喜欢

转载自blog.csdn.net/calm_programmer/article/details/128449915