基于SSM的疫情物资管理系统

news2024/11/27 10:45:38

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


目录

一、项目简介

二、项目背景

三、项目目标

四、系统设计与实现

1.数据库设计

2.系统架构设计

3.系统功能设计

五、系统项目截图

1.登录页面

2.采购员登录

3.财务员登录

4.后勤员登录

5.管理员登录

六、核心代码

1.登录相关

2.文件上传

3.封装


一、项目简介

本文介绍的是基于SSM框架的疫情物资管理系统,该系统旨在提高物资管理的效率和质量,为疫情期间的防控工作提供支持。为了实现该系统的目标,我们设计了以下主要功能:修改密码、个人信息修改、采购员管理、财务员管理、后勤员管理、物资分类管理、物资采购管理、财务报销管理、入库信息管理、申领信息管理等。

本系统的采用了Spring、SpringMVC和MyBatis(SSM)框架,其中Spring提供了依赖注入、AOP等基础设施,提高了代码的可维护性和可扩展性;Spring MVC负责分发请求和控制器的映射,使得系统具有良好的结构性和可控性;MyBatis则是本系统的数据访问层,实现了对数据的快速访问和高效操作。

本系统的用户角色主要分为采购员、财务员和后勤员,他们对应的职责不同。采购员主要负责物资的采购和管理,财务员负责对物资的财务报销管理,后勤员则负责对物资的存储、管理和发放。本系统为每个用户提供了专属的登录账号和密码,并且允许用户在登录后修改自己的密码和个人信息。

物资的分类管理是本系统的重点之一,因为物资种类繁多,需要进行适当分类才能更好的管理。我们设计了物资分类树状图,在这个页面上对物资进行分类管理。采购员可以在物资采购管理模块中提交采购请求,财务员审核通过后,方可进行采购操作。采购或者领取到的物资需要入库管理,管理员可以在入库信息管理模块中对其进行记录。申领物资时,用户需要在申领信息管理中填写申领表单,经过管理员审核后,方可领取物资。

总之,本系统提供了完善的物资管理解决方案,实现了对物资采购、存储、管理和领取的全程监控和管理,为疫情期间的防控工作提供了有力的支持。未来我们将进一步完善该系统,扩展其功能和适用性,提供更好的服务。


二、项目背景

在当前疫情期间,物资的管理和调配变得格外重要,各级政府、企事业单位和社会各界都积极参与疫情防控工作。然而,由于物资调配任务的复杂性和新冠疫情的特殊性,许多地区和单位的物资采购、管理、调配和申领等方面还存在许多问题。因此,设计一款基于SSM框架的疫情物资管理系统,可以帮助各级单位更好地统计物资的供需信息、实现精细化管理和科学调配,大大提高物资利用率和工作效率。


三、项目目标

本项目的最终目标是设计一款基于SSM框架的疫情物资管理系统,通过系统对不同角色的权限设置和操作,实现物资采购、入库、管理和申领等业务流程,大大提高物资利用率和工作效率。

四、系统设计与实现

1.数据库设计

本系统采用MySQL数据库,设计了物资信息、员工信息、采购信息、财务信息、后勤信息等5个主要数据表。其中,员工信息表包括员工ID、员工姓名、员工身份、员工密码、联系方式等字段;物资信息表包括物资ID、物资名称、物资种类、物资规格、物资价格等字段;采购信息表包括采购信息ID、采购物资ID、采购日期、采购数量、采购员ID等字段;财务信息表包括报销信息ID、报销日期、报销金额、报销员工ID等字段;后勤信息表包括入库信息ID、入库日期、入库物资ID、入库数量、入库员工ID、出库信息ID、出库日期、出库物资ID、出库数量、出库员工ID等字段。

2.系统架构设计

本系统采用SSM框架,包括Spring、SpringMVC和MyBatis三个主要模块。其中,Spring负责管理对象的生命周期和依赖关系,SpringMVC负责处理请求和响应,MyBatis负责映射数据库和执行SQL语句。同时,前端采用Bootstrap框架,可以提高系统的界面美观度和易用性。

3.系统功能设计

(1)登录模块

用户通过输入用户名和密码后,系统会根据用户身份信息判断用户的权限,并展示对应页面。

(2)修改密码模块

用户可以在系统中修改自己的密码,保障密码的安全性。

(3)个人信息修改模块

用户可以在系统中修改自己的个人信息,包括联系方式等字段。

(4)采购员管理模块

采购员可以查看物资信息、提交采购申请、查看采购历史等功能。其中,提交采购申请包括填写采购物资种类、数量和价格等信息,等待财务审核。

(5)财务员管理模块

财务员可以对采购申请进行审核和报销,以及查看财务报销历史等功能。其中,审核采购申请包括查看采购物资种类、数量和价格等信息,审核通过后将报销金额记录到财务报销信息表中,等待下一步入库操作。

(6)后勤员管理模块

后勤员可以对物资进行入库操作,包括填写入库物资信息、数量和日期等字段。同时,后勤员还可以对已入库的物资进行出库操作,包括填写出库物资信息、数量和日期等字段。

(7)物资分类管理模块

管理员可以对物资进行分类管理,包括新增物资种类、删除物资种类和修改物资种类等功能。

(8)物资采购管理模块

管理员可以查看所有采购信息、审核采购申请和删除采购信息等功能。

(9)财务报销管理模块

管理员可以查看财务报销历史,介入审核过程等功能。

(10)入库信息管理模块

管理员可以查看所有入库信息、删除入库信息等功能。

(11)申领信息管理模块

管理员可以查看所有申领信息、审核申领信息等功能。

五、系统项目截图

1.登录页面

管理员、采购员、财务员、后勤员都在这里进行登录。

2.采购员登录

采购员进入系统可以看到有物资分类管理、物资采购管理、财务报销管理。

3.财务员登录

财务员登录到系统可以看到有物资采购、财务报销功能。

4.后勤员登录

后期人员登录后可以看到有采购管理、入库信息管理、申领信息管理。

5.管理员登录

管理员进入系统可以看到有修改密码、个人信息修改、采购员管理、财务员管理、后勤员管理、物资分类管理、物资采购管理、财务报销管理、入库信息管理、申领信息管理等。


六、核心代码

1.登录相关


package com.controller;


import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.TokenEntity;
import com.entity.UserEntity;
import com.service.TokenService;
import com.service.UserService;
import com.utils.CommonUtil;
import com.utils.MD5Util;
import com.utils.MPUtil;
import com.utils.PageUtils;
import com.utils.R;
import com.utils.ValidatorUtils;

/**
 * 登录相关
 */
@RequestMapping("users")
@RestController
public class UserController{
	
	@Autowired
	private UserService userService;
	
	@Autowired
	private TokenService tokenService;

	/**
	 * 登录
	 */
	@IgnoreAuth
	@PostMapping(value = "/login")
	public R login(String username, String password, String captcha, HttpServletRequest request) {
		UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
		if(user==null || !user.getPassword().equals(password)) {
			return R.error("账号或密码不正确");
		}
		String token = tokenService.generateToken(user.getId(),username, "users", user.getRole());
		return R.ok().put("token", token);
	}
	
	/**
	 * 注册
	 */
	@IgnoreAuth
	@PostMapping(value = "/register")
	public R register(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

	/**
	 * 退出
	 */
	@GetMapping(value = "logout")
	public R logout(HttpServletRequest request) {
		request.getSession().invalidate();
		return R.ok("退出成功");
	}
	
	/**
     * 密码重置
     */
    @IgnoreAuth
	@RequestMapping(value = "/resetPass")
    public R resetPass(String username, HttpServletRequest request){
    	UserEntity user = userService.selectOne(new EntityWrapper<UserEntity>().eq("username", username));
    	if(user==null) {
    		return R.error("账号不存在");
    	}
    	user.setPassword("123456");
        userService.update(user,null);
        return R.ok("密码已重置为:123456");
    }
	
	/**
     * 列表
     */
    @RequestMapping("/page")
    public R page(@RequestParam Map<String, Object> params,UserEntity user){
        EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
    	PageUtils page = userService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.allLike(ew, user), params), params));
        return R.ok().put("data", page);
    }

	/**
     * 列表
     */
    @RequestMapping("/list")
    public R list( UserEntity user){
       	EntityWrapper<UserEntity> ew = new EntityWrapper<UserEntity>();
      	ew.allEq(MPUtil.allEQMapPre( user, "user")); 
        return R.ok().put("data", userService.selectListView(ew));
    }

    /**
     * 信息
     */
    @RequestMapping("/info/{id}")
    public R info(@PathVariable("id") String id){
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }
    
    /**
     * 获取用户的session用户信息
     */
    @RequestMapping("/session")
    public R getCurrUser(HttpServletRequest request){
    	Long id = (Long)request.getSession().getAttribute("userId");
        UserEntity user = userService.selectById(id);
        return R.ok().put("data", user);
    }

    /**
     * 保存
     */
    @PostMapping("/save")
    public R save(@RequestBody UserEntity user){
//    	ValidatorUtils.validateEntity(user);
    	if(userService.selectOne(new EntityWrapper<UserEntity>().eq("username", user.getUsername())) !=null) {
    		return R.error("用户已存在");
    	}
        userService.insert(user);
        return R.ok();
    }

    /**
     * 修改
     */
    @RequestMapping("/update")
    public R update(@RequestBody UserEntity user){
//        ValidatorUtils.validateEntity(user);
        userService.updateById(user);//全部更新
        return R.ok();
    }

    /**
     * 删除
     */
    @RequestMapping("/delete")
    public R delete(@RequestBody Long[] ids){
        userService.deleteBatchIds(Arrays.asList(ids));
        return R.ok();
    }
}

2.文件上传

package com.controller;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.UUID;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import com.annotation.IgnoreAuth;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.entity.EIException;
import com.service.ConfigService;
import com.utils.R;

/**
 * 上传文件映射表
 */
@RestController
@RequestMapping("file")
@SuppressWarnings({"unchecked","rawtypes"})
public class FileController{
	@Autowired
    private ConfigService configService;
	/**
	 * 上传文件
	 */
	@RequestMapping("/upload")
	public R upload(@RequestParam("file") MultipartFile file,String type) throws Exception {
		if (file.isEmpty()) {
			throw new EIException("上传文件不能为空");
		}
		String fileExt = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".")+1);
		File path = new File(ResourceUtils.getURL("classpath:static").getPath());
		if(!path.exists()) {
		    path = new File("");
		}
		File upload = new File(path.getAbsolutePath(),"/upload/");
		if(!upload.exists()) {
		    upload.mkdirs();
		}
		String fileName = new Date().getTime()+"."+fileExt;
		File dest = new File(upload.getAbsolutePath()+"/"+fileName);
		file.transferTo(dest);
		FileUtils.copyFile(dest, new File("C:\\Users\\Desktop\\jiadian\\springbootl7own\\src\\main\\resources\\static\\upload"+"/"+fileName));
		if(StringUtils.isNotBlank(type) && type.equals("1")) {
			ConfigEntity configEntity = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile"));
			if(configEntity==null) {
				configEntity = new ConfigEntity();
				configEntity.setName("faceFile");
				configEntity.setValue(fileName);
			} else {
				configEntity.setValue(fileName);
			}
			configService.insertOrUpdate(configEntity);
		}
		return R.ok().put("file", fileName);
	}
	
	/**
	 * 下载文件
	 */
	@IgnoreAuth
	@RequestMapping("/download")
	public ResponseEntity<byte[]> download(@RequestParam String fileName) {
		try {
			File path = new File(ResourceUtils.getURL("classpath:static").getPath());
			if(!path.exists()) {
			    path = new File("");
			}
			File upload = new File(path.getAbsolutePath(),"/upload/");
			if(!upload.exists()) {
			    upload.mkdirs();
			}
			File file = new File(upload.getAbsolutePath()+"/"+fileName);
			if(file.exists()){
				/*if(!fileService.canRead(file, SessionManager.getSessionUser())){
					getResponse().sendError(403);
				}*/
				HttpHeaders headers = new HttpHeaders();
			    headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);    
			    headers.setContentDispositionFormData("attachment", fileName);    
			    return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return new ResponseEntity<byte[]>(HttpStatus.INTERNAL_SERVER_ERROR);
	}
	
}

3.封装

package com.utils;

import java.util.HashMap;
import java.util.Map;

/**
 * 返回数据
 */
public class R extends HashMap<String, Object> {
	private static final long serialVersionUID = 1L;
	
	public R() {
		put("code", 0);
	}
	
	public static R error() {
		return error(500, "未知异常,请联系管理员");
	}
	
	public static R error(String msg) {
		return error(500, msg);
	}
	
	public static R error(int code, String msg) {
		R r = new R();
		r.put("code", code);
		r.put("msg", msg);
		return r;
	}

	public static R ok(String msg) {
		R r = new R();
		r.put("msg", msg);
		return r;
	}
	
	public static R ok(Map<String, Object> map) {
		R r = new R();
		r.putAll(map);
		return r;
	}
	
	public static R ok() {
		return new R();
	}

	public R put(String key, Object value) {
		super.put(key, value);
		return this;
	}
}

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

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

相关文章

公民开发者学习无代码编程,从CRUD开始

目录 1 创建数据表2 创建新增页面3 新增功能开发4 预览总结 自从Forrester2014年提出低代码的概念后&#xff0c;对于编程人员重新进行了划分。使用传统开发工具&#xff0c;使用代码进行编程的叫专业开发人员。使用低代码或者无代码开发工具&#xff0c;作为企业内部的人员&am…

基于深度学习的高精度老鼠检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度老鼠检测识别系统可用于日常生活中检测与定位老鼠目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的老鼠目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据…

如何确定bug是前端还是后端的错误?

前言&#xff1a;学会分析一个bug属于前端还是后端的错误&#xff0c;可方便开发快速定位问题&#xff0c;缩短与开发的沟通成本&#xff0c;也是测试人员的必备技能&#xff0c;笔者面试时就曾经被问到过&#xff0c;那就一起分析一波吧。 一、定义bug类型&#xff1a; 1、…

app渗透-抓包

app渗透-1 前言1.模拟器2.抓包工具-Fiddler2.1抓app包2.1.1设置模拟器2.1.2设置fiddler2.1.3使用 2.2抓小程序2.2.1抓包2.2.2解决抓不到https2.2.3解决抓不到包-12.2.4解决抓不到包-22.2.5解决抓不到包-3 前言 不要把app和小程序想的多困难&#xff0c;其实就是一个小的网站塞…

2023-06-01:讲一讲Redis常见数据结构以及使用场景。

2023-06-01&#xff1a;讲一讲Redis常见数据结构以及使用场景。 答案2023-06-01&#xff1a; 字符串&#xff08;String&#xff09; 适合场景 缓存功能 Redis 作为缓存层&#xff0c;MySQL 作为存储层&#xff0c;在大部分请求中&#xff0c;数据的读取通常是从 Redis 中…

Python笔记(更新ing)

目录 第一章 Python初识1、什么是编程语言2、第一个Python程序 第二章 基本语法1、 字面量2、 注释3、 变量4、 数据类型5、 数据类型转换6、 标识符7、 运算符8、 字符串扩展9、 字符串拼接10、 字符串格式化11、 字符串格式化的精度控制12、 字符串格式化的方式二13、 对表达…

deepin安装docker和pytorch

title: deepin安装docker和pytorch date: 2023-06-01 17:28:58 tags: [linux, torch,docker] deepin安装docker和pytorch 总体的流程图大致如下&#xff0c;首先是安装linux&#xff0c;这个直接跳过&#xff0c;接下来就是安装docker&#xff0c;之后&#xff0c;安装docker之…

推动科技教育普惠|2023 开放原子全球开源峰会校源行分论坛即将启幕

科技创新&#xff0c;人才先行&#xff0c;高校作为开源人才培养的主阵地&#xff0c;在开源的发展中扮演着关键角色。 6 月 13 日&#xff0c;2023 开放原子全球开源峰会校源行分论坛将在北京经开区亦创国际会展中心盛大举行。论坛以“聚缘于校、开源共行”为主题&#xff0c;…

上海亚商投顾:沪指冲高回落微涨 AI应用端再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日冲高回落&#xff0c;创业板指相对偏强。AI应用端再度爆发&#xff0c;传媒、影视、游戏等方向领涨&a…

『Linux』第九讲:Linux多线程详解(四)_ 生产者消费者模型

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;三&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;四&#xff09;&#xff0c;内容大致是生产消费者模型&#xff0c;讲解下面开始&#xff01; 「归属专栏」Linux系…

实用调试技巧与案例分析

目录 调试(Debug)&#xff1a; 调试的基本步骤&#xff1a; Debug和Release的介绍&#xff1a; 几个常用的快捷键&#xff1a; 案例一&#xff1a; 案例二&#xff1a; 如何写出好(易于调试)的代码&#xff1f; 案例一&#xff1a; 1.assert用法 2.const用法 案例二…

离散数学-数理逻辑

《离散数学》是计算机专业的一门十分重要的专业基础课。离散数学作为有力的数学工具对计算机的发展、计算机研究起着重大的作用。目前&#xff0c;计算机科学中普通采用离散数学中的一些基本概念、基本思想和基本方法。通过本课程的学习&#xff0c;掌握数理逻辑、集合论、代数…

6月1号软件资讯更新合集......

Chrome 114 正式发布&#xff0c;支持 CHIPS 自 Chrome 113 发布以来&#xff0c;已经过了四个星期&#xff0c;Google 近日也准时发布了 Chrome 114。Chrome 114 默认启用了 CHIPS&#xff0c;这是 Google 通过新的 cookie 属性来淘汰第三方 Cookie 的一部分&#xff1b;Chro…

利用Git及GitHub对项目进行版本控制

目录 一、在本地安装Git 二、利用Git将项目上传到Github上 三、用HTTPS获取GitHub上的项目 四、版本控制 一、在本地安装Git 1、Git安装链接&#xff1a;https://git-scm.com/downloads 2、下载安装包&#xff0c;双击exe文件进行安装&#xff1a; 3、接下来会弹出一系列…

Nginx服务基础、访问控制、虚拟主机

Nginx服务基础、访问控制、虚拟主机 一、Nginx介绍二、Linux系统Nginx安装1、官网下载Nginx压缩包2、编译安装Nginx1.配置环境2.安装依赖包3.创建运行用户、组4.编译安装5.检查、启动、重启、停止 nginx 服务6.添加Nginx系统服务 三、Nginx配置文件1、全局配置2、I/O 事件配置3…

水务漏损管理中存在的问题及解决方法

原文链接https://mp.weixin.qq.com/s?__bizMzg3NzkxNTI1MA&mid2247484559&idx1&snd1402e3f9fc75f7483a9dca3fc0174d4&chksmcf1af992f86d7084c48ce7e4072fd6be0555ec086c1065ef83398390c8bd19f2560daf594d7c&token955052059&langzh_CN#rd 在供水建设管…

Codeforces Round 875 div.2 problemB. Array merging题解

目录 一、题目 二、题目分析 三、 一、题目 传送门 B. Array merging time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output You are given two arrays a and b both of length n. You will merge††…

Python获取各大企业招聘需求以及可视化分析展示

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 课程亮点 1、爬虫的基本流程 2、可视化分析展示 3、requests模块的使用 4、保存csv 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 模块使用: 内置模块: import pprint >>> 格式化输入…

Linux提权:定时任务 环境变量 配置不当 数据库

目录 环境变量配合SUID 实战测试 原理分析 实战中如何发现挖掘这类安全问题 定时任务打包配合SUID 原理分析 定时任务权限配置不当 数据库提权-梭哈的艺术 隧道出网提权 环境变量配合SUID 实战测试 这个提权方法比较鸡肋&#xff0c;因为它需要两个前提条件&#xf…

C语言:函数栈帧

寄存器&#xff1a; eax ebx ecx edx ebp esp 必须理解这两个寄存器&#xff08;寄存器是独立于内存的&#xff09; 这两个寄存器存放的是地址&#xff0c;用来维护函数栈帧&#xff08;正在调用哪个函数&#xff0c;两个寄存器就维护哪个函数的栈帧&#xff09; 每一个函数都…