Springboot项目搭建(1)-用户登录与注册

news2024/11/20 15:05:50

1.引入lombok依赖

 若<dependency>中数据为红,则说明Maven本地仓库里未引用依赖

可在右侧“m”标识中,下载源代码和文档后刷新。

2.统一响应数据Result

在entity文档下创建,名为Result的java类

文件地址:org/example/entity/Result.java

package org.example.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//创建统一响应数据的类
@NoArgsConstructor //创建无参数构造器
@AllArgsConstructor //创建有参数构造器
@Data //配置访问属性的方法(get/set)
public class Result<T>{
    private Integer code; //该属性用于存放响应码
    private String message; //提示信息
    private T data; //响应数据,T表示任意类型
    // 创建一个方法,用于返回操作成功的反应结果,
    // 如:查询个人信息,返回操作成功提示及个人信息数据
    public static <E> Result <E> success(E data){
        return new Result<>(0,"操作成功",data);
    }
    // 创建方法,返回操作成功的响应结果,
    // 如:添加数据,删除数据
    public static Result success(){
        return new Result(0,"操作成功",null);
    }
    //创建方法,返回操作失败的响应结果
    public static Result error(String message){
        return new Result(1,message,null);
    }
}

创建一个方法:

public static <E> Result <E> success(E data){
        return new Result<>(0,"操作成功",data);

  • public 表示方法的访问权限
  • static 静态只被创建一次,配置该方法存放内存中的方法区
  • <E> 方法的返回类型,E表示任意类型
  • result<E>返回类型,是当前类的类型
  • success方法名称
  • (E data)表示参数列表,调用方法时可以通过参数列表向方法传递数据
  • return 方法返回数据关键字
  • new Result<>() 表示创建对象,创建一个Result对象,
  • 创建对象时传入三个数据,分别是状态码,提示信息以及携带的数据

3. 创建文档

4. 数据格式化User

org/example/entity/User.java路径中,

定义了一个用于存储和传输用户信息的Java实体类。

package org.example.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private Integer id;
    private String username;
    private String password;
    private String email;
    private String nickname;
    private String userPic;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

5. 数据库交互UserMapper

声明当前文件为映射文件,与数据库进行数据交互的文件

这个 UserMapper 接口提供了两个基本的数据库操作:添加用户和根据用户名查询用户。

通过MyBatis框架,这些方法可以被Spring框架自动调用,从而实现数据的持久化操作。

这种方式使得数据库操作更加简洁和面向对象。

package org.example.mapper;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.example.entity.User;
@Mapper
public interface UserMapper {
    //添加用户信息
    @Insert("insert into user(username,password,create_time,update_time)" +
    "values(#{username},#{password},now(),now())")
    void insertUser(String username, String password);
    //根据用户名查询用户信息
    @Select("select * from user where username=#{username}")
    User selectUserByUsername(String username);
}

6.  加密和密码验证

6.1 数据加密 Md5Util

org/example/utils/Md5Util.java中,定义了一个工具类 Md5Util

  • 生成MD5哈希值:将输入的字符串转换为MD5哈希值。
  • 验证密码:检查输入的密码是否与给定的MD5哈希值相同。
  • 将字节数组转换为十六进制字符串:用于表示MD5哈希值的结果。

以下代码来源于网络,有志者也可自行书写 。

package org.example.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Md5Util {
    /**
     * 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合
     */
    protected static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
    protected static MessageDigest messagedigest = null;
    static {
        try {
            messagedigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsaex) {
            System.err.println(Md5Util.class.getName() + "初始化失败,MessageDigest不支持MD5Util。");
            nsaex.printStackTrace();
        }
    }
    /**
     * 生成字符串的md5校验值
     *
     * @param s
     * @return
     */
    public static String getMD5String(String s) {
        return getMD5String(s.getBytes());
    }

    /**
     * 判断字符串的md5校验码是否与一个已知的md5码相匹配
     *
     * @param password  要校验的字符串
     * @param md5PwdStr 已知的md5校验码
     * @return
     */
    public static boolean checkPassword(String password, String md5PwdStr) {
        String s = getMD5String(password);
        return s.equals(md5PwdStr);
    }
    public static String getMD5String(byte[] bytes) {
        messagedigest.update(bytes);
        return bufferToHex(messagedigest.digest());
    }
    private static String bufferToHex(byte bytes[]) {
        return bufferToHex(bytes, 0, bytes.length);
    }

    private static String bufferToHex(byte bytes[], int m, int n) {
        StringBuffer stringbuffer = new StringBuffer(2 * n);
        int k = m + n;
        for (int l = m; l < k; l++) {
            appendHexPair(bytes[l], stringbuffer);
        }
        return stringbuffer.toString();
    }
    private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
        char c0 = hexDigits[(bt & 0xf0) >> 4];// 取字节中高 4 位的数字转换, >>>
        // 为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
        char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
        stringbuffer.append(c0);
        stringbuffer.append(c1);
    }
}

6.2 密文查看与验证 Md5Test

首先在pom.xml中:导入Spring提供的测试工具

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

 而后创建新的测试文件:src/test/java/Md5Test.java

可查看“123456(为例)”转码后的结果。

import org.example.utils.Md5Util;
import org.junit.jupiter.api.Test;
import java.sql.SQLOutput;
public class Md5Test {
    @Test
    public void test(){
        String md5Password = Md5Util.getMD5String("123456");
        System.out.println(md5Password);
    }
}

7. 定义用户基操规UserService

7.1 创建接口

文件地址:org/example/service/UserService.java

package org.example.service;
import org.example.entity.User;
public interface UserService {
    //根据用户名查询用户信息
    User findUserByUsername(String username);
    //注册
    void register(String username, String password);
}

7.2 实现接口<lmpl>

文件地址:org/example/service/impl/UserServiceImpl.java

补充UserService.java的具体操作过程

package org.example.service.impl;
import org.example.entity.User;
import org.example.mapper.UserMapper;
import org.example.service.UserService;
import org.example.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
//声明当前类为业务类,在业务类下可以调用事务相关配置
@Service
public class UserServiceImpl implements UserService {
    //调用UserMapper操作数据库
    @Autowired
    @SuppressWarnings("all") //压制警告
    private UserMapper userMapper;
    @Override
    public User findUserByUsername(String username) {
        return userMapper.selectUserByUsername(username);
    }
    @Override
    public void register(String username, String password) {
        //加密
        String md5String = Md5Util.getMD5String(password);
        userMapper.insertUser(username, md5String);
    }
}

小结:UserServiceImplUserService 接口的具体实现,它提供了接口中声明的方法的实际业务逻辑,并通过依赖注入使用 UserMapper 与数据库进行交互。这种设计模式使得代码结构清晰,易于维护和扩展。

8. 注册UserController

首先在pom.xml中添加:用于请求参数验证(校验)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

org/example/controller/UserController.java中建立一个UserController 作为表现层,

它的Spring Boot控制器类,负责处理与用户相关的HTTP请求和响应

package org.example.controller;
import org.example.entity.Result;
import org.example.entity.User;
import org.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController //声明该类是一个控制器类,用于浏览器与该类数据交互
@RequestMapping("/user") //声明该类的访问地址
@Validated //声明该类中的方法支持参数校验
public class UserController {
    @Autowired
    @SuppressWarnings("all")
    private UserService userService;
    //注册
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password) {
        //查询注册的用户名是否存在
        User user = userService.findUserByUsername(username);
        //判断查询的用户是否存在,如果不存在则返回空
        if (user == null) {
            //该用户名可以使用
            userService.register(username, password);
            //返回操作成功
            return Result.success();
        }else{
            //该用户名不允许使用
            return Result.error("用户名已被占用");
        }
    }

@Pattern(regexp = "^\\S{5,16}$")String username:

  • @Pattern:表示该参数使用校验规则,regexp表示使用正则表达式的校验规则
  •  ^:表示正则表达式的开始
  •  $:表示正则表达式的结束
  •  \\:转译字符,转译后为\
  •  \S:表示任意字符
  •  {5,16}:字符的位数在5~16间

实验结果:

9. 全局异常类GlobalExceptionHandle

创建org/example/exception/GlobalExceptionHandle.java文件,统一处理异常报告。

package org.example.exception;
import org.example.entity.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice
public class GlobalExceptionHandle {
    //统一返回异常信息
    @ExceptionHandler(value = Exception.class)
    public Result handleException(Exception e) {
        return Result.error(e.getMessage());
    }
}

10. 登录UserController

org/example/controller/UserController.java中的注册代码下方,续写登录代码。

循环逻辑:如果上面的if体未执行,则表示该用户存在,由于查询的是用户所有信息,包含数据库中的密码,下面的判断为判断前端传入的密码,与数据库的密码是否相等

package org.example.controller;
import jakarta.validation.constraints.Pattern;
import org.example.entity.Result;
import org.example.entity.User;
import org.example.service.UserService;
import org.example.utils.JwtUtil;
import org.example.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
@Validated
public class UserController {
    @Autowired
    @SuppressWarnings("all")
    private UserService userService;
    //注册
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password) {...}
    //登录
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password){
        //根据用户名查询用户信息
        User loginUser = userService.findUserByUsername(username);
        //如果没有用户信息则返回登录失败提示
        if(loginUser == null){
            return Result.error("用户名或密码错误");
        }
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())){
            return Result.success("登录成功");
        }
        return Result.error("登录失败,用户名或密码错误");
    }
}

实验结果:

11. JWT令牌

11.1 认识JWT令牌

全称:JSON Web Token,由Header、Payload、Signature三部分组成:

Header(头):记录令牌类型,参数算法等;

Payload(荷载):携带用户信息等一些自定义的默认信息;

Signature(签名):防止信息被篡改,而设定的算法逻辑密文。

11.2 引入令牌 JwtUtil

添加至org/example/utils/JwtUtil.java

package org.example.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtil {
    private static final String KEY = "usermessage";
	//接收业务数据,生成token并返回
    public static String genToken(Map<String, Object> claims) {
        return JWT.create()
                .withClaim("claims", claims)
                .withExpiresAt(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 12))
                .sign(Algorithm.HMAC256(KEY));
    }
	//接收token,验证token,并返回业务数据
    public static Map<String, Object> parseToken(String token) {
        return JWT.require(Algorithm.HMAC256(KEY))
                .build()
                .verify(token)
                .getClaim("claims")
                .asMap();
    }
}

引入后,在pom.xml中添加:jwt依赖(令牌技术)

<dependency>
    <groupId>com.auth0</groupId>
    <artifactId>java-jwt</artifactId>
    <version>4.4.0</version>
</dependency>

11.3 测试令牌 JwtTest

在test/java下,建立src/test/java/JwtTest.java测试文件:

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import org.junit.jupiter.api.Test;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtTest {

    @Test
    public void testJwt() {
        //创建容器(集合),用于存放令牌(用户)数据
        Map<String,Object> claims = new HashMap<>();
        claims.put("id",1);
        claims.put("name","Hela");
        //生成Jwt
        String token = JWT.create() //创建令牌
                .withClaim("userwagaga",claims) //载荷数据
                .withExpiresAt(new Date(System.currentTimeMillis()*1000*60*60*12)) //过期时间(生命周期)
                .sign(Algorithm.HMAC256("usermessage")); //指定算法,配置加密密钥
        System.out.println(token);
    }
    @Test
    public void testParse(){
        String token ="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." +
                "eyJ1c2Vyd2FnYWdhIjp7Im5hbWUiOiJIZWxhIiwiaWQiOjF9LCJleHAiOjEwMzU0MTc4NDQ2MDY1OTN9." +
                "tbhdeg5kp1u8Hp7NBxT8ALSaAW9-iBLasj_AdIBAYpQ";
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("usermessage")).build();
        DecodedJWT decodedJWT= jwtVerifier.verify(token);
        Map<String, Claim> claimMap = decodedJWT.getClaims();
        System.out.println(claimMap.get("userwagaga"));
    }
}

11.4 将令牌补充至登录代码中

import java.util.HashMap;
import java.util.Map;

@PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password){
        //根据用户名查询用户信息
        User loginUser = userService.findUserByUsername(username);
        //如果没有用户信息则返回登录失败提示
        if(loginUser == null){
            return Result.error("用户名或密码错误");
        }
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())){
            Map<String,Object> claims = new HashMap<>();// 存放用户令牌数据的容器(集合)
            claims.put("id",loginUser.getId());
            claims.put("username",loginUser.getUsername());
            claims.put("password",loginUser.getPassword());
            String token = JwtUtil.genToken(claims);
            return Result.success(token);
        }
        return Result.error("登录失败,用户名或密码错误");
    }

此阶段UserController完整代码:

package org.example.controller;

import jakarta.validation.constraints.Pattern;
import org.example.entity.Result;
import org.example.entity.User;
import org.example.service.UserService;
import org.example.utils.JwtUtil;
import org.example.utils.Md5Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

@RestController //声明该类是一个控制器类,用于浏览器与该类数据交互
@RequestMapping("/user") //声明该类的访问地址
@Validated //声明该类中的方法支持参数校验
public class UserController {
    @Autowired
    @SuppressWarnings("all")
    private UserService userService;
    //注册
    @PostMapping("/register")
    public Result register(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password) {
        //查询注册的用户名是否存在
        User user = userService.findUserByUsername(username);
        //判断查询的用户是否存在,如果不存在则返回空
        if (user == null) {
            //该用户名可以使用
            userService.register(username, password);
            //返回操作成功
            return Result.success();
        }else{
            //该用户名不允许使用
            return Result.error("用户名已被占用");
        }
    }
    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp = "^\\S{5,16}$")String username, @Pattern(regexp = "^\\S{5,16}$")String password){
        //根据用户名查询用户信息
        User loginUser = userService.findUserByUsername(username);
        //如果没有用户信息则返回登录失败提示
        if(loginUser == null){
            return Result.error("用户名或密码错误");
        }
        if (Md5Util.getMD5String(password).equals(loginUser.getPassword())){
            Map<String,Object> claims = new HashMap<>();// 存放用户令牌数据的容器(集合)
            claims.put("id",loginUser.getId());
            claims.put("username",loginUser.getUsername());
            claims.put("password",loginUser.getPassword());
            String token = JwtUtil.genToken(claims);
            return Result.success(token);
        }
        return Result.error("登录失败,用户名或密码错误");
    }
}

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

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

相关文章

用go语言后端开发速查

文章目录 一、发送请求和接收请求示例1.1 发送请求1.2 接收请求 二、发送form-data格式的数据示例 用go语言发送请求和接收请求的快速参考 一、发送请求和接收请求示例 1.1 发送请求 package mainimport ("bytes""encoding/json""fmt""ne…

【视频讲解】Python深度神经网络DNNs-K-Means(K-均值)聚类方法在MNIST等数据可视化对比分析...

全文链接&#xff1a;https://tecdat.cn/?p38289 分析师&#xff1a;Cucu Sun 近年来&#xff0c;由于诸如自动编码器等深度神经网络&#xff08;DNN&#xff09;的高表示能力&#xff0c;深度聚类方法发展迅速。其核心思想是表示学习和聚类可以相互促进&#xff1a;好的表示会…

可视化展示深度学习模型中模块的详细流程图:结合GraphvizOnline

一、在GPT中输入指令 根据以下Python模块代码&#xff0c;自动生成对应的Graphviz流程图代码&#xff0c;并保持图表简洁清晰&#xff0c;仅展示主流程&#xff1a; <模块代码>1. 以YOLOv9中ADown下采样为例&#xff1a; 根据以下Python模块代码&#xff0c;自动生成对…

强大的正则表达式——Hard

由前两篇文章《Easy》中提到过的&#xff1a; 还是先相信一下AI&#xff0c;让AI写个生成满足难度3的正则表达式的python代码&#xff0c;但还是出错了&#xff0c;还是不能什么都指望AI 了解了一下相关知识&#xff0c;CRC本质上是多项式除法&#xff0c;所以同样可以得到对应…

Xilinx 7 系列 FPGA的各引脚外围电路接法

Xilinx 7系列FPGA的外围电路接法涉及到多个方面&#xff0c;包括电源引脚、时钟输入引脚、FPGA配置引脚、JTAG调试引脚&#xff0c;以及其他辅助引脚。 本文大部分内容由ug475, Product Specification——7 Series FPGAs Packaging and Pinout《7系列FPGA的封装与引脚》整理汇…

IDM扩展添加到Edge浏览器

IDM扩展添加到Edge浏览器 一般情况下&#xff0c;当安装IDM软件后&#xff0c;该软件将会自动将IDM Integration Module浏览器扩展安装到Edge浏览器上&#xff0c;但在某些情况下&#xff0c;需要我们手动安装&#xff0c;以下为手动安装步骤 手动安装IDM扩展到Edge浏览器 打…

使用OpenUI智能生成专业级网页UI实现远程高效前端开发新手指南

文章目录 前言1. 本地部署Open UI1.1 安装Git、Python、pip1.2 安装Open UI 2. 本地访问Open UI3. 安装Cpolar内网穿透4. 实现公网访问Open UI5. 固定Open UI 公网地址 前言 今天给大家带来一篇非常实用的技术分享&#xff0c;介绍如何在Windows系统本地部署OpenUI&#xff0c…

Vue3 虚拟列表组件库 virtual-list-vue3 的使用

Vue3 虚拟列表组件库 virtual-list-vue3 的基本使用 分享个人写的一个基于 Vue3 的虚拟列表组件库&#xff0c;欢迎各位来进行使用与给予一些更好的建议&#x1f60a; 概述&#xff1a;该组件组件库用于提供虚拟化列表能力的组件&#xff0c;用于解决展示大量数据渲染时首屏渲…

数据库中库的操作

数据库中库的操作 查看数据库语法 创建数据库语法⽰例创建⼀个名为test班级号的数据库⾃定义⼀个数据库名&#xff0c;如果数据库不存则创建重新运⾏上⾯的语句观察现象查看警告信息 字符集编码和校验(排序)规则查看数据库⽀持的字符集编码查看数据库⽀持的排序规则不同的字串集…

【MySQL-3】表的约束

目录 1. 整体学习的思维导图 2. 非空约束 3. default约束 4. No Null和default约束 5. 列描述 comment 6. Zerofill 7. 主键 primary key 复合主键 8. 自增长 auto_increment 9. 唯一键 10. 外键 11. 实现综合案例 1. 整体学习的思维导图 2. 非空约束 正如该标题一…

C++设计模式行为模式———迭代器模式

文章目录 一、引言二、迭代器模式三、总结 一、引言 迭代器模式是一种行为设计模式&#xff0c; 让你能在不暴露集合底层表现形式 &#xff08;列表、 栈和树等&#xff09; 的情况下遍历集合中所有的元素。C标准库中内置了很多容器并提供了合适的迭代器&#xff0c;尽管我们不…

自存 sql常见语句和实际应用

关于连表 查询两个表 SELECT * FROM study_article JOIN study_article_review 查询的就是两个表相乘&#xff0c;结果为两个表的笛卡尔积 相这样 这种并不是我们想要的结果 通常会添加一些查询条件 SELECT * FROM study_articleJOIN study_article_review ON study_art…

为自动驾驶提供高分辨率卫星图像数据,实例级标注数据集OpenSatMap

对于交通控制、自动驾驶等任务来说&#xff0c;大规模的高分辨率与更新频率的地图至关重要。现有的地图构建方法多依赖地面采集数据&#xff0c;这种方法的精度固然较高&#xff0c;但在覆盖范围、更新频率却存在限制&#xff0c;测绘成本也相当高昂。 相比之下&#xff0c;使…

基于STM32的智能语音识别饮水机系统设计

功能描述 1、给饮水机设定称呼&#xff0c;喊出称呼&#xff0c;饮水机回答&#xff1a;我在 2、语音进行加热功能&#xff0c;说&#xff1a;请加热&#xff0c;加热片运行 3、饮水机水位检测&#xff0c;低于阈值播报“水量少&#xff0c;请换水” 4、检测饮水机水温&#xf…

百度世界2024精选公开课:基于地图智能体的导航出行AI应用创新实践

11月12日&#xff0c;“百度世界2024”在上海世博中心举行。百度创始人、董事长兼首席执行官李彦宏发表了主题为《应用来了》的演讲。 百度地图也为大家带来了干货满满、精彩纷呈的智能体公开课&#xff0c;由百度地图开放平台技术架构师江畅分享《地图智能体&#xff1a;导航…

sourceInsight常用设置和功能汇总(不断更新)(RGB、高亮、全路径、鼠标、宏、TODO高亮)

文章目录 必开配置设置背景颜色护眼的RGB值&#xff1f;sourceInsight4.0中如何设置选中某个单词以后自动高亮的功能&#xff1f;sourceinsight中输入设置显示全路径&#xff1f; 常用sourceInsight4.0中文乱码怎么解决&#xff0c;注意事项是什么&#xff1f;如何绑定鼠标中键…

[JavaWeb] 尚硅谷JavaWeb课程笔记

1 Tomcat服务器 Tomcat目录结构 bin&#xff1a;该目录下存放的是二进制可执行文件&#xff0c;如果是安装版&#xff0c;那么这个目录下会有两个exe文件&#xff1a;tomcat10.exe、tomcat10w.exe&#xff0c;前者是在控制台下启动Tomcat&#xff0c;后者是弹出GUI窗口启动To…

uniapp开发微信小程序笔记2-开发静态页面(新建页面、内置组件、设置编译模式、样式、SCSS的使用)

前言&#xff1a;本文从新建页面、认识内置组件、设置编译模式、样式、SCSS的使用来逐步形成对微信小程序开发结构的认识 一、新建页面 pages就是放页面代码的文件夹&#xff0c;点击新建页面就可以自动新增页面&#xff0c;并且可以看到pages.json里面也会自动添加该页面的路…

Linux插件zsh(oh-my-zsh)

一、oh-my-zsh基本介绍 oh-my-zsh&#xff1a; https://github.com/ohmyzsh/ohmyzshhttps://github.com/ohmyzsh/ohmyzsh 注意&#xff1a;需要先安装zsh命令&#xff0c;才能安装oh-my-zsh&#xff0c;先测试是否安装了zsh rootserver:/opt # zsh --version zsh 5.8 (x86_6…

第7章硬件测试-7.4 专业实验

7.4 专业实验 7.4.1 EMC测试EMS的测试项目如下。1.静电放电抗扰度&#xff08;ESD&#xff09;2.辐射电磁场&#xff08;80 MHz~1000 MHz&#xff09;抗扰度&#xff08;RS&#xff09;3.电快速瞬变/脉冲群抗扰度4.浪涌&#xff08;雷击&#xff09;抗扰度5.注入电流&#xff0…