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数据分类预测/故障识别分类效果基本描述程序设计参考资料 分类…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
