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数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...