Java项目:12 Springboot的垃圾回收管理系统

作者主页:舒克日记

简介:Java领域优质创作者、Java项目、学习资料、技术互助

文中获取源码

1.介绍

垃圾分类查询管理系统,对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。
让用户自己分类垃圾,
按国家标准自己分类,
然后在网上提交订单,
专门有人负责回收,
统一回收到垃圾处理站,
然后工人开始再次分类,
将可再次循环使用的贩卖给工厂(以后有钱自己开)。
订单处理完(一般7天内),
将一部分钱返还给用户。
让垃圾变成钱!

1.1 功能点

序号功能点
1用户管理
2页面管理
3角色管理
4首页
5贡献管理
6垃圾管理
7全国统计
8搜索记录
9分类管理
10分类列表
11垃圾列表
12修改奖励
13我的收益
14随机数据
15分类统计
16投放统计
17公告管理
18公告列表
19发布公告
21每日垃圾
22贡献记录
23预约管理

2.软件架构

JDK 1.8
SpringBoot 2.2.6.RELEASE
freemarker 2.3.28
mybatis-plus 3.2.0
shiro 1.3.2

运行指导

idea导入源码空间站顶目教程说明(Vindows版)-ssm篇:

http://mtw.so/5MHvZq

源码地址:http://codegym.top。

3.安装启动

输入图片说明

启动后访问地址:http://127.0.0.1:8083/
用户名:admin、密码:123456
输入图片说明

4.运行截图

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

输入图片说明

代码

CustomRealm

package com.gcms.shiro;

import com.gcms.mapper.UserMapper;
import com.gcms.mapper.UserRoleMapper;
import com.gcms.pojo.User;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.session.Session;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.subject.Subject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.*;

@Component
public class CustomRealm extends AuthorizingRealm {
	/** 用户信息service */
	private final UserMapper userMapper;
	/** 用户权限service */
	private final UserRoleMapper userRoleMapper;
	/** logback日志记录 */
	private final Logger logger = LoggerFactory.getLogger(CustomRealm.class);

	private static Map<String, Session> sessionMap = new HashMap<>();

	@Autowired
	public CustomRealm(UserMapper userMapper, UserRoleMapper userRoleMapper) {
		this.userMapper = userMapper;
		this.userRoleMapper = userRoleMapper;
	}


	/**
	 * @Override
	 * @see org.apache.shiro.realm.AuthenticatingRealm#doGetAuthenticationInfo(AuthenticationToken)
	 *      <BR>
	 *      Method name: doGetAuthenticationInfo <BR>
	 *      获取身份验证信息 Description: Shiro中,最终是通过 Realm 来获取应用程序中的用户、角色及权限信息的。 <BR>
	 * @param authenticationToken 用户身份信息 token
	 * @return 返回封装了用户信息的 AuthenticationInfo 实例
	 * @throws AuthenticationException <BR>
	 */
	@Override
	protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken)
			throws AuthenticationException {
		// 获取token令牌
		UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
		// 从数据库获取对应用户名密码的用户
		User user = userMapper.getByName(token.getUsername());
		if (null == user) {
			logger.warn("{}---用户不存在", token.getUsername());
			// 向前台抛出用户不存在json对象
			throw new AccountException("USERNAME_NOT_EXIST");
		}
		String password = user.getPassword();
		if (null == password) {
			logger.warn("{}---用户不存在", token.getUsername());
			// 向前台抛出用户不存在json对象
			throw new AccountException("USERNAME_NOT_EXIST");
		} else if (!password.equals(new String((char[]) token.getCredentials()))) {
			logger.warn("{}---输入密码错误", token.getUsername());
			// 向前台抛出输入密码错误json对象
			throw new AccountException("PASSWORD_ERR");
		}
		logger.info("{}---身份认证成功", user.getName());
		Subject subject = SecurityUtils.getSubject();
		// 设置shiro session过期时间(单位是毫秒!)
		subject.getSession().setTimeout(7_200_000);

		Session s = subject.getSession();
		String uid = user.getId()+"";

		try {
			Session s2 = sessionMap.get(uid);
			if (s2 != null) {
				s2.setTimeout(0);
				sessionMap.remove(s2);
			}
		} catch (Exception e) {
			// 已经退出,但是还是有他。
			sessionMap.remove(s);
		}
		// 把这个人登录的信息给放进全局变量
		sessionMap.put(uid, s);

		return new SimpleAuthenticationInfo(user, password, getName());
	}

	/**
	 * @Override
	 * @see AuthorizingRealm#doGetAuthorizationInfo(PrincipalCollection)
	 *      <BR>
	 *      Method name: doGetAuthorizationInfo <BR>
	 *      Description: 获取授权信息 <BR>
	 * @param principalCollection
	 * @return <BR>
	 */
	@Override
	protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
		// 从shro里面获取用户对象
		User user = (User) SecurityUtils.getSubject().getPrincipal();
		SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
		// 角色列表
		List<String> roles = null;
		// 获得该用户角色
		if (null != user) {
			roles = userRoleMapper.getRoles(user.getId()+"");
		} else {
			logger.warn("用户session失效!");
		}
		Set<String> set = new HashSet<>();
		// 需要将 role 封装到 Set 作为 info.setRoles() 的参数
		for (String role : roles) {
			set.add(role);
		}
		// 设置该用户拥有的角色
		info.setRoles(set);
		return info;
	}
}

MyUtils

package com.gcms.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.text.Format;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * class name:MyUtils <BR>
 */
public class MyUtils {


	private MyUtils() {
		throw new IllegalStateException("Utility class");
	}

	/** logback日志记录 */
	private static final Logger logger = LoggerFactory.getLogger(MyUtils.class);

	/**
	 * Method name: isEmail <BR>
	 * Description: 判断是不是邮箱,是就返回true <BR>
	 * Remark: <BR>
	 * 
	 * @param email
	 * @return boolean<BR>
	 */
	public static boolean isEmail(String email) {
		String regex = "^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$";
		if (email.matches(regex)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Method name: isPhoneNum <BR>
	 * Description: 判断手机号是不是正确,是就返回true <BR>
	 * Remark: <BR>
	 * 
	 * @param phoneNume
	 * @return boolean<BR>
	 */
	public static boolean isPhoneNum(String phoneNume) {
		String pattern = "^((1[3,5,8][0-9])|(14[5,7])|(17[0,6,7,8])|(19[7]))\\d{8}$";
		if (phoneNume.matches(pattern)) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Method name: nowDate <BR>
	 * Description: 返回当前日期和时间yyyy-MM-dd HH:mm:ss <BR>
	 * Remark: <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getNowDateTime() {
		String dateTime = "";
		String pattern = "yyyy-MM-dd HH:mm:ss";
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		dateTime = sdf.format(date);
		return dateTime;
	}

	/**
	 * Method name: getNowDateYMD <BR>
	 * Description: 返回当前日期和时间 yyyy-MM-dd <BR>
	 * Remark: <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getNowDateYMD() {
		String dateTime = "";
		String pattern = "yyyy-MM-dd";
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		dateTime = sdf.format(date);
		return dateTime;
	}

	/**
	 * Method name: getNowDateCHYMD <BR>
	 * Description: 返回当前日期和时间 yyyy年MM月dd日<BR>
	 * Remark: <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getNowDateCHYMD() {
		String dateTime = "";
		String pattern = "yyyy年MM月dd日";
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		dateTime = sdf.format(date);
		return dateTime;
	}

	/**
	 * Method name: getAutoNumber <BR>
	 * Description: 根据时间获取编号:年月日+4位数字 <BR>
	 * Remark: 格式:201809200001 <BR>
	 * 
	 * @return String<BR>
	 */
	public static synchronized String getAutoNumber() {
		String autoNumber = "";
		int number = 0;
		String oldDate = "";
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String nowDate = sdf.format(new Date());
		File f2 = new File(MyUtils.class.getResource("").getPath());
		String path = f2.getAbsolutePath();

		File f = new File(path + "/date.txt");

		try {
			BufferedReader br = new BufferedReader(new FileReader(f));
			String line = "";
			try {
				line = br.readLine();
				String[] sb = line.split(",");
				oldDate = sb[0];
				if (oldDate.equals(nowDate)) {
					number = Integer.parseInt(sb[1]);
				} else {
					number = 0;
				}
				br.close();
			} catch (IOException e) {
				logger.error("根据时间获取编号出现异常", e);
			}

			autoNumber += nowDate;
			number++;
			int i = 1;
			int n = number;
			while ((n = n / 10) != 0) {
				i++;
			}
			for (int j = 0; j < 4 - i; j++) {
				autoNumber += "0";
			}
			autoNumber += number;

			try {
				BufferedWriter bw = new BufferedWriter(new FileWriter(f));
				bw.write(nowDate + "," + number);
				bw.close();
			} catch (IOException e) {
				logger.error("根据时间获取编号出现异常", e);
			}

		} catch (FileNotFoundException e) {
			logger.error("根据时间获取编号出现异常", e);
		}

		return autoNumber;
	}

	/**
	 * Method name: get2DateDay <BR>
	 * Description: 获取两个日期之间的天数 <BR>
	 * Remark: 如2018-09-01 和 2018-09-017 返回就是17天<BR>
	 * 
	 * @param startDate
	 * @param endDate
	 * @return int<BR>
	 */
	public static int get2DateDay(String startDate, String endDate) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date1 = null;
		Date date2 = null;
		long days = 0;
		try {
			date1 = sdf.parse(startDate);
			date2 = sdf.parse(endDate);
			days = (date2.getTime() - date1.getTime()) / (24 * 3600 * 1000);

		} catch (ParseException e) {
			logger.error("获取两个日期之间的天数出现异常", e);
		}

		return (int) days + 1;
	}

	/**
	 * Method name: toLowCase <BR>
	 * Description: 第一个字母小写 <BR>
	 * Remark: <BR>
	 * 
	 * @param s
	 * @return String<BR>
	 */
	public static String toLowCase(String s) {
		return s.substring(0, 1).toLowerCase() + s.substring(1, s.length());
	}

	/**
	 * Method name: setStartUP <BR>
	 * Description: 第一个字母大写 <BR>
	 * Remark: <BR>
	 * 
	 * @param s
	 * @return String<BR>
	 */
	public static String setStartUP(String s) {
		return s.substring(0, 1).toUpperCase() + s.substring(1, s.length());
	}

	/**
	 * Method name: getUp_ClassName <BR>
	 * Description: 根据表名获取类名不带后缀Bean <BR>
	 * Remark: <BR>
	 * 
	 * @param s
	 * @return String<BR>
	 */
	public static String getUp_ClassName(String s) {
		String cName = "";
		// 首字母大写
		cName = s.substring(1, 2).toUpperCase() + s.substring(2, s.length());

		String[] tem = cName.split("_");
		int len = tem.length;
		cName = tem[0];
		for (int i = 1; i < len; i++) {
			cName += setStartUP(tem[i]);
		}
		// tables.add(cName);//把所有的表添加到这里
		return cName;
	}

	/**
	 * Method name: getFiled2Pro <BR>
	 * Description: 根据字段名获取属性 <BR>
	 * Remark: <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getFiled2Pro(String s) {
		String pName = "";
		String[] tem = s.split("_");

		int len = tem.length;
		pName = tem[0];
		for (int i = 1; i < len; i++) {
			pName += setStartUP(tem[i]);
		}
		return pName;
	}


	/**
	 * Method name: getStringDate <BR>
	 * Description: 根据字符串转成日期类型yyyt-MM-dd <BR>
	 * 
	 * @param time
	 * @return Date<BR>
	 */
	public static Date getStringDate(String time) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date date = null;
		try {
			date = sdf.parse(time);
		} catch (ParseException e) {
			logger.error("日期转换出错:", e);
		}
		return date;
	}

	/**
	 * Method name: getStringDate <BR>
	 * Description: 根据字符串转成日期类型yyyt-MM-dd HH:mm:ss<BR>
	 * 
	 * @param time
	 * @return Date<BR>
	 */
	public static Date getStringDateTime(String time) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		Date date = null;
		try {
			date = sdf.parse(time);
		} catch (ParseException e) {
			logger.error("日期转换出错:", e);
		}
		return date;
	}

	/**
	 * Method name: getNowDateFirstDay <BR>
	 * Description: 根据系统时间获取当月第一天 <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getNowDateFirstDay() {
		Format format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取当前月第一天:
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MONTH, 0);
		c.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
		return format.format(c.getTime());
	}

	/**
	 * Method name: getNowDateLastDay <BR>
	 * Description: 根据系统时间获取当月最后一天 <BR>
	 * 
	 * @return String<BR>
	 */
	public static String getNowDateLastDay() {
		Format format = new SimpleDateFormat("yyyy-MM-dd");
		// 获取当前月最后一天
		Calendar ca = Calendar.getInstance();
		ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
		return format.format(ca.getTime());
	}
	
	/**
	 * 根据日期对象获取yyyy年MM月dd字符串
	 * @param date
	 * @return
	 */
	public static String getDate2String(Date date) {
		Format format = new SimpleDateFormat("yyyy年MM月dd日  HH时mm分ss秒");
		return format.format(date);
	}

}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW高级CAN通信系统

LabVIEW高级CAN通信系统 在现代卫星通信和数据处理领域&#xff0c;精确的数据管理和控制系统是至关重要的。设计了一个基于LabVIEW的CAN通信系统&#xff0c;它结合了FPGA技术和LabVIEW软件&#xff0c;主要应用于模拟卫星平台的数据交换。这个系统的设计不仅充分体现了FPGA在…

CSS实现文本和图片无限滚动动画

Demo图如下&#xff1a; <style>* {margin: 0;padding: 0;box-sizing: border-box;font-family: Poppins, sans-serif;}body {min-height: 100vh;background-color: rgb(11, 11, 11);color: #fff;display: flex;flex-direction: column;justify-content: center;align-i…

2024 年值得收藏的 6 大 iPad 恢复软件

众所周知&#xff0c;数据丢失是 iOS 用户的普遍问题。由于意外删除、软件更新、被盗等多种原因&#xff0c;您可能会丢失重要文件。通过备份&#xff0c;您可以轻松找回 iPad上丢失的文件。但是&#xff0c;当您没有可用的备份时&#xff0c;麻烦就开始了。那么&#xff0c;如…

如何高效挖掘Web漏洞?

简介 SRC漏洞平台&#xff1a;安全应急响应中心&#xff08;SRC, Security Response Center&#xff09;&#xff0c;是企业用于对外接收来自用户发现并报告的产品安全漏洞的站点。说白了&#xff0c;就是连接白帽子和企业的平台&#xff0c;你去合法提交漏洞给他们&#xff0…

数据结构之树和森林

数据结构之树和森林 1、树的存储结构2、树和森林的遍历2.1、树的遍历2.2、森林的遍历 3、树、森林和二叉树之间的相互转换 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0…

一键拥有你的GPT4

这几天我一直在帮朋友升级ChatGPT&#xff0c;现在已经可以闭眼操作了哈哈&#x1f61d;。我原本以为大家都已经用上GPT4&#xff0c;享受着它带来的巨大帮助时&#xff0c;但结果还挺让我吃惊的&#xff0c;还是有很多人仍苦于如何进行升级。所以就想着写篇教程来教会大家如何…

记录xxl-job重复执行引发业务问题

业务问题描述 1.创建运单&#xff0c;发现重复&#xff08;同一个车架号两条记录&#xff09; 2.通知重复反馈&#xff0c;A系统读取中间表状态为未处理数据&#xff0c;推送到B系统 原因分析 1.以上两个问题都是xxljob定时执行的 2.通过日志分析&#xff0c;读取中间表数…

pcl之滤波器(一)

pcl滤波器 pcl一共是有十二个主要模块&#xff0c;详细了解可以查看官网。https://pcl.readthedocs.io/projects/tutorials/en/latest/#basic-usage 今天学习一下pcl的滤波器模块。 滤波器模块&#xff0c;官网一共是提供了6个例程&#xff0c;今天先来看第一第二个。 直通…

01 Aras Innovator二次开发说明

在进行Aras Innovator二次开发之前&#xff0c;需要先了解Aras的服务器架构以及相关的方法论。 了解这部分内容后&#xff0c;有助于我们进行二次开发。 一. 服务器架构 参考下表&#xff1a; Aras Innovator为B/S架构&#xff0c;支持主流的浏览器(IE Edge,Firefox,Google)…

Labview for循环精讲

本文详细介绍Labview中For循环的使用方法&#xff0c;从所有细节让你透彻的看明白For循环是如何使用的&#xff0c;如果有帮助的话记得点赞加关注~ 1. For循环结构 从最简单的地方讲起&#xff0c;一个常用的for循环结构是由for循环结构框图、循环次数、循环计数(i)三部分组成…

Linux版本下载Centos操作

目录 一、Centos7 二、下载Centos7镜像 三、下载Centos7 买了个硬件安装裸机&#xff08;一堆硬件&#xff09; 把安装盘放到虚拟机里面&#xff0c;给机器加电 配置设置 ​编辑 网络配置 开启网络功能 四、安装linux客户端 Xshell是什么 Xshell使用&#xff08;连接…

构建一个安全可靠的身份认证中心和资源服务中心:SpringSecurity+OAuth2.0的完美结合

目录 1、引言 1.1 身份认证和授权的重要性 1.2 SpringSecurity和OAuth2.0的概述 2、架构设计 2.1 组件概述 2.2 身份认证中心的设计 2.3 资源服务中心的设计 3、身份认证中心的实现 3.1 用户管理 3.2 登录认证流程 3.3 令牌生成和管理 4、资源服务中心的实现 4.1 …

新版idea创建spring boot项目

目录 前言 汉化教程 项目模板初始化 1.点击新建项目 2.配置初始化信息 3.初始依赖选择 配置Maven 1.打开maven设置 2.重写maven配置文件 3.选择你创建的配置文件 4.重启项目 spring boot配置并测试 1.修改配置文件后缀 2.启动项目 3.编写测试控制类 4.重启项目…

idea引入jar包作为maven

1.引入jar包至项目中 2.配置当前项目的maven&#xff08;如果只想在本机能运行的话&#xff0c;到这一步就够了&#xff0c;后面pom配置也不需要这一步&#xff09; 3.配置文件的maven依赖路径 这里的 groupId 就是你引入原包的包路径&#xff0c;artifactId、version都是随…

【动态规划】【字符串】【C++算法】940. 不同的子序列 II

作者推荐 【动态规划】【广度优先搜索】【状态压缩】847 访问所有节点的最短路径 本文涉及知识点 动态规划汇总 LeetCode940. 不同的子序列 II 给定一个字符串 s&#xff0c;计算 s 的 不同非空子序列 的个数。因为结果可能很大&#xff0c;所以返回答案需要对 10^9 7 取…

企业如何用copilot?电通×Copilot:打破创意工作效率“天花板”

企业申请Azure OpenAI绿色通道 →记得评论私信~还可加入试用交流群~ 电通集团拥有着120年的历史、汇聚了七万多名精英&#xff0c;是全球顶级的创意公司之一。随着新兴传播渠道的不断涌现&#xff0c;电通的客户们面临着内容需求的挑战。好消息是&#xff0c;微软Copilot为电通…

21.云原生之GitLab pipline语法(CI基础)

云原生专栏大纲 文章目录 gitlab-ci.yml 介绍GitLab中语法检测gitlab-ci.yml 语法job定义作业before_script和after_scriptstages定义阶段tages指定runnerallow_failure运行失败when控制作业运行retry重试timeout超时parallel并行作业only & exceptrulescache 缓存cache:p…

路灯哪个牌子质量好?适合学生备考使用的台灯分享

落地台灯是一种常见的家居照明设备&#xff0c;通常由支架、灯头和灯罩组成。其特点是可以放置在地面上&#xff0c;提供直接的照明效果&#xff0c;适用于客厅、卧室、书房等各种生活空间。落地台灯的设计风格多样&#xff0c;可以选择简约现代、北欧风格、复古风格等等&#…

在PyCharm中安装GitHub Copilot插件,login之后报出如下错误:

Sign in failed. Reason: Request signInInitiate failed with message: connect ECONNABORTED 20.205.243.166:443, request id: 7, error code: -32603 前提&#xff1a; 设置网址&#xff1a;https://github.com/settings/copilot&#xff0c;已设置为允许 或者&#xff1…

每日一题——LeetCode1313.解压缩编码列表

这么简单的题目要说的这么复杂 nums里每相邻的两个元素nums[i]、nums[j]为一对&#xff0c;nums[i]表示nums[j]的次数 var decompressRLElist function(nums) {let res[]for(let i0,j1;j<nums.length-1;i2,j2){while(nums[i]--){res.push(nums[j])}}return res }; 消耗时…