作者主页:舒克日记
简介: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);
}
}