• 前后端分离权限系统


    1. 完成登录

    1.1 前端布局

    1. <template>
    2. <div class="box">
    3. <div id="loginBox">
    4. <div class="avatar_box">
    5. <img src="../assets/c.jpg">
    6. div>
    7. <el-form label-width="80px" :model="loginForm" :rules="rules" ref="loginFormRef" class="login_form">
    8. <el-form-item label="账号:" prop="username">
    9. <el-input v-model="loginForm.username">el-input>
    10. el-form-item>
    11. <el-form-item label="密码:" prop="password">
    12. <el-input v-model="loginForm.password" show-password>el-input>
    13. el-form-item>
    14. <el-form-item>
    15. <el-button type="primary" @click="submitForm">登录el-button>
    16. el-form-item>
    17. el-form>
    18. div>
    19. div>
    20. template>
    21. <script>
    22. export default {
    23. name: "Login",
    24. data(){
    25. return{
    26. loginForm:{},
    27. rules:{
    28. username:[
    29. {required:true,message:"请输入账号",trigger:"blur"},
    30. {min:1,max:12,message:"账号的长度必须在[1~12]之间",trigger:"blur"}
    31. ],
    32. password:[
    33. {required:true,message:"请输入密码",trigger:"blur"},
    34. {min:1,max:12,message:"账号的长度必须在[1~12]之间",trigger:"blur"}
    35. ]
    36. }
    37. }
    38. },
    39. }
    40. script>
    41. <style>
    42. body,.box{
    43. overflow: hidden;
    44. height: 100%;
    45. background-size:1920px,945px;
    46. }
    47. .box{
    48. background:url("../assets/a.jpg");
    49. }
    50. #loginBox {
    51. width: 450px;
    52. height: 300px;
    53. background-color:rgba(247,224,175,0.0);
    54. border-radius: 3px;
    55. position: absolute;
    56. left: 45%;
    57. top: 60%;
    58. transform: translate(-50%, -50%);
    59. /*opacity: 0.8;*/
    60. }
    61. #loginBox>.avatar_box{
    62. height: 130px;
    63. width: 130px;
    64. border: 1px solid #eee;
    65. border-radius: 50%;
    66. padding: 10px;
    67. box-shadow: 0 0 10px #ddd;
    68. position: absolute;
    69. left: 50%;
    70. transform: translate(-50%, -50%);
    71. background-color: #fff;
    72. }
    73. #loginBox>.avatar_box>img {
    74. width: 100%;
    75. height: 100%;
    76. border-radius: 50%;
    77. background-color: #eee;
    78. }
    79. .login_form {
    80. position: absolute;
    81. bottom: 0;
    82. width: 100%;
    83. padding: 0 20px;
    84. box-sizing: border-box;
    85. }
    86. style>

    (2)登录按钮事件

    如果想在vue工程中使用axios进行异步请求,则需要在main.js中导入axios
    [1]//导入axios
    import axios from "axios";
    [2]//把axios挂载到vue对象中,以后在vue中如果使用axios直接可以用$http名称
    Vue.prototype.$http=axios

    1. methods:{
    2. login(){
    3. //表单校验
    4. this.$refs['loginFormRef'].validate((valid) => {
    5. if(valid){
    6. //url:后端登录接口的路径
    7. this.$http.post("http://localhost:8809/system/login",this.loginForm).then(result=>{
    8. });
    9. }
    10. })
    11. }
    12. }

    1.2 完成后端登录接口

    (1) 依赖

    1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    2. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    3. <modelVersion>4.0.0modelVersion>
    4. <parent>
    5. <groupId>org.springframework.bootgroupId>
    6. <artifactId>spring-boot-starter-parentartifactId>
    7. <version>2.3.12.RELEASEversion>
    8. <relativePath/>
    9. parent>
    10. <groupId>com.ykqgroupId>
    11. <artifactId>qy151-springboot-vueartifactId>
    12. <version>0.0.1-SNAPSHOTversion>
    13. <name>qy151-springboot-vuename>
    14. <description>Demo project for Spring Bootdescription>
    15. <properties>
    16. <java.version>1.8java.version>
    17. properties>
    18. <dependencies>
    19. <dependency>
    20. <groupId>com.baomidougroupId>
    21. <artifactId>mybatis-plus-generatorartifactId>
    22. <version>3.5.2version>
    23. dependency>
    24. <dependency>
    25. <groupId>org.freemarkergroupId>
    26. <artifactId>freemarkerartifactId>
    27. <version>2.3.31version>
    28. dependency>
    29. <dependency>
    30. <groupId>com.baomidougroupId>
    31. <artifactId>mybatis-plus-boot-starterartifactId>
    32. <version>3.5.2version>
    33. dependency>
    34. <dependency>
    35. <groupId>com.alibabagroupId>
    36. <artifactId>druid-spring-boot-starterartifactId>
    37. <version>1.2.8version>
    38. dependency>
    39. <dependency>
    40. <groupId>com.github.xiaoymingroupId>
    41. <artifactId>swagger-bootstrap-uiartifactId>
    42. <version>1.9.6version>
    43. dependency>
    44. <dependency>
    45. <groupId>com.spring4allgroupId>
    46. <artifactId>swagger-spring-boot-starterartifactId>
    47. <version>1.9.1.RELEASEversion>
    48. dependency>
    49. <dependency>
    50. <groupId>org.springframework.bootgroupId>
    51. <artifactId>spring-boot-starter-webartifactId>
    52. dependency>
    53. <dependency>
    54. <groupId>org.mybatis.spring.bootgroupId>
    55. <artifactId>mybatis-spring-boot-starterartifactId>
    56. <version>2.2.2version>
    57. dependency>
    58. <dependency>
    59. <groupId>mysqlgroupId>
    60. <artifactId>mysql-connector-javaartifactId>
    61. <scope>runtimescope>
    62. dependency>
    63. <dependency>
    64. <groupId>org.projectlombokgroupId>
    65. <artifactId>lombokartifactId>
    66. <optional>trueoptional>
    67. dependency>
    68. <dependency>
    69. <groupId>org.springframework.bootgroupId>
    70. <artifactId>spring-boot-starter-testartifactId>
    71. <scope>testscope>
    72. dependency>
    73. dependencies>
    74. <build>
    75. <plugins>
    76. <plugin>
    77. <groupId>org.springframework.bootgroupId>
    78. <artifactId>spring-boot-maven-pluginartifactId>
    79. <configuration>
    80. <excludes>
    81. <exclude>
    82. <groupId>org.projectlombokgroupId>
    83. <artifactId>lombokartifactId>
    84. exclude>
    85. excludes>
    86. configuration>
    87. plugin>
    88. plugins>
    89. build>
    90. project>

    (2)mp的代码生成器

    1. package com.lmy;
    2. import com.baomidou.mybatisplus.generator.FastAutoGenerator;
    3. import com.baomidou.mybatisplus.generator.config.OutputFile;
    4. import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
    5. import java.util.Collections;
    6. public class Generator {
    7. public static void main(String[] args) {
    8. FastAutoGenerator.create("jdbc:mysql://localhost:3306/acl_permission?serverTimezone=Asia/Shanghai", "root", "133243")
    9. .globalConfig(builder -> {
    10. builder.author("娄明阳") // 设置作者
    11. .enableSwagger() // 开启 swagger 模式
    12. .fileOverride() // 覆盖已生成文件
    13. .outputDir(".\\src\\main\\java\\"); // 指定输出目录
    14. })
    15. .packageConfig(builder -> {
    16. builder.parent("com.lmy") // 设置父包名
    17. .moduleName("system") // 设置父包模块名
    18. .pathInfo(Collections.singletonMap(OutputFile.xml, "src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
    19. })
    20. .strategyConfig(builder -> {
    21. builder.addInclude("acl_user","acl_role","acl_permission","acl_user_role","acl_role_permission")// 设置需要生成的表名
    22. .addTablePrefix("acl_"); // 设置过滤表前缀
    23. })
    24. .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
    25. .execute();
    26. }
    27. }

    (2) 配置application文件

    1. server.port=8809
    2. spring.datasource.druid.url=jdbc:mysql://localhost:3306/acl_permission?serverTimezone=Asia/Shanghai
    3. spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver
    4. spring.datasource.druid.username=root
    5. spring.datasource.druid.password=133243
    6. #日志
    7. mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

    (4)接口

    1. package com.lmy.system.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.lmy.system.entity.User;
    4. import com.lmy.system.service.IUserService;
    5. import com.lmy.system.vo.CommonResult;
    6. import com.lmy.system.vo.LoginVo;
    7. import org.springframework.beans.factory.annotation.Autowired;
    8. import org.springframework.web.bind.annotation.PostMapping;
    9. import org.springframework.web.bind.annotation.RequestBody;
    10. import org.springframework.web.bind.annotation.RequestMapping;
    11. import org.springframework.web.bind.annotation.RestController;
    12. @RestController
    13. @RequestMapping("/system")
    14. public class LoginController {
    15. @Autowired
    16. private IUserService userService;
    17. @PostMapping("login")
    18. public CommonResult login(@RequestBody LoginVo loginVo){
    19. QueryWrapper wrapper = new QueryWrapper<>();
    20. wrapper.eq("username",loginVo.getName());
    21. wrapper.eq("password",loginVo.getPassword());
    22. wrapper.eq("is_deleted",0);
    23. User one = userService.getOne(wrapper);
    24. if(one!=null){
    25. return new CommonResult(2000,"登录成功",null);
    26. }else{
    27. return new CommonResult(5000,"登录失败",null);
    28. }
    29. }
    30. }

    前端调用后端登录接口时出现如下的错误

    为跨域问题:

    当使用异步请求从一个网址访问另一个网址时可能会出现跨域问题。
    前提:
       1. 必须为异步请求
       2. 当端口号或协议或ip不同时则会出现跨域

    出现两个请求: 有一个请求的方式为: OPTIONS 和真实的请求方式

    理解: OPTIONS先头部队。---探视后台有没有解决跨域。

    如何解决跨域:

    1.前端解决----但是我不会。
    2.后端解决---->这里也有几种方式:
       【1】可以借助nginx.
       【2】在代码中解决 

    在控制层接口上添加@CrossOrigin

    (origins = {"192.168.0.111:8080","192.168.0.120:8081"},allowedHeaders="运行哪些请求头跨域",methods={"GET","POST"})

    origins: 允许哪些域可以跨域访问我这个接口
    allowedHeaders:允许哪些请求头信息跨域
    methods: 允许哪些请求方式跨域

    上面再控制层接口处加上注解的方式解决跨,麻烦的地方就需要对每个控制类都加该注解。 设置一个全局跨域配置类。

    1. package com.lmy.system.config;
    2. import org.springframework.context.annotation.Bean;
    3. import org.springframework.context.annotation.Configuration;
    4. import org.springframework.web.cors.CorsConfiguration;
    5. import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    6. import org.springframework.web.filter.CorsFilter;
    7. @Configuration
    8. //全局跨域配置类
    9. public class CorsConfig {
    10. // 当前跨域请求最大有效时长。这里默认1天
    11. private static final long MAX_AGE = 24 * 60 * 60;
    12. @Bean
    13. public CorsFilter corsFilter() {
    14. UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    15. CorsConfiguration corsConfiguration = new CorsConfiguration();
    16. corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
    17. corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
    18. corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
    19. corsConfiguration.setMaxAge(MAX_AGE);
    20. source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
    21. return new CorsFilter(source);
    22. }
    23. }

    登录成功后前端路由跳转

    2. 登录的bug

    上面咱们写的登录,后端没有保存数据 前端也没有拿到数据进行保存

     修改登录的接口

    1. package com.lmy.system.controller;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.lmy.system.entity.User;
    4. import com.lmy.system.service.IUserService;
    5. import com.lmy.system.vo.CommonResult;
    6. import com.lmy.system.vo.LoginVo;
    7. import io.swagger.annotations.Api;
    8. import io.swagger.annotations.ApiOperation;
    9. import org.springframework.beans.factory.annotation.Autowired;
    10. import org.springframework.data.redis.core.RedisTemplate;
    11. import org.springframework.data.redis.core.ValueOperations;
    12. import org.springframework.web.bind.annotation.*;
    13. import java.util.UUID;
    14. import java.util.concurrent.TimeUnit;
    15. @RestController
    16. @RequestMapping("/system")
    17. @Api(tags = "登录的接口类")
    18. public class LoginController {
    19. @Autowired
    20. private IUserService userService;
    21. @Autowired
    22. private RedisTemplate redisTemplate;
    23. @PostMapping("login")
    24. @ApiOperation(value="登录接口")
    25. public CommonResult login(@RequestBody LoginVo loginVo){
    26. QueryWrapper wrapper = new QueryWrapper<>();
    27. wrapper.eq("username",loginVo.getName());
    28. wrapper.eq("password",loginVo.getPassword());
    29. wrapper.eq("is_deleted",0);
    30. User one = userService.getOne(wrapper);
    31. if(one!=null){
    32. //随机生成一个唯一字符串。
    33. String token = UUID.randomUUID().toString();
    34. //把该token作为redis的key value为当前登录用户信息
    35. ValueOperations forValue = redisTemplate.opsForValue();
    36. forValue.set(token,one,24, TimeUnit.HOURS);
    37. return new CommonResult(2000,"登录成功",token);
    38. }else{
    39. return new CommonResult(5000,"登录失败",null);
    40. }
    41. }
    42. }

    修改前端登录方法:

    后面每次请求都可以携        带该token,  

    每次请求都得要人为添加参数token. 我们可以使用axios得请求拦截器。

    3. 前置路由守卫

    前置路由守卫:就是在路由跳转前加上自己得一些业务代码

    1. //设置前置路由守卫 to:到哪个路由 from:从哪个路由来 next():放行到指定路由
    2. router.beforeEach((to,from,next)=>{
    3. //获取跳转得路径
    4. var path = to.path;
    5. //判断是否为登录路由路径
    6. if(path==="/login"){
    7. console.log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
    8. //放行
    9. return next();
    10. }
    11. //其他路由路径 判断是否登录过
    12. var token = sessionStorage.getItem("token");
    13. if(token){
    14. return next();
    15. }
    16. //跳转登录
    17. return next("/login");
    18. })

    4. 整合shiro

    (1)依赖

    1. <dependency>
    2. <groupId>org.apache.shirogroupId>
    3. <artifactId>shiro-spring-boot-starterartifactId>
    4. <version>1.7.0version>
    5. dependency>

    (2) shiro得配置类

    1. package com.lmy.system.config;
    2. import com.lmy.system.filter.LoginFilter;
    3. import com.lmy.system.realm.MyRealm;
    4. import org.apache.shiro.authc.credential.CredentialsMatcher;
    5. import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
    6. import org.apache.shiro.realm.Realm;
    7. import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
    8. import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
    9. import org.springframework.boot.web.servlet.FilterRegistrationBean;
    10. import org.springframework.context.annotation.Bean;
    11. import org.springframework.context.annotation.Configuration;
    12. import org.springframework.web.filter.DelegatingFilterProxy;
    13. import javax.servlet.Filter;
    14. import java.util.HashMap;
    15. import java.util.Map;
    16. @Configuration
    17. public class ShiroConfig {
    18. @Bean
    19. public DefaultWebSecurityManager securityManager(){
    20. DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    21. securityManager.setRealm(realm());
    22. return securityManager;
    23. }
    24. @Bean
    25. public Realm realm(){
    26. MyRealm myRealm = new MyRealm();
    27. myRealm.setCredentialsMatcher(credentialsMatcher());
    28. return myRealm;
    29. }
    30. @Bean
    31. public CredentialsMatcher credentialsMatcher(){
    32. HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
    33. hashedCredentialsMatcher.setHashIterations(1024);
    34. hashedCredentialsMatcher.setHashAlgorithmName("MD5");
    35. return hashedCredentialsMatcher;
    36. }
    37. @Bean("shiroFilter")
    38. public ShiroFilterFactoryBean filterFactoryBean(){
    39. ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
    40. shiroFilterFactoryBean.setSecurityManager(securityManager());
    41. //设置shiro过滤规则
    42. Map map = new HashMap<>();
    43. map.put("/system/login","anon");
    44. map.put("/**","authc");
    45. shiroFilterFactoryBean.setFilterChainDefinitionMap(map);
    46. //设置未登录过滤器
    47. Map filters = new HashMap<>();
    48. filters.put("authc",new LoginFilter());
    49. shiroFilterFactoryBean.setFilters(filters);
    50. return shiroFilterFactoryBean;
    51. }
    52. @Bean
    53. public FilterRegistrationBean filterProxy(){
    54. FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean<>();
    55. filterRegistrationBean.setFilter(new DelegatingFilterProxy());
    56. filterRegistrationBean.setName("shiroFilter");
    57. filterRegistrationBean.addUrlPatterns("/*");
    58. return filterRegistrationBean;
    59. }
    60. }

    (3)增加一个realm类对象

    1. package com.lmy.system.realm;
    2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
    3. import com.lmy.system.entity.User;
    4. import com.lmy.system.service.IUserService;
    5. import org.apache.shiro.authc.AuthenticationException;
    6. import org.apache.shiro.authc.AuthenticationInfo;
    7. import org.apache.shiro.authc.AuthenticationToken;
    8. import org.apache.shiro.authc.SimpleAuthenticationInfo;
    9. import org.apache.shiro.authz.AuthorizationInfo;
    10. import org.apache.shiro.authz.SimpleAuthorizationInfo;
    11. import org.apache.shiro.realm.AuthorizingRealm;
    12. import org.apache.shiro.subject.PrincipalCollection;
    13. import org.apache.shiro.util.ByteSource;
    14. import org.springframework.beans.factory.annotation.Autowired;
    15. public class MyRealm extends AuthorizingRealm {
    16. @Autowired
    17. private IUserService userService;
    18. @Override
    19. protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    20. return null;
    21. }
    22. @Override
    23. protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
    24. String username = (String) token.getPrincipal();
    25. QueryWrapper wrapper = new QueryWrapper<>();
    26. wrapper.eq("username",username);
    27. wrapper.eq("is_deleted",0);
    28. User user = userService.getOne(wrapper);
    29. if(user!=null){
    30. ByteSource bytes = ByteSource.Util.bytes(user.getSalt());
    31. SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user,user.getPassword(),bytes,this.getName());
    32. return info;
    33. }
    34. return null;
    35. }
    36. }

    (4) 修改controller代码

     测试登录

     登录成功后获取用户信息时出现如下得错误

     被shiro得拦截器给拦截器了。

    1. package com.lmy.system.filter;
    2. import org.apache.shiro.web.filter.authc.FormAuthenticationFilter;
    3. import org.springframework.beans.factory.annotation.Autowired;
    4. import org.springframework.data.redis.core.RedisTemplate;
    5. import org.springframework.stereotype.Component;
    6. import javax.servlet.ServletRequest;
    7. import javax.servlet.ServletResponse;
    8. import javax.servlet.http.HttpServletRequest;
    9. //如果类没有交于spring容器来管理 那么该类中得属性也不能让spring帮你注入
    10. public class LoginFilter extends FormAuthenticationFilter {
    11. private RedisTemplate redisTemplate; //LoginFilter必须交于spring容器来管理。
    12. public LoginFilter(RedisTemplate redisTemplate) {
    13. this.redisTemplate = redisTemplate;
    14. }
    15. //当登录成功后执行得方法,如果该方法返回false,则执行onAccessDenied
    16. @Override
    17. protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
    18. System.out.println(redisTemplate);
    19. HttpServletRequest req = (HttpServletRequest) request;
    20. //1.请求方式是否为OPTIONS
    21. String method = req.getMethod();
    22. if(method!=null && method.equals("OPTIONS")){
    23. return true;
    24. }
    25. //2.判断请求头是否有token值
    26. String token = req.getHeader("token");
    27. if(token!=null && redisTemplate.hasKey(token)){
    28. return true;
    29. }
    30. return false;
    31. }
    32. //未登录时调用该方法? 为什么进入没有登录方法:
    33. // --->第一个请求是OPTIONS,没有携带token 第二个因为前端和后端不是用得同一个session.默认shiro以sessionId为是否登录得标准
    34. @Override
    35. protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
    36. System.out.println("*******************************");
    37. return false;
    38. }
    39. }

    5. 主页得布局

    1. <template>
    2. <el-container>
    3. <el-header>
    4. <span id="logo" style="display: inline-block;width: 50%;height: 100%;float: left" >
    5. <a href="https://www.bilibili.com/video/BV14g41197PY/"><img src="../assets/logo.png" height="100%" width="180px">a>
    6. span>
    7. <span id="avatar" style="float: right">
    8. <el-dropdown >
    9. <span class="el-dropdown-link" style="margin-top: 10px; display: inline-block;">
    10. <el-avatar >el-avatar>
    11. span>
    12. <el-dropdown-menu slot="dropdown">
    13. <el-dropdown-item command="info">个人信息el-dropdown-item>
    14. <el-dropdown-item command="logout">退出登录el-dropdown-item>
    15. el-dropdown-menu>
    16. el-dropdown>
    17. span>
    18. el-header>
    19. <el-container>
    20. <el-aside width="200px">
    21. el-aside>
    22. <el-main>
    23. el-main>
    24. el-container>
    25. <el-footer>Footerel-footer>
    26. el-container>
    27. template>
    28. <script>
    29. export default {
    30. name: "Home",
    31. methods:{
    32. getInfo(){
    33. this.$http.get("http://localhost:8808/system/user/getInfo").then(result=>{
    34. console.log(result)
    35. })
    36. }
    37. }
    38. }
    39. script>
    40. <style>
    41. html,body,#app{
    42. height: 100%;
    43. }
    44. body,#app{
    45. padding: 0px;
    46. margin:0px;
    47. }
    48. .el-container{
    49. height: 100%;
    50. }
    51. .el-header, .el-footer {
    52. background-color: #1F272F;
    53. color: #333;
    54. line-height: 60px;
    55. }
    56. .el-aside {
    57. background-color: #545c64;
    58. color: #333;
    59. line-height: 560px;
    60. }
    61. .el-aside>.el-menu{
    62. border: none;
    63. }
    64. .el-main {
    65. background-color: #E9EEF3;
    66. color: #333;
    67. line-height: 560px;
    68. }
    69. body > .el-container {
    70. margin-bottom: 40px;
    71. }
    72. .el-container:nth-child(5) .el-aside,
    73. .el-container:nth-child(6) .el-aside {
    74. line-height: 260px;
    75. }
    76. .el-container:nth-child(7) .el-aside {
    77. line-height: 320px;
    78. }
    79. style>

    6. 退出

    前端:  

    后端:

    1. @GetMapping("/logout")
    2. public CommonResult logout(HttpServletRequest request){
    3. String token = request.getHeader("token");
    4. if(redisTemplate.hasKey(token)){
    5. redisTemplate.delete(token);
    6. return new CommonResult(2000,"退出成功",null);
    7. }
    8. return new CommonResult(5000,"无效得token",null);
    9. }

     7. 查询左侧菜单

    (1)前端

    1. initLeftMenu(){
    2. this.$http.get("/system/permission/leftMenu").then(result=>{
    3. if(result.data.code===2000){
    4. this.leftMenus=result.data.data;
    5. }
    6. })
    7. },

    (2)后端

    1. @Controller
    2. @RequestMapping("/system/permission")
    3. public class PermissionController {
    4. @Autowired
    5. private IPermissionService permissionService;
    6. @GetMapping("leftMenu")
    7. public CommonResult leftMenu(HttpServletRequest request){
    8. String token = request.getHeader("token");
    9. return permissionService.findPermissionByUserId(token);
    10. }
    11. }

    service

    1. package com.lmy.system.service.impl;
    2. import com.lmy.system.entity.Permission;
    3. import com.lmy.system.entity.User;
    4. import com.lmy.system.mapper.PermissionMapper;
    5. import com.lmy.system.service.IPermissionService;
    6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
    7. import com.ykq.system.vo.CommonResult;
    8. import org.springframework.beans.factory.annotation.Autowired;
    9. import org.springframework.data.redis.core.RedisTemplate;
    10. import org.springframework.data.redis.core.ValueOperations;
    11. import org.springframework.stereotype.Service;
    12. import java.util.ArrayList;
    13. import java.util.List;
    14. @Service
    15. public class PermissionServiceImpl extends ServiceImpl implements IPermissionService {
    16. @Autowired
    17. private PermissionMapper permissionMapper;
    18. @Autowired
    19. private RedisTemplate redisTemplate;
    20. @Override
    21. public CommonResult findPermissionByUserId(String token) {
    22. //根据token获取用户信息
    23. ValueOperations forValue = redisTemplate.opsForValue();
    24. User o = (User) forValue.get(token);
    25. String id = o.getId();
    26. //根据用户id查询该用户具有得权限。
    27. List permissionList = permissionMapper.selectByUserId(id);
    28. //设置层级关系
    29. List firstMenus = new ArrayList<>();
    30. for (Permission first : permissionList) {
    31. //int
    32. if (first.getPid().equals("1")) {
    33. firstMenus.add(first);
    34. }
    35. }
    36. //为一级菜单设置二级菜单
    37. for (Permission first : firstMenus) {
    38. //根据一级菜单id 查询 该菜单得二级菜单。如果出现不确定有几级菜单 那么我们可以使用方法得递归调用
    39. first.setChildren(findChildren(permissionList, first.getId()));
    40. }
    41. return new CommonResult(2000,"查询成功",firstMenus);
    42. }
    43. //方法递归
    44. private List findChildren(List permissionList, String id) {
    45. List children = new ArrayList<>();
    46. for (Permission p : permissionList) {
    47. if (p.getPid().equals(id)) {
    48. children.add(p);
    49. }
    50. }
    51. for (Permission child : children) {
    52. child.setChildren(findChildren(permissionList, child.getId()));
    53. }
    54. return children;
    55. }
    56. }

  • 相关阅读:
    Windows 11 上使用安卓应用及安装谷歌 Google Play和亚马逊 应用商店
    分布式锁的三种实现方式
    计算机毕业设计ssm+vue基本微信小程序的蛋糕预订平台系统
    8.SpringMVC处理ajax请求
    什么是集成测试?集成测试方法有哪些?
    电子设备内幕:RAM和ROM小百科
    golang promethus consul 服务发现
    每日分享html之两个input搜索框、两个button按钮、一个logo效果
    微服务框架 SpringCloud微服务架构 12 DockerCompose 12.2 部署微服务集群
    「X」to「Earn」:赛道现状与破局思路
  • 原文地址:https://blog.csdn.net/qq_59114219/article/details/126231294