SpringBoot小项目——简单的小区物业后台管理系统 认证鉴权 用户-角色模型 AOP切面日志 全局异常【源码】

在这里插入图片描述

目录

  • 引出
  • 一、应用到的技术栈
    • Spring、Spring MVC、Spring Boot基础
    • SpringBoot进阶、SpringMVC原理、AOP切面
    • MyBatis 数据库相关
    • JavaWeb基础:Session等
    • 前端Vue、JavaScript、Bootstrap
  • 二、后台管理系统的功能
    • 登录功能
      • 1.用户名密码登录
      • 2.验证码的登录
    • 报修业务的处理
    • 楼宇信息管理
    • 房屋管理
    • 业主管理【核心功能】
      • 买房的业务
      • 意向用户信息登记
      • 后端相关代码
    • 数据统计分析
  • 三、系统必备的要素
    • 登录认证
    • 权限管理
      • 采用的模型和思路
      • 自定义注解和实现
    • 另一种权限(页面不同)
      • 普通员工--夸夸自己
      • 我是boss--隐藏地图
    • 日志管理
    • 全局异常
  • 总结

引出

基于SpringBoot的简单的小区物业后台管理系统,主要功能有报修的处理,楼宇信息和房屋信息的管理,业主信息的管理【核心】,以及数据统计分析模块Echarts绘图;此外采用用户-角色权限模型,结合自定义注解实现简单的权限管理功能,采用aop切面实现日志的存储,全局异常的使用。

技术栈:Spring、Spring MVC、Spring Boot、MyBatis、Echarts、Session、Vue、JavaScript、Bootstrap

本项目后端代码git仓库为:
https://gitee.com/pet365/spring-community-manager

在这里插入图片描述

一、应用到的技术栈

Spring、Spring MVC、Spring Boot基础

  • Spring基础(核心容器)——从配置文件到注解开发 & 创建对象+成员变量赋值IOC & 增强方法AOP

  • Spring基础(Web-MVC)——在idea中新建springWeb项目 & 浏览器请求 和 服务器响应 & SpringMvc文件相关

  • Spring基础(Data Access数据库)——Spring+SpringMVC & 集成mybatis & 拦截器

在这里插入图片描述

SpringBoot进阶、SpringMVC原理、AOP切面

在这里插入图片描述

  • SpringBoot基础——追根溯源servlet是啥,tomcat是啥,maven是啥 & springBoot项目初步,maven构建,打包 & 测试

  • SpringMvc框架——【深入】SpringMVC 的运行流程:从客户端发送请求request到springMvc框架返回响应response的全流程分析 & DispatcherServlet

在这里插入图片描述

SpringAOP,切面

  • Spring进阶(AOP的理解)——静态/动态代理 & 面向切面编程AOP(Aspect Oriented Programming) & 日志记录 & 增强方法

  • Spring进阶(AOP的应用)—— 动态代理AOP后controller层的private方法访问失效的问题

在这里插入图片描述

MyBatis 数据库相关

【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身

在这里插入图片描述

  • mybatis 是一个优秀的基于 java 的持久层框架,主要应用于关系型数据库(sql),它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement ,封装数据等繁杂的过程。

  • mybatis 通过 xml 或注解的方式将要执行的各种 statement 配置起来,并通过 java 对象和 statement 中sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

  • 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc 进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。

JavaWeb基础:Session等

Java网络开发(Tomcat)—— Servlet学习 & Web相关背景知识 + 网页状态码(304) & JavaWeb项目初步

在这里插入图片描述

Java网络开发(Session)—— 从http请求 到 cookie 到 session & 用 session控制 删改数据的权限

在这里插入图片描述

网页状态码——200正常、302重定向、304客户端有缓存、400浏览器请求传参异常、404未找到、405方法不允许、415不支持的媒体?、500服务器异常 & 跨域

在这里插入图片描述

前端Vue、JavaScript、Bootstrap

  • Java网络开发(Asynchronous异步)—— 从 Jsp 到 Ajax 的 axios 到 vue & 同步请求 到 异步请求

  • 前端基础(JavaScript)——基础语法(变量,分支…)& Json对象【重要】& 函数定义 & 事件

  • 前端基础(CSS)——css介绍 & 常用样式 & 案例—进化到Bootstrap——进化到Element-UI

二、后台管理系统的功能

登录功能

1.用户名密码登录

能够实现用户名和密码登录以及手机验证码登录,其中手机验证码存储到session中,键为登录的用户的手机号。

在这里插入图片描述

当时对于各种情况的用户进行了处理

在这里插入图片描述

离职员工

在这里插入图片描述

账号锁定

在这里插入图片描述

首次登录改密码

在这里插入图片描述

密码修改

在这里插入图片描述

在这里插入图片描述

2.验证码的登录

在这里插入图片描述

后台逻辑,手机号校验,多线程使用

在这里插入图片描述

报修业务的处理

前端页面

在这里插入图片描述

图片用的本地文件资源映射

在这里插入图片描述

批量删除当时的操作:

1.真的delete删除了,其实应该是逻辑删除,把状态修改一下,比如未处理0,已处理1,已删除2,就暂时不显示;

2.在删除之前没有做数据校验,其实按理说删除之前应该检查一下状态,是否还没有维修完成等;

在这里插入图片描述

为了前期便于测试,给了一个默认的登录用户admin,便于前期进行接口测试,不需要每次登录才能测试。

在这里插入图片描述

楼宇信息管理

快排功能

在这里插入图片描述

用动态sql

在这里插入图片描述

房屋管理

多条件查询

在这里插入图片描述

后端代码

在这里插入图片描述

用动态sql,面积后端排序

在这里插入图片描述

入住日期排除,前端实现

在这里插入图片描述

业主管理【核心功能】

业主管理的极简页面

在这里插入图片描述

详情页面

在这里插入图片描述

买房的业务

添加业主页面

在这里插入图片描述

买买买

在这里插入图片描述

买!

在这里插入图片描述

添加新的业主成功

在这里插入图片描述

在这里插入图片描述

有几个小瑕疵:

  • 身份证号码没有进行校验;
  • 记录人没有和登录的管理员绑定;

实现可买的房子到买了的房子框框中的逻辑

在这里插入图片描述

意向用户信息登记

在这里插入图片描述

在这里插入图片描述

意向用户详情页面

在这里插入图片描述

后端相关代码

开始想用这种一个参数一个参数接收的方式,但是有一个参数是ist,一直报错,后面用对象接收

在这里插入图片描述

尝试用了可变长度参数传参

在这里插入图片描述

从service到mapper

在这里插入图片描述

动态SQL的处理,可变长度参数处理
楼栋 List 是否传入执行不同的sql语句查询

在这里插入图片描述

数据统计分析

采用Echarts进行数据统计分析图表绘制

在这里插入图片描述

进行了数据校验

在这里插入图片描述

后端数据校验

在这里插入图片描述

三、系统必备的要素

登录认证

采用拦截器,如果没有登录就去登录页面

在这里插入图片描述

权限管理

采用的模型和思路

用3张表实现简单权限管理,用户对应角色
在这里插入图片描述

自定义注解和实现

处理角色权限的注解

在这里插入图片描述

拦截器,获得controller层上的注解

在这里插入图片描述

package com.tianju.interceptor;import com.alibaba.fastjson.JSON;
import com.tianju.anno.PreAuthorize;
import com.tianju.entity.ResData;
import com.tianju.entity.User;
import com.tianju.entity.UserAuth;
import com.tianju.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;@Component
public class AuthorizeInterceptor implements HandlerInterceptor {@Autowiredprivate IUserService userService;@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {User user = (User) request.getSession().getAttribute("user");UserAuth userAuth = userService.queryUserAuthByUsername(user.getUsername());// 如果请求的资源是经过controllerif (handler instanceof HandlerMethod){// 获取controller中方法上的注解HandlerMethod handlerMethod = (HandlerMethod) handler;PreAuthorize preAuthorize = handlerMethod.getMethod().getAnnotation(PreAuthorize.class);// 方法上有这个注解if (preAuthorize!=null){String[] value = preAuthorize.value();int index = Arrays.binarySearch(value, userAuth.getRoleName());if (index >=0){return true;}else {response.setContentType("application/json;charset=utf-8");response.setCharacterEncoding("UTF-8");response.getWriter().write(JSON.toJSONString(new ResData(300001, "没有权限访问该方法", null)));return false;}}}return true;}
}

配置拦截器

在这里插入图片描述

package com.tianju.config;import com.tianju.interceptor.AuthorizeInterceptor;
import com.tianju.interceptor.LoginAuthorInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** springmvc的配置类* 1.是配置类;@Configuration* 2.是springmvc的配置类;implements WebMvcConfigurer*/
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {@Value("${repairImg}")String repairImgLocation;// 静态资源映射;// 要点:1.浏览器访问的连接 /repair/**;2.映射的位置,file:D:/620/repair/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/repair/**").addResourceLocations("file:"+repairImgLocation); // 映射的位置}// 拦截器,拦截谁,放行谁@AutowiredLoginAuthorInterceptor loginAuthorInterceptor;@AutowiredAuthorizeInterceptor authorizeInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginAuthorInterceptor).addPathPatterns("/**") //拦截谁,表示都拦截.excludePathPatterns("/user/loginPage","/user/login","/js/**","/css/**","/bootstrap/**","/img/**","/user/loginSms","/getSmsYzm");registry.addInterceptor(authorizeInterceptor).addPathPatterns("/**") //拦截谁,表示都拦截.excludePathPatterns("/user/loginPage","/user/login","/js/**","/css/**","/bootstrap/**","/img/**","/user/loginSms","/getSmsYzm");}
}

另一种权限(页面不同)

普通员工–夸夸自己

在这里插入图片描述

我是boss–隐藏地图

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

日志管理

AOP切面,用来记录日志,什么时候,谁,访问了啥,干了啥

在这里插入图片描述

package com.tianju.aop;import com.tianju.entity.User;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.aspectj.lang.annotation.Aspect;import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Date;
/*** 记录日志,用增强方法,* 要点:* 0.是增强类 @Aspect,在容器中 @Component* 1.给谁做增强,* 2.怎么增强,@before @after @afterReturning @afterThrowing*//*** @Component 在容器中* @Aspect 是增强方法* @Before("@within(org.springframework.stereotype.Controller)") 给controller层增强*/
@Component
@Aspect
@Slf4j // 用lombok.extern.slf4j.Slf4j;
public class LoggingAsp {@Autowired // session也在容器里,所以直接可以注入private HttpSession session;// 给所有标注了@Controller注解的方法做增强@Before("@within(org.springframework.stereotype.Controller)")public void log(JoinPoint joinPoint){String className = joinPoint.getTarget().getClass().getSimpleName(); // 获取类名String methodName = joinPoint.getSignature().getName(); // 获取方法名Object[] args = joinPoint.getArgs(); // 获取传的参数// 获取当前登陆的人,从session中获取User user = (User) session.getAttribute("user");String username = (user==null)?"未登录人员":user.getUsername();log.info("{}访问了{}类的{}方法,传的参数为{}",new Date() + username,className,methodName, Arrays.toString(args));}
}

持久化日志到本地

在这里插入图片描述

# 日志的相关配置
logging:file:name: D:\\620\\log\\community.loglevel:org.springframework.web: debugcom.tianju: debugorg.springframework.jdbc.support.JdbcTransactionManager: debug

全局异常

如果没有全局异常处理,则异常会一层一层,从dao到service到controller,最后抛给前端,然后用户看到一堆看不懂的东西

在这里插入图片描述

兜底异常,返回统一异常信息,更进一步的返回一个页面

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


总结

1.简单的小区物业后台管理系统,主要功能有报修的处理,楼宇信息和房屋信息的管理,业主信息的管理【核心】,以及数据统计分析模块Echarts绘图;
2.此外采用用户-角色权限模型,结合自定义注解实现简单的权限管理功能;
3.采用aop切面实现日志的存储;
4.全局异常的使用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贝叶斯变分方法:初学者指南--平均场近似

Eric Jang: A Beginners Guide to Variational Methods: Mean-Field Approximation (evjang.com) 一、说明 变分贝叶斯 (VB) 方法是统计机器学习中非常流行的一系列技术。VB 方法允许我们将 统计推断 问题(即,给定另一个随机变量的值来推断随机变量的值&…

服务熔断保护实践--Hystrix

概述 微服务有很多互相调用的服务,构成一系列的调用链路,如果调用链路中某个服务失效或者网络堵塞等问题,而有较多请求都需要调用有问题的服务时,这是就会造成多个服务的大面积失效,造成服务“雪崩”效应。 服务“雪…

【C语言】优化通讯录管理系统

大家好,我是苏貝,本篇博客带大家优化上一篇的通讯录,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 前言二. 动态通讯录2.1 通讯录结构体2.2 初始化通讯录2.3 增加联系人2.4 销毁通讯…

Redis原理-IO模型和持久化

高性能IO模型 为什么单线程Redis能那么快 一方面,Redis 的大部分操作在内存上完成,再加上它采用了高效的数据结构,例如哈希表和跳表,这是它实现高性能的一个重要原因。另一方面,就是 Redis 采用了多路复用机制&#…

HTML简单实现v-if与v-for与v-model

Vue启动!! 首先VIewModel将View和Model连接一起,Model的数据改变View的数据也变 使用Visual Studio Code 启动Vue需要vue.js插件和导入CDN(包) vue.js插件:CTRL shift x 在搜索栏搜 索vue.js安装即可 CDN: http…

orb-slam3编译手册(Ubuntu20.04)

orb-slam3编译手册(Ubuntu20.04) 一、环境要求1.安装git2.安装g3.安装CMake4.安装vi编辑器 二、源代码下载三、依赖库下载1.Eigen安装2.Pangolin安装3.opencv安装4.安装Python & libssl-dev5.安装boost库 三、安装orb-slam3四、数据集下载及测试 写在…

k8s集群升级

目录 1. 部署cri-docker (所有集群节点) 2. 升级master节点 3. 升级worker节点 4. 部署containerd 1. 部署cri-docker (所有集群节点) k8s从1.24版本开始移除了dockershim,所以需要安装cri-docker插件才能使用docker …

MySQL6:索引使用原则,联合索引,联合主键/复合主键,覆盖索引、什么是回表?索引条件下推,索引的创建与使用,索引的创建与使用,索引失效

MySQL6:索引使用原则,联合索引,联合主键/复合主键,覆盖索引、什么是回表?索引条件下推,索引的创建与使用,索引的创建与使用,索引失效 索引使用原则列的离散(sdn)度 联合索引创建联合…

Harbor私有镜像仓库搭建

本文基于:https://zhuanlan.zhihu.com/p/143779176 1.环境准备 IP:192.168.10.136/24 操作系统:centos7 2.安装Docker、Docker-compose 2.1安装Docker-CE $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.re…

数据库简史:多主数据库架构的由来和华为参天引擎的机遇

注:本文发表后,收到了很多后台反馈,其中关于大型机的早期成就不容省略。微调重发本文,纯属个人观点,错谬之处,仍然期待指正。 2023年10月13日,在北京举办的“2023金融业数据库技术大会"上&…

redis6.0源码分析:跳表skiplist

文章目录 前言什么是跳表跳表(redis实现)的空间复杂度相关定义 跳表(redis实现)相关操作创建跳表插入节点查找节点删除节点 前言 太长不看版 跳跃表是有序集合zset的底层实现之一, 除此之外它在 Redis 中没有其他应用。…

电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题

一、行业背景 随着国民经济的蓬勃发展,工业用电和居民用电需求迅速增加,电厂、变电站、输电线路高负荷运转,一旦某个节点发生故障,对生产、生活造成巨大的影响。目前电力行业生产现场人员、设备较多,而生产监督员有限…

基于vue小红书平台用户数据分析与可视化

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…

【马蹄集】—— 搜索专题

搜索专题 目录 MT2238 数的增殖MT2239 二维矩阵中的最长下降序列MT2240 传染病MT2241 循环空间BD202303 第五维度 MT2238 数的增殖 难度&#xff1a;黄金    时间限制&#xff1a;1秒    占用内存&#xff1a;128M 题目描述 给定一个数 n ( n < 1000 ) n (n<1000) n…

Java I/O (输入/输出)

1.流的概念 流是一种有序的数据序列&#xff0c;根据操作类型&#xff0c;可以分为输入流和输出流两种。I/O流&#xff08;输入输出&#xff09;提供了一条通道程序&#xff0c;可以使用这条通道把源中的字节序列送到目的地。 1.1 输入流&#xff1a; 程序从指向源的输入流中读…

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示(代码+仿真+设计报告+讲解)

51单片机汽车胎压大气气压测量仪仿真设计_数码管显示 (代码仿真设计报告讲解) 仿真原版本&#xff1a;proteus 7.8 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0018 目录 51单片机汽车胎压大气气压测量仪仿真设计_数码管显示功…

技术分享| anyRTC低延时直播优化

直播系统就是把活动现场的音频或视频信号经数字压缩后&#xff0c;传送到直播多媒体服务器(CDN)上&#xff0c;在互联网上供广大网友或授权特定人群收听或收看。而随着技术的日益更新&#xff0c;人民对于直播的互动性&#xff0c;实时性要求更高了&#xff0c;传统的直播少则几…

React-表单受控绑定和获取Dom元素

一、表单受控组件 1.声明一个react状态 说明&#xff1a;useState const [value,setValue]useState("") 2.核心绑定流程 2.1绑定react状态 <div><input value{value}type"text"></input> 2.2绑定onChange事件 说明&#xff1a;e.…

队列(Queue)概念+通过单、双链表来模拟队列+环形队列+OJ面试题(用队列实现栈、用栈实现队列、设计环形队列)

文章目录 队列(Queue)一、 概念1.尾进头出 二、模拟队列1.单链表实现队列1.1 设置结点1.2 入队offer1.3出队 poll1.4 empty方法&#xff0c;peek方法&#xff0c;getUsedSize方法 2.双链表实现队列2.1 创建结点2.2 入队列2.3 出队列2.4 peek、size、isEmpty方法 三、环形队列1.…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…