首页 > 其他分享 >springboot第48集:【思维导图】地图,面向对象,异常,功能代码

springboot第48集:【思维导图】地图,面向对象,异常,功能代码

时间:2024-01-16 16:33:25浏览次数:43  
标签:springboot 48 导图 image request AMap new public png


在Spring Boot中,可以通过编写拦截器(Interceptor)来对请求进行拦截与处理。下面是一个简单的拦截器实现示例:

  1. 创建一个类并实现HandlerInterceptor接口
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行拦截处理
        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token)) {
            // 如果请求头中没有携带token,则返回错误信息
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{"code":401,"msg":"未授权访问"}");
            return false;
        }
        // 如果token验证通过,则放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理之后进行拦截处理
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成之后进行拦截处理
    }
}
  1. 在Spring Boot配置类中注册拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册AuthInterceptor拦截器,并设置拦截路径为/api/**
        registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**");
    }
  
}

在上面的示例代码中,我们编写了一个名为AuthInterceptor的拦截器,对所有以/api/开头的请求进行拦截,并进行token验证。如果token验证不通过,则返回错误信息,否则放行。

接着,在Spring Boot的配置类WebMvcConfig中,我们通过重写addInterceptors方法来注册AuthInterceptor拦截器,并将其设置拦截路径为/api/。

需要注意的是,在拦截器中可能会有一些资源需要释放,例如数据库连接等,这时可以在afterCompletion方法中进行资源释放操作。

springboot写验证器

在Spring Boot中,可以通过编写验证器(Validator)来对表单数据进行校验。下面是一个简单的验证器实现示例:

  1. 创建一个类并实现Validator接口
public class UserValidator implements Validator {

    /**
     * 判断当前支持的验证类型
     */
    @Override
    public boolean supports(Class<?> clazz) {
        return User.class.equals(clazz);
    }

    /**
     * 执行具体的验证逻辑
     */
    @Override
    public void validate(Object target, Errors errors) {
        User user = (User) target;
        if (StringUtils.isEmpty(user.getUsername())) {
            // 如果用户名为空,则添加错误信息
            errors.rejectValue("username", "username.empty");
        }
        if (StringUtils.isEmpty(user.getPassword())) {
            // 如果密码为空,则添加错误信息
            errors.rejectValue("password", "password.empty");
        }
    }
}
  1. 在Controller中使用验证器进行表单校验
@RestController
@RequestMapping("/api")
public class UserController {

    /**
     * 使用UserValidator验证表单数据
     */
    @PostMapping("/login")
    public ResponseEntity<String> login(@Validated @RequestBody User user, BindingResult result) {
        if (result.hasErrors()) {
            // 如果表单数据不符合要求,则返回错误信息
            StringBuilder sb = new StringBuilder();
            result.getAllErrors().forEach(error -> sb.append(error.getDefaultMessage()).append(";"));
            return ResponseEntity.badRequest().body(sb.toString());
        }
        // 如果表单数据验证通过,则进行登录操作
        // ...
        return ResponseEntity.ok("登录成功");
    }
}

在上面的示例代码中,我们创建了一个名为UserValidator的验证器,并在其中实现了对User对象中的username和password字段进行非空校验的逻辑。

接着,在Controller中的login方法中,我们使用@Validated注解将User对象标记为需要进行表单验证的对象,并将BindingResult对象作为参数传入。在方法中先判断BindingResult对象是否存在错误信息,如果存在则说明表单数据不符合要求,返回相应的错误信息;否则说明表单数据验证通过,进行登录操作。

需要注意的是,在使用@Validated注解时需要在Controller类上添加@Validated注解,以启用Spring Boot的表单验证机制。

springboot写权限拦截

在Spring Boot中,可以通过编写拦截器(Interceptor)来对请求进行权限拦截。下面是一个简单的权限拦截器实现示例:

  1. 创建一个类并实现HandlerInterceptor接口
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在请求处理之前进行权限拦截处理
        String token = request.getHeader("Authorization");
        if (StringUtils.isEmpty(token)) {
            // 如果请求头中没有携带token,则返回错误信息
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{"code":401,"msg":"未授权访问"}");
            return false;
        }
        // 获取用户权限,并与当前请求的URL进行比对
        String permission = getUserPermission(token);
        String requestUrl = getRequestUrl(request);
        if (!hasPermission(permission, requestUrl)) {
            // 如果用户没有访问此URL的权限,则返回错误信息
            response.setContentType("application/json;charset=UTF-8");
            response.getWriter().write("{"code":403,"msg":"无权访问"}");
            return false;
        }
        // 如果权限验证通过,则放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 请求处理之后进行拦截处理
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 请求完成之后进行拦截处理
    }

    /**
     * 获取用户权限
     */
    private String getUserPermission(String token) {
        // 根据token获取用户信息,包括用户权限
        // ...
        return "admin,user";
    }

    /**
     * 判断用户是否有访问此URL的权限
     */
    private boolean hasPermission(String permission, String requestUrl) {
        // 将用户权限字符串转换为数组,便于比对
        String[] permissions = permission.split(",");
        for (String p : permissions) {
            if (AntPathMatcher.match(p, requestUrl)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取请求的URL
     */
    private String getRequestUrl(HttpServletRequest request) {
        String url = request.getRequestURI();
        String contextPath = request.getContextPath();
        return url.replaceFirst(contextPath, "");
    }
}
  1. 在Spring Boot配置类中注册拦截器
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    /**
     * 注册拦截器
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册AuthInterceptor拦截器,并设置拦截路径为/api/**
        registry.addInterceptor(new AuthInterceptor()).addPathPatterns("/api/**");
    }
  
}

在上面的示例代码中,我们编写了一个名为AuthInterceptor的拦截器,对所有以/api/开头的请求进行权限拦截。在拦截器中,我们先获取请求头中携带的token,并根据该token获取到当前用户对应的权限信息。

接着,我们将用户权限字符串转换为数组,遍历数组并使用AntPathMatcher工具类对用户权限和当前请求的URL进行比对,判断用户是否有访问此URL的权限。如果用户没有访问此URL的权限,则返回错误信息;否则说明权限验证通过,放行。

需要注意的是,在使用AntPathMatcher对URL进行比对时,可以使用通配符***,其中*匹配任意字符,匹配任意多级目录。例如:

  • /api/user/* 匹配 /api/user/list、/api/user/add 等URL;
  • /api/user/** 匹配 /api/user/list、/api/user/detail/1 等URL。

springboot写短信发送

在Spring Boot中,可以通过调用第三方短信服务商提供的接口来实现短信发送功能。下面以阿里云短信服务为例,展示如何在Spring Boot中实现短信发送功能。

  1. 添加依赖

在pom.xml文件中添加阿里云SDK依赖:

<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.0</version>
</dependency>
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
    <version>1.0.0</version>
</dependency>
  1. 添加配置

在application.yml文件中添加阿里云短信服务的相关配置信息:

aliyun:
  access-key-id: <your-access-key-id>
  access-key-secret: <your-access-key-secret>
  sms:
    sign-name: <your-sms-sign-name>
    template-code: <your-sms-template-code>

需要将上面的 <your-access-key-id><your-access-key-secret><your-sms-sign-name><your-sms-template-code> 分别替换成真正的值。其中,access-key-id 和 access-key-secret 是阿里云账号的访问密钥ID和密钥,sign-name 是在阿里云短信控制台中设置的签名名称,template-code 是在阿里云短信控制台中创建的短信模板ID。

  1. 编写发送短信的代码

在需要发送短信的地方,可以使用以下代码来调用阿里云短信服务的API:

@Autowired
private AliyunSmsConfig smsConfig;

public void sendSms(String phone, String code) throws ClientException {
    // Step 1. 初始化DefaultAcsClient
    IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsConfig.getAccessKeyId(), smsConfig.getAccessKeySecret());
    DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Dysmsapi", "dysmsapi.aliyuncs.com");
    IAcsClient client = new DefaultAcsClient(profile);

    // Step 2. 构造请求
    CommonRequest request = new CommonRequest();
    request.setMethod(MethodType.POST);
    request.setDomain("dysmsapi.aliyuncs.com");
    request.setVersion("2017-05-25");
    request.setAction("SendSms");

    // Step 3. 设置请求参数
    request.putQueryParameter("PhoneNumbers", phone);
    request.putQueryParameter("SignName", smsConfig.getSignName());
    request.putQueryParameter("TemplateCode", smsConfig.getTemplateCode());
    request.putQueryParameter("TemplateParam", "{"code":"" + code + ""}");

    // Step 4. 发送请求并解析响应
    CommonResponse response = client.getCommonResponse(request);
    JSONObject object = JSON.parseObject(response.getData());
    String codeValue = object.getString("Code");
    if (!StringUtils.equals(codeValue, "OK")) {
        throw new RuntimeException("短信发送失败:" + object.getString("Message"));
    }
}

在上面的示例代码中,我们先通过Autowired注解将阿里云短信服务的配置信息注入到smsConfig变量中,然后调用sendSms方法来发送短信。具体步骤如下:

  • Step 1. 初始化DefaultAcsClient:创建一个IAcsClient对象,并传入阿里云账号的访问密钥ID和密钥。
  • Step 2. 构造请求:设置请求的域名、版本号和操作名称。
  • Step 3. 设置请求参数:设置接收短信的手机号码、短信签名、短信模板ID以及短信模板中的变量值。
  • Step 4. 发送请求并解析响应:调用IAcsClient对象的getCommonResponse方法发送请求,并将响应结果转换为JSONObject对象进行解析。如果发送成功,则返回的Code值为OK;否则返回的

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_02

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_03

image.png

快捷键



springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_04

image.png

AMapLoader.load({
    key: "key", // 申请好的Web端开发者Key,首次调用 load 时必填
    version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    plugins: ["AMap.moveAnimation"], // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    AMapUI: {
      // 是否加载 AMapUI,缺省不加载
      version: "1.1", // AMapUI 版本
      plugins: [], // 需要加载的 AMapUI ui插件
    },
const map = new AMap.Map("container", {
        //设置地图容器id
        viewMode: "3D", //是否为3D地图模式
        zoom: 13, //初始化地图级别
        center: current_position.value, //初始化地图中心点位置
        mapStyle: "amap://styles/fresh",
      })
AMap.plugin(
        [
          "AMap.ToolBar",
          "AMap.Scale",
          "AMap.HawkEye",
          "AMap.Geolocation",
          "AMap.MapType",
          "AMap.MouseTool",
          "AMap.Polyline",
        ],
        function () {
          //异步同时加载多个插件
          // 添加地图插件
          // map.addControl(new AMap.ToolBar()) // 工具条控件;范围选择控件
          map.addControl(new AMap.Scale()) // 显示当前地图中心的比例尺
          // map.addControl(new AMap.HawkEye()) // 显示缩略图
          // map.addControl(new AMap.Geolocation()) // 定位当前位置
          // map.addControl(new AMap.MapType()) // 实现默认图层与卫星图,实时交通图层之间切换
 
          // 以下是鼠标工具插件
          const mouseTool = new AMap.MouseTool(map)
          // mouseTool.rule();// 用户手动绘制折线图,测量距离
          // mouseTool.measureArea() // 测量面积
        }
// 实例化点标记
      const marker = new AMap.Marker({
        icon: "//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png",
        position: current_position.value, // 这里我们通过上面的点击获取经纬度坐标,实时添加标记
        // 通过设置 offset 来添加偏移量
        offset: new AMap.Pixel(-26, -54),
      })
//这里监听标注点的点击事件,触发实现动画效果
      marker.on("click", function () {
        animationMove()
      })
      marker.setMap(map)
      
      // 历史轨迹动画
      function animationMove() {
        AMap.plugin("AMap.MoveAnimation", function () {
          var marker,
            lineArr = [
              [116.478935, 39.997761],
              [116.478939, 39.997825],
              [116.478912, 39.998549],
              [116.478912, 39.998549],
              [116.478998, 39.998555],
              [116.478998, 39.998555],
              [116.479282, 39.99856],
              [116.479658, 39.998528],
              [116.480151, 39.998453],
              [116.480784, 39.998302],
              [116.480784, 39.998302],
              [116.481149, 39.998184],
              [116.481573, 39.997997],
              [116.481863, 39.997846],
              [116.482072, 39.997718],
              [116.482362, 39.997718],
              [116.483633, 39.998935],
              [116.48367, 39.998968],
              [116.484648, 39.999861],
            ]
 
          var map = new AMap.Map("container", {
            resizeEnable: true,
            center: [116.397428, 39.90923],
            zoom: 17,
          })
 
          marker = new AMap.Marker({
            map: map,
            position: [116.478935, 39.997761],
            icon: "https://a.amap.com/jsapi_demos/static/demo-center-v2/car.png",
            offset: new AMap.Pixel(-13, -26),
          })
 
          // 绘制轨迹
          var polyline = new AMap.Polyline({
            map: map,
            path: lineArr,
            showDir: true,
            strokeColor: "#28F", //线颜色
            // strokeOpacity: 1,     //线透明度
            strokeWeight: 6, //线宽
            // strokeStyle: "solid"  //线样式
          })
 
          var passedPolyline = new AMap.Polyline({
            map: map,
            strokeColor: "#AF5", //线颜色
            strokeWeight: 6, //线宽
          })
 
          marker.on("moving", function (e: any) {
            passedPolyline.setPath(e.passedPath)
            map.setCenter(e.target.getPosition(), true)
          })
 
          map.setFitView()
          marker.moveAlong(lineArr, {
            // 每一段的时长
            duration: 500, //可根据实际采集时间间隔设置
            // JSAPI2.0 是否延道路自动设置角度在 moveAlong 里设置
            autoRotation: true,
          })
        })
      }
    })
    .catch((e) => {
      console.log(e)
    })
}
AMapLoader.load({
    "key": "",              // 申请好的Web端开发者Key,首次调用 load 时必填
    "version": "2.0",   // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15
    "plugins": []           // 需要使用的的插件列表,如比例尺'AMap.Scale'等
    "AMapUI": {             // 是否加载 AMapUI,缺省不加载
        "version": '1.1',   // AMapUI 缺省 1.1
        "plugins":[],       // 需要加载的 AMapUI ui插件
    },
    "Loca":{                // 是否加载 Loca, 缺省不加载
        "version": '1.3.2'  // Loca 版本,缺省 1.3.2
    },
}).then(()=>{
    window.AMap.xx;
    window.AMapUI.xx;
    window.Loca.xx
});

已加载插件:fastestmirror、langpacks、product-id、search-disabled-repos、subscription-manager

此系统未注册到授权服务器。您可以使用 subscription-manager 注册。

仓库 epel 在配置中列出了多次。

Repodata 已超过两周未更新。安装 yum-cron?或运行:yum makecache fast 未安装组文件。

可能需要运行:yum groups mark convert(参见 man yum)

确定最快的镜像
可用的环境组:
   最小安装
   计算节点
   基础设施服务器
   文件和打印服务器
   Cinnamon 桌面
   MATE 桌面
   基本 Web 服务器
   虚拟化主机
   带 GUI 的服务器
   GNOME 桌面
   KDE Plasma Workspaces
   开发和创意工作站
可用的组:
   备份客户端
   基本
   Cinnamon
   兼容性库
   控制台互联网工具
   开发工具
   电子邮件服务器
   教育软件
   电子实验室
   Fedora 打包工具
   字体
   通用桌面
   图形管理工具
   图形创建工具
   硬件监控实用程序
   Haskell
   输入法
   互联网应用程序
   KDE 桌面
   LXQt 桌面
   传统 UNIX 兼容性
   MATE
   Milkymist
   网络基础设施服务器
   网络工具
   办公套件和生产力
   性能工具
   科学支持
   安全工具
   智能卡支持
   系统管理
   系统管理工具
   技术写作
   TurboGears 应用程序框架
   Web 服务器
   Web Servlet 引擎
   Xfce



springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_05

image.png

● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2023-08-16 01:44:00 CST; 4 months 21 days ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1306 (sshd)
    Tasks: 4
   Memory: 6.7M
   CGroup: /system.slice/sshd.service
           ├─ 1306 /usr/sbin/sshd -D
           ├─11566 sshd: root@pts/0
           ├─11824 -bash
           └─22367 systemctl status sshd



springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_06

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_oracle_07

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_08

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_oracle_09

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_10

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_11

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_12

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_oracle_13

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_14

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_15

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_16

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_java_17

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_18

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_19

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_20

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_oracle_21

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_spring boot_22

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_23

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_后端_24

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_25

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_oracle_26

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_27

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_28

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_29

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_java_30

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_java_31

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_java_32

image.png

springboot第48集:【思维导图】地图,面向对象,异常,功能代码_数据库_33

image.png


仓库地址:https://github.com/webVueBlog/JavaGuideInterview

标签:springboot,48,导图,image,request,AMap,new,public,png
From: https://blog.51cto.com/u_15303890/9273779

相关文章

  • Springboot上传文件大小限制处理
    今天在开发过程中遇到一个文件上传的问题io.undertow.server.RequestTooBigException:UT000020:Connectionterminatedasrequestwaslargerthan10485760Servlet容器使用的是undertow,看异常信息应该是默认存在10MB的文件大小限制。百度了一下,找到如下配置,问题得以解决,记......
  • SpringBoot自定义注解实现操作日志记录
    1、增加依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>${spring-version}</version>......
  • 为什么很多公司 SpringBoot 项目禁止使用 Tomcat
    为什么很多公司SpringBoot项目禁止使用Tomcat学习改变命运,技术铸就辉煌。大家好,我是銘,全栈开发程序员。前言在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内嵌式的Tomcat。同时,SpringBoot也支持Undertow容器,我们可以很方便的用......
  • springboot拦截器@resource注解注入为null解决方案 拦截适配配置
    springboot拦截器@resource注解注入为null解决方案 拦截适配配置为什么@resource注入为nullinteceptor在springcontext之前加载,注入必然是null解决方案加入注解@Bean,注意需要使用@Configuration,而不是@Component解决在Spring添加拦截器之前先自己创建一下这个SpringBean,这样......
  • springboot项目配置多数据源
    springboot项目配置多数据源//关键:mybatis文件的目录需要区分开来sqlSessionFactoryBean.setMapperLocations(newPathMatchingResourcePatternResolver().getResources("classpath:mybatis.myProjectOne/*.xml"));#从数据库配置,数据库的配置以spring.datasource.myPr......
  • Idea SpringBoot 子模块 加载不到该子模块根目录config下面的配置文件
    IdeaSpringBoot子模块加载不到该子模块根目录config下面的配置文件importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframew......
  • springboot + mybatis plus 全局添加查询字段反引号
    配置文件添加: column-format:"`%s`"mybatis-plus:#启动时是否检查MyBatisXML文件是否存在check-config-location:true#MyBatis原生配置configuration:#字段名称下划线转驼峰命名map-underscore-to-camel-case:trueglobal-config:db-co......
  • SpringBoot中整合ElasticSearch实现增删改查等操作
    场景SpringBoot中整合ElasticSearch快速入门以及踩坑记录:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135599698在上面进行集成的基础上,实现对ES数据的增删改查等操作。注:博客:https://blog.csdn.net/badao_liumang_qizhi实现1、ElastciSearch的对象映射h......
  • npm 安装cnpm 设置淘宝镜像报错 4048
    npmERR!codeEPERMnpmERR!syscallrenamenpmERR!pathD:\programfiles\nodejs\node_global\node_modules\cnpm\node_modules\npm\node_modules.node-gyp.DELETE\node_modules@npmclinpmERR!destD:\programfiles\nodejs\node_global\node_modules\cnp......
  • SpringBoot中整合ElasticSearch快速入门以及踩坑记录
    场景若依前后端分离版手把手教你本地搭建环境并运行项目:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/108465662参考上面搭建项目。ElaticSearchElasticsearch是java开发的,基于Lucene的搜索引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulW......