Java项目:12 Springboot的垃圾回收管理系统
作者主页:源码空间codegym
简介: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<>();@Autowiredpublic 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>*/@Overrideprotected 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>*/@Overrideprotected 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);}}相关文章:
Java项目:12 Springboot的垃圾回收管理系统
作者主页:源码空间codegym 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 1.介绍 垃圾分类查询管理系统,对不懂的垃圾进行查询进行分类并可以预约上门回收垃圾。 让用户自己分类垃圾, 按国家标准自己分类…...
HarmonyOS自定义弹出对话框CustomDialog并传递变量
HarmonyOS定义了一系列弹窗反馈类的组件 和前端开发框架VUE3配套生态库element plus中的提供各种组件相比,还是要少一些。可能是手机端操作和PC端操作的差异导致的 如果内置的弹窗不满足要求,可以基于CustomDialog自定义出各种个性化的反馈组件。 首先新建一个ets文件,…...
React16源码: React中的renderRoot的错误处理的源码实现
renderRoot的错误处理 1 )概述 在 completeWork这个方法之后, 再次回到 renderRoot 里面在 renderRoot 里面执行了 workLoop, 之后,对 workLoop 使用了try catch如果在里面有任何一个节点在更新的过程当中 throw Error 都会被catch到catch到之后就是错误…...
强化学习:MuJoCo机器人强化学习仿真入门(1)
声明:我们跳过mujoco环境的搭建,搭建环境不难,可自行百度 下面开始进入正题(需要有一定的python基础与xml基础): 下面进入到建立机器人模型的部分: 需要先介绍URDF模型文件和导出MJCF格式 介绍完…...
8.Gateway服务网关
3.Gateway服务网关 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式…...
JVM篇----第四篇
系列文章目录 文章目录 系列文章目录前言一、虚拟机栈(线程私有)二、本地方法区(线程私有)三、你能保证 GC 执行吗?四、怎么获取 Java 程序使用的内存?堆使用的百分比?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…...
WPF引用halcon的HSmartWindowControlWPF控件一加上Name属性就,无缘无故运行后报错
报错内容: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MC1000 未知的生成错误“Could not find assembly System.Drawing.Common, Version0.0.0.0, Cultureneutral, PublicKeyTokencc7b13ffcd2ddd51. Either explicitly load this assembly using a method …...
Vue3组件库开发 之Button(2) 未完待续
Vue3组件库开发 之Button(1) 中新建项目,但未安装成功ESLINT 安装ESLINT npm install eslint vite-plugin-eslint --save-dev 安装eslint后,组件文件出现错误提示 添加第三方macros ,虽然不是官网但很多开发者都是vue3开发人员 安装macros…...
k8s节点RouteCreated为false
出现该情况后,一般是初始化节点失败。因此,需要把节点从集群中移除,再加入到集群中,即可解决。 通常出现这个状况后,该节点上是没有被分配pod ip的,可以通过命令查看: # 发现没有PodCIDR、PodC…...
Kafka(二)原理详解
一 、kafka核心总控制器(Controller) 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 作用:leader副…...
Flutter 屏幕适配之相对尺寸适配
在Android中我们可以通过脚本来动态生成适配于各个厂商的屏幕的相对尺寸。 那么在Flutter中我们如何通过相同的思路来实现同样的效果呢?我们知道,Android的每个厂商的屏幕大小存在非常大区别。有些长,有的短,有的粗,有…...
在线预约小程序源码系统:适合任何行业的在线预约,快捷方便,省时省心 带完整的搭建教程
互联网技术的发展,人们对便捷服务的需求越来越高。特别是在线预约服务,无论是在医疗、美容、餐饮还是其他行业中,用户都希望能够通过简单的方式预约到所需的服务。然而,传统的预约方式往往效率低下,不能满足用户的快速…...
AI部署开发指南:用vs2019编译OnnxRuntime-v1.16.2
前言 要详细了解一个系统的部署,对其源码进行调试可能是最好的办法。 Pytorch的部署几经改版,最大的特点依然是不稳定,或者使用libtorch这种稳定但优化力度不够的部署方案。 而稳定且通用的方案,目前仍然是export to onnx的办法…...
【强化学习】QAC、A2C、A3C学习笔记
强化学习算法:QAC vs A2C vs A3C 引言 经典的REINFORCE算法为我们提供了一种直接优化策略的方式,它通过梯度上升方法来寻找最优策略。然而,REINFORCE算法也有其局限性,采样效率低、高方差、收敛性差、难以处理高维离散空间。 为…...
android usb2.0 协议基础(2)
2.4 USB逻辑部件 USB 逻辑部件 设备---》 接口 (一个或多个):用于描述特定功能,包含多个端点----》端点(一个或多个): 传输的最终对象端点号,传输类型传输方向,最大的数据…...
C语言快速排序(非递归)图文详解
前言: 上一期分析了快速排序的三种写法,这三种写法有一个相同点,都是采用递归形式来实现的,那么有没有非递归的方法实现呢?答案是当然有,用非递归的方法实现快速排序,其实可以借助数据结构中的栈…...
Java面试题136-150
36、用JDBC如何调用存储过程 代码如下: package com.huawei.interview.lym; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Types; public class JdbcTest…...
使用trace工具分析Mysql如何选择索引
背景说明 工作中,可能会遇到执行一个SQL,明明有索引,但是采用explain分析后发现执行结果并未走索引。甚至还有部分SQL语句相同就只是查询条件不一样也会出现有的走索引,有的不走索引情况。比如: 我的示例环境有个employees表,并有个idx_name_age_position的联合索引…...
微信小程序(十二)在线图标与字体的获取与引入
注释很详细,直接上代码 上一篇 新增内容: 1.从IconFont获取图标与文字的样式链接 2.将在线图标配置进页面中(源码) 3.将字体配置进页面文字中(源码) 4.css样式的多文件导入 获取链接 1.获取图标链接 登入…...
分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别
分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别 目录 分类预测 | Matlab实现LSTM-Attention-Adaboost基于长短期记忆网络融合注意力机制的Adaboost数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…...
eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)
说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果:邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
