前后端分离案例--权限系统(跨域请求)

2023-11-08

权限系统:

1、前端:vue + elementui + axios + css + html

2、后端:springboot + mybatis-plus + nybatis + druid + shiro + swagger2 + redis

1、前端界面及按钮事件实现

1.1 登录页面的构建

1.1.1 Login.vue文件

<template>
    <div id="aps">
        <div id="con">
            <!-- 头像 -->
            <div class="avatar_box">
                <el-image :src="avatar" style="border-radius: 50%;width: 100%;height: 100%;">
                    <div slot="placeholder" class="image-slot" >
                        加载中<span class="dot">...</span>
                    </div>
                </el-image>
            </div>
            <el-form :model="loginForm" :rules="rules" ref="loginForm" class="login-ruleForm">
                <el-form-item label="账号" prop="username">
                    <el-input v-model="loginForm.username" style="width: 200px;"></el-input>
                </el-form-item>
                <el-form-item label="密码" prop="password">
                    <el-input type="password" v-model="loginForm.password" style="width: 200px;"></el-input>
                </el-form-item>
                <el-form-item style="margin-left: 0px; text-align: center">
                    <el-button type="primary" size="big">登录</el-button>
                    <!--<el-button @click="register" size="small">注册</el-button>-->
                </el-form-item>
            </el-form>
        </div>
    </div>
</template>
 
<script>
    export default {
        name: "Login",
        data() {
            return {
                avatar:"",
                loginForm: {
                    username:"",
                    password:""
                },
                rules: {
                    username: [
                        {required: true, message: '请输入账号名称', trigger: 'blur'}
                    ],
                    password: [
                        {required: true, message: '请输入密码', trigger: 'blur'}
                    ]
                },
                registerFormVisible: false,
                registerForm:{},
            }
        },
        methods: {
 
        }
    }
</script>
 
<style>
html, body {
    height: 100%;
}
body {
    margin: 0px;
    overflow-x: hidden;
}
#con{
    border: 1px solid gray;
    border-radius: 10px;
    width: 400px;
    height: 280px;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%,-50%);
    padding: 20px;
    text-align: center;
    background: white;
    opacity:0.8;
}
#aps{
    width: 100%;
    height: 100%;
    background-image: url("../assets/images/background3.jpg");
    background-size: 100% 100%;
    background-position: center center;
    overflow: auto;
    background-repeat: no-repeat;
    position: fixed;
    line-height: 100%;
}
#con>.avatar_box{
    height: 100px;
    width: 100px;
    border: 1px solid #eee;
    border-radius: 50%;
    padding: 10px;
    box-shadow: 0 0 10px #ddd;
    position: absolute;
    left: 50%;
    transform: translate(-50%, -50%);
    background-color: #fff;
}
.login-ruleForm {
    position: absolute;
    bottom: 0;
    width: 100%;
    padding: 0 50px;
    box-sizing: border-box;
}
</style>

1.1.2 App.vue

<template>
  <div id="app">
    <router-view/>
  </div>
</template>
 
<script>
 
export default {
  name: 'app',
  components: {
 
  }
}
</script>
 
<style>
 
</style>

1.1.3 router/index.js

import Vue from 'vue'
import VueRouter from 'vue-router'
 
import Login from '../views/Login.vue'
 
Vue.use(VueRouter)
 
const routes = [
  {
    path: '/',
    redirect: '/login'
  },
  {
    path: '/login',
    name: 'Login',
    component: Login
  }
]
 
const router = new VueRouter({
  routes
})
 
export default router

 

 1.2 登录按钮事件

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

1.2.1 main.js文件

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import './plugins/element.js'
//导入axios
import axios from "axios";
 
Vue.config.productionTip = false
 
//把axios挂载到vue对象中,以后在vue中如果使用axios直接可以使用$http名称
Vue.prototype.$http = axios
 
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

1.2.2 Login.vue文件

在Login.vue文件中点击登录按钮,向后台服务器发送axios异步请求

methods: {
    login(){
        //表单校验
        this.$refs['loginForm'].validate((valid)=>{
            if (valid){
                //url:后端登录接口的路径
                this.$http.post("http://localhost:8080/login",this.loginForm).then(result=>{
                    console.log(result)
                })
            }
        })
    }
}

2、后端登录接口

2.1 pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.gjx</groupId>
    <artifactId>springboot-vue</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-vue</name>
    <description>springboot-vue</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!--引入swagger的启动依赖-->
        <dependency>
            <groupId>com.spring4all</groupId>
            <artifactId>swagger-spring-boot-starter</artifactId>
            <version>1.9.1.RELEASE</version>
        </dependency>
        <!--引入swagger的图形界面-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.7.8</version>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.2</version>
        </dependency>
        <!--代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
 
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
 
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
 
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
 
</project>

 

2.2 mybatis-plus代码生成器

public class CodeGenerator {
    public static void main(String[] args) {
        FastAutoGenerator.create("jdbc:mysql://192.168.1.29:3306/acl_permission?serverTimezone=Asia/Shanghai", "root", "990412")
                .globalConfig(builder -> {
                    builder.author("gjx") // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .fileOverride() // 覆盖已生成文件
                            .outputDir(".\\src\\main\\java"); // 指定输出目录
                })
                .packageConfig(builder -> {
                    builder.parent("com") // 设置父包名
                            .moduleName("gjx") // 设置父包模块名
                            .pathInfo(Collections.singletonMap(OutputFile.xml, ".\\src\\main\\resources\\mapper\\")); // 设置mapperXml生成路径
                })
                .strategyConfig(builder -> {
                    builder.addInclude("acl_permission","acl_role","acl_user") // 设置需要生成的表名
                            .addTablePrefix("acl_"); // 设置过滤表前缀
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
                .execute();
 
    }
}

2.3 配置application文件

server.port=8081
# 配置mysql数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.1.29:3306/acl_permission?serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=990412
 
# mybatis mapper映射文件的路径
mybatis.mapper-locations=classpath:mapper/*.xml
# mybatis-plus的日志文件stdout
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

 

2.4 前端传递的参数接收类vo包下

2.5 接口

@RestController
public class LoginController {
 
    @Autowired
    private IUserService iUserService;
 
    @PostMapping("/login")
    public CommonResult login(@RequestBody LoginVO loginVO){
        User login = iUserService.login(loginVO);
        if (login!=null){
            return new CommonResult(2000,"登录成功",null);
        }
        return new CommonResult(5000,"登录失败",null);
    }
}

 

2.6 使用swagger2进行接口测试

@Configuration
public class SwaggerConfig {
 
    @Autowired
    Docket docket;
    @Bean
    public Docket docket(){
        Docket docket = new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.gjx.controller"))
                .build();
        return docket;
    }
 
    private ApiInfo apiInfo(){
 
        Contact DEFAULT_CONTACT = new Contact("dumpling", "https://taobao.com", "1983275549@qq.com");
        ApiInfo apiInfo = new ApiInfo("dumpling的接口文档", "关于Student表的一些基本操作", "1.0", "http://192.168.1.29:8080/",
                DEFAULT_CONTACT, "Apache 2.0", "http://192.168.1.29:8080/", new ArrayList<VendorExtension>());
        return apiInfo;
    }
}

测试

3、前端调用后端登录接口

 

我们会发现报了不支持跨域请求的错误

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

 

什么是跨域呢?

前端发起请求的域与该请求指向的资源所在的域不一样,凡是发送请求的url的 协议、域名、端口号三者之间任意一者与当前页面地址不同的请求。这里的域指的是这样的一个概念:我们认为若协议 + 域名 + 端口号均相同,那么就是同域。

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

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

解决方法:

1.前端解决

2.后端解决---->这里也有几种方式:  

【1】可以借助nginx.  

【2】在代码中解决

在控制层接口上添加@CrossOrigin ,不过每一个controller文件都许哟啊加上这个注解

 

 

 

这个注解的一些属性

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

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

设置一个全局跨域配置类。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
 
@Configuration
public class CorsConfig {
 
    // 当前跨域请求最大有效时长。这里默认1天
    private static final long MAX_AGE = 24 * 60 * 60;
 
    @Bean
    public CorsFilter corsFilter() {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration corsConfiguration = new CorsConfiguration();
        corsConfiguration.addAllowedOrigin("*"); // 1 设置访问源地址
        corsConfiguration.addAllowedHeader("*"); // 2 设置访问源请求头
        corsConfiguration.addAllowedMethod("*"); // 3 设置访问源请求方法
        corsConfiguration.setMaxAge(MAX_AGE);
        source.registerCorsConfiguration("/**", corsConfiguration); // 4 对接口配置跨域设置
        return new CorsFilter(source);
    }
}

 

这个配置类和上面的@CrossOrigin注解两者只能选其一。

 

4、登录成功后前端路由跳转

 5、将用户会话信息存储在redis中

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

 

5.1 修改登录的接口

pom.xml文件
 
<!--引入jedis-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 

配置文件
 
#redis数据库配置
spring.redis.host=localhost
spring.redis.port=6379
@RestController
@Api("登录的接口类")
//@CrossOrigin
public class LoginController {
 
    @Autowired
    private IUserService iUserService;
 
    @Autowired
    private RedisTemplate redisTemplate;
 
    @PostMapping("/login")
    @ApiOperation("登录接口")
    public CommonResult login(@RequestBody LoginVO loginVO){
        User login = iUserService.login(loginVO);
        if (login!=null){
            String token = UUID.randomUUID().toString();
            ValueOperations forValue = redisTemplate.opsForValue();
            forValue.set(token,login,24, TimeUnit.HOURS);
            return new CommonResult(2000,"登录成功",token);
        }
        return new CommonResult(5000,"登录失败",null);
    }
}

5.2 修改前端登录方法

 

 后面每次请求都可以携带该token,每次请求都得要人为添加参数token, 我们可以使用axios得请求拦截器。

 

在登录成功之后,使用一个按钮测试token是否在请求头中

 

然后观察后台能否获取token

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

前后端分离案例--权限系统(跨域请求) 的相关文章

  • 日期语句之间的 JPQL SELECT [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我想将此 SQL 语句转换为等效的 JPQL SELECT FROM events WHERE events date BETWE
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • 如何更改javaFX中按钮的图像?

    我正在使用javaFX 我制作了一个按钮并为此设置了图像 代码是 Image playI new Image file c Users Farhad Desktop icons play2 jpg ImageView iv1 new Ima
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 来自 dll 的 Java 调用函数

    我有这个 python 脚本导入zkemkeeperdll 并连接到考勤设备 ZKTeco 这是我正在使用的脚本 from win32com client import Dispatch zk Dispatch zkemkeeper ZKE
  • Java 集合的并集或交集

    建立并集或交集的最简单方法是什么Set在 Java 中 我见过这个简单问题的一些奇怪的解决方案 例如手动迭代这两个集合 最简单的单行解决方案是这样的 set1 addAll set2 Union set1 retainAll set2 In
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • Python进阶-----面向对象1.0(对象和类的介绍、定义)

    目录 前言 面向过程和面向对象 类和对象 Python中类的定义 1 类的定义形式 2 深层剖析类对象 前言 感谢各位的一路陪伴 我学习Python也有一个月了 在这一个月里我收获满满 学到了很多知识 每当我学会了一个新的知识点我会发表一篇
  • 压控恒流源学习笔记

    激光二极管 以下称LD 即使采用恒流驱动 其光输出功率也会随温度变化而发生大的变动 因此必须监视它的光输出 利用反馈环路来控制驱动电流 这即是自动输出控制APC AutomatICPowerControl 电路 第一种 调节激光亮度 可以依
  • Java——ArrayList基本使用

    1 简介 ArrayList是实现List接口的 底层采用数组实现 ArrayList 实现了Cloneable接口 即覆盖了函数clone 能被克隆 ArrayList 实现java io Serializable接口 这意味着Array
  • LRU缓存机制

    LRU缓存机制LeetCode146官方题解 struct DLinkedNode int key value DLinkedNode prev DLinkedNode next DLinkedNode key 0 value 0 prev
  • spring boot 启动报错,找不到DataSource

    报错信息如下 16 39 11 372 1653 main WARN o s b c e AnnotationConfigEmbeddedWebApplicationContext AbstractApplicationContext ja
  • 【C++】-- 哈希算法

    目录 一 哈希概念 1 插入和查找 2 哈希表 3 常见的哈希函数 1 直接定址法 2 除留余数法 二 用闭散列解决哈希冲突 1 线性探测法介绍 2 线性探测的实现 1 状态 2 定义HashData 3 哈希表 4 查找 5 插入 6 删
  • sparkStreaming:实时流数据详解

    目录 一 概述 二 wordCount示例 三 初始化StreamingContext 四 DStreams 离散数据流 五 输入DStream和接收器 Basic sources File Streams Custom Receivers
  • js 实现鼠标点击tab栏选项卡切换,下面相应内容跟随变化

  • Github上 简单易用的 Android ViewModel Retrofit框架

    RequestViewModel 长期更新 支持网络请求的ViewMode框架 ViewModel LiveData Retrofit github 地址 https github com miaotaoii RequestViewMode
  • [980]Windows host配置域名

    程序员开发中可能会需要域名访问程序 说白了就是修改hosts文件 过程如下 1 找到本机hosts文件路径一般位置在 C Windows System32 drivers etc 2 右键编辑hosts文件 在最下面增加 127 0 0 1
  • java的格式化时间工具类

    代码 public class DateTimeUtil private static final Logger logger LoggerFactory getLogger DateTimeUtil class public static
  • 全链路监控之pinpoint

    一 pinpoint出现与其他相似概念比较 1 pinpoint概念 pinpoint是由java PHP编写而成的 用来对大规模的分布式系统提供应用性能管理 pinpoint可以解决复杂架构下的拓扑解析与性能分析 2 pinpoint的特
  • NCNN、OpenVino、 TensorRT、MediaPipe、ONNX,各种推理部署架构,到底哪家强?

    以深度学习为主的人工智能算法模型在日常AI应用中逐渐占据主流方向 相关的各类产品也是层出不穷 我们平时所看到的AI产品 像刷脸支付 智能语音 银行的客服机器人等 都是AI算法的具体落地应用 AI技术在具体落地应用方面 和其他软件技术一样 也
  • 数字图像与视频处理 作业模板 Latex版

    搞了好久 终于把这个简单的模板给拼出来了 不熟悉想做点什么真的太难 做的时候一点点小的问题就可能发去半天的时间都找不出来 比如到最后完全没有问题的时候bibtex命令就是通不过 后来我把文件名改短了 去掉分隔符 成功了 所以说不懂的事情要从
  • 黑窗口下带进度条的http下载

    package main import flag fmt io log net http os strconv strings time github com cheggaaa pb var url flag String url The
  • mac下pycharm使用小技巧--持续更新

    Pycharm使用小技巧 pycharm创建新文件自动添加文件头注释 背景 我们平时在使用pycharm发现有些大神创建一个新文件的时候会自动在文件头添加一些注释 像是有文件路径 创建时间 创建人 集成平台等信息 但是我们自己创建的时候就没
  • 论文翻译:2021_Performance optimizations on deep noise suppression models

    Python微信订餐小程序课程视频 https blog csdn net m0 56069948 article details 122285951 Python实战量化交易理财系统 https blog csdn net m0 5606
  • 快速排序---从大到小和从小到大(Java)

    快速排序 快速排序由于排序效率在同为O nlogn 的几种排序方法中效率较高 因此经常被采用 再加上快速排序使用了分治法的思想 算是基础排序中比较高档的一种排序了 基本思想 1 先从数列中取出一个数作为基准数 可以是第一个 也可是中间的或者
  • 大数据系统体系架构(含图示)

    目录 1 大数据体系架构图 2 数据采集层 3 数据计算层 4 数据服务层 5 数据应用层 1 大数据体系架构图 2 数据采集层 阿里的的日志采集包括两大体系 Aplus JS是Web端的日志采集技术方案 UserTrack是APP端的日志
  • 前后端分离案例--权限系统(跨域请求)

    权限系统 1 前端 vue elementui axios css html 2 后端 springboot mybatis plus nybatis druid shiro swagger2 redis 1 前端界面及按钮事件实现 1 1