用Springboot做一个项目的url管理器

前言

不积跬步无以至千里,不积小流无以成江河

最近参考了各大型权限系统。本着学习与仰慕的心态,决定自己写一个小小的demo来交一交自己的作业。
我们知道,常规的Shiro和Security这类型的框架,都是充满了各种各样的调用链,读起来是非常的蓝瘦。但是…奈何人家技术够牛批,功能够实用,所以还是有很多的企业以及个人项目中大量的使用了这些框架。


不多bb,这篇文章我们最主要的目的还是,通过前端的可视化界面来实现我们后端所有的url是否可以访问。这是一个很小的功能,但是,实用性还是很不错滴。具体效果看看图:
ps:录屏工具我没找到,所以先欠着,我们在最后放实际图。


这个小demo,我大致的分为了两个功能,

  • 自定义注解+权限字段来实现接口的访问。
  • 在管理页面对所有的url进行开启和关闭。

技术栈:

  • springboot2.2.5以上
  • vue2
  • elementUI
  • 以及部分的前端知识。这个demo并没有使用vue-cli来构建,因为实在是太简单了。

设计思路

1、首先,所有的url请求都会经过我们的拦截器,所以我们只需要在拦截器里面去拿到当前请求的url,做一次判断就可以。
2、这个判断什么呢?所以,我们首先得在项目启动时,获取到我们当前项目下的所有url对吧。
3、拿到所有的url之后,是不是就可以存数据库了
4、最后,我们只需要在拦截器注入我们的mapper,再根据接收到的url做一次查询,我们的数据库表字段写一个enable代表是否启用,如果这个url的enable属性是true,则可以通过这个拦截器。否则就不能通过,是不是这个道理。
5、所以,我们来看看拦截器怎么写的。
在这里插入图片描述
是不是很简单
那我再贴一张我的数据库设计,也是很简单。
在这里插入图片描述
tips:大家可能看到了我这儿写的doc,很好奇是怎么来的吗?
大家都用过swagger吧,swagger里面的Api注解里面的属性都熟悉吧。所以我这儿就自定义了一个注解,名为Doc,只需要写上这个注解,在这个注解上面写上我们的接口作用,然后通过动态代理的方法获取到方法上标注的注解,拿到里面的内容,不就可以了?


还有一个问题:我们怎么去获取到当前项目下的所有接口呢?换言之:我们怎么获取到当前项目下所有标了@Requestmapping注解的值呢?
Springboot整合mvc的时候给我们提供了一个接口,叫做WebApplicationContext。这个接口可以获取到我们当前所有的web上下文。换个说法:这个接口的方法可以获取到所有的web请求的类以及方法以及注解。是不是很强大?
可能你们又有疑问,我们有些地方标的@GetMapping或者@PostMapping对吧,那怎么获取呢?
不用担心,我们所有的Mapping都是依赖了@RequestMapping,虽然我也不知道怎么做到的,但是事实上,我们获取了@RequestMapping注解的时候,其他的Mapping也都能拿到。有空了再去研究研究这个事情。

做完上面这些,那问题又来了。在什么时候去让这些接口保存在数据库呢?
答案是,项目启动的时候,也就是我们项目的main方法。我这儿采用的是@PostConstruct注解+方法来实现的,这儿也可以贴出我的代码。
在这里插入图片描述
常规的这种方法,他是同步的,如果我们的接口过多,必然会造成这儿的阻塞。所以,我又做了一个自定义线程池,将这一块交给异步去处理。所以你自然能看到我上面标注的@Async注解。


好了,思路说的差不多了,接下来就是我们的正式编码环节。

权限控制

设计思路:我这儿采用了自定义注解来具体实现;
当用户访问某个url时,会先经过拦截器来判断这个接口上的注解是需要token还是不需要token再来做具体的判断。比如:在这里插入图片描述
当然,我这儿是把weburl的拦截器和权限拦截器分开,那可能就有人有疑问了,多个拦截器,那怎么去判断执行顺序呢?springboot给我们提供了两种方案:

  • 使用@Order注解,这个注解中的属性是一个int值,值越大,代表这个bean执行越后。默认为0
    在这里插入图片描述
  • 第二种:那就是在我们的config中去从上往下写执行顺序就行
    我这儿采用的就是第二种。
    在这里插入图片描述
    实际效果图我这儿就不贴了。有点乱码不太好看;

结尾

很久没写文章了,所以不知道该怎么表达自己的想法。我将这个小demo放在了gitee仓库中,如果有需要参考的朋友可以自行去下载,里面包含了SQL文件。代码很简单,注释也都有。
demo地址,如果对你有帮助,不妨给个三连

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的学生信息管理系统的示例,使用Spring Boot框架实现: 1. 创建Spring Boot项目 首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializr或者在IDEA中创建一个新的Spring Boot项目。 2. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 添加MySQL驱动依赖 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 添加MyBatis依赖 --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> ``` 3. 创建数据库和表 使用MySQL或其他数据库软件创建一个名为"student_db"的数据库,再创建一个名为"student"的表,该表包含以下字段: ```sql CREATE TABLE `student` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, `gender` varchar(10) DEFAULT NULL, `age` int(11) DEFAULT NULL, `address` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` 4. 创建实体类和Mapper 创建一个名为"Student"的实体类,包含id、name、gender、age、address等属性,并为该实体类创建一个对应的Mapper接口。 ```java public class Student { private int id; private String name; private String gender; private int age; private String address; // 省略getter和setter方法 } @Mapper public interface StudentMapper { List<Student> getAllStudents(); Student getStudentById(int id); void addStudent(Student student); void updateStudent(Student student); void deleteStudent(int id); } ``` 5. 创建Service和Controller 创建一个名为"StudentService"的服务类,实现对学生信息的增删改查操作,并在"StudentController"中使用该服务类进行请求的响应。 ```java @Service public class StudentService { @Autowired private StudentMapper studentMapper; public List<Student> getAllStudents() { return studentMapper.getAllStudents(); } public Student getStudentById(int id) { return studentMapper.getStudentById(id); } public void addStudent(Student student) { studentMapper.addStudent(student); } public void updateStudent(Student student) { studentMapper.updateStudent(student); } public void deleteStudent(int id) { studentMapper.deleteStudent(id); } } @RestController @RequestMapping("/students") public class StudentController { @Autowired private StudentService studentService; @GetMapping("/") public List<Student> getAllStudents() { return studentService.getAllStudents(); } @GetMapping("/{id}") public Student getStudentById(@PathVariable("id") int id) { return studentService.getStudentById(id); } @PostMapping("/") public void addStudent(@RequestBody Student student) { studentService.addStudent(student); } @PutMapping("/") public void updateStudent(@RequestBody Student student) { studentService.updateStudent(student); } @DeleteMapping("/{id}") public void deleteStudent(@PathVariable("id") int id) { studentService.deleteStudent(id); } } ``` 6. 修改配置文件 在application.properties或application.yml中,添加以下配置: ```properties # 数据库配置 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/student_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai spring.datasource.username=root spring.datasource.password=123456 # MyBatis配置 mybatis.mapper-locations=classpath:mapper/*.xml ``` 7. 测试 启动项目,访问"http://localhost:8080/students/"即可获取所有学生信息;访问"http://localhost:8080/students/{id}"即可获取指定id的学生信息;通过POST请求"http://localhost:8080/students/",可以添加一个新的学生信息;通过PUT请求"http://localhost:8080/students/",可以修改一个学生信息;通过DELETE请求"http://localhost:8080/students/{id}",可以删除一个学生信息。 以上就是一个简单的学生信息管理系统的示例,希望可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼小洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值