当前位置: 首页 > news >正文

小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统

前言

现在已经学习了很多与Java相关的知识,但是迟迟没有进行一个完整的实践(之前这个项目开发到一半,很多东西没学搁置了,同时原先的项目中也有很多的问题),所以现在准备从零开始做一个基于SpringBoot+Vue的大学生家教平台,打算边写项目的过程中写一个系列博客用于记录,故有了这篇文章。这个项目是从零开始做起,预计周期一个月,希望大家能多多支持,那样我就更多的动力能进行下去,同时大家也可以提出建议,我会积极采纳合理建议的!让我们一起见证一个从零开始的项目开发过程!

项目相关说明

技术栈

后端:SpringBoot、MyBatis-Plus、MySQL、Redis、SpringSecurity、Swagger等

前端:Vue

主要功能

1.用户注册与登录:提供安全的用户注册和登录机制,支持不同角色(家长、学生、教师)的账户管理。 

2.家教信息管理:家长可以发布家教信息,教师可以接家教,管理员能对家教信息进行管理等。

3.家教沟通:在课后教师可以线上布置作业、与家长交流等,同时家长在学生完成作业后可以进行上传、查看完成结果、对教师进行评价等。

4.信息发布与查询:在这个系统中,所有用户可以查看管理员发布的系统公告,同时所有人都能对系统进行反馈保证系统在不断修改的过程中变得更好~

项目开发

DAY 1任务 创建项目并进行一些依赖配置

一、创建SpringBoot项目

首先创建一个普通的SpringBoot项目

添加几个普通的依赖,后面其他依赖可以在pom.xml中进行添加

创建完项目后我们可以写一个简单controller进行测试

如图,我创建了一个简单Hellocontroller输出信息

package com.example.familyeducation.controller;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@RequestMapping("/hello")public String hello(){return "hello";}
}

接着去application.properties中修改一下端口保证不会冲突

好,现在运行项目,并在浏览器中输入localhost:8889/hello进行访问,输出hello说明SpringBoot项目创建成功,没有什么问题

二、初步配置SpringSecurity

这个SpringSecurity的配置是跟着B站一个播放量最多的视频学的,推荐大家也可以去看看哦~

我们先在pom.xml文件中添加上依赖,同时我们可以去右侧maven中进行检查依赖是否添加成功

添加完依赖启动项目,继续访问localhost:8889/hello,界面跳转至SpringSecurity的默认登录界面

现在我们使用SpringSecurity的账号密码进行登录,后面会进行修改

登录名写test,密码去IDEA的输出框中查找,接着点击Sign in,界面成功跳转到hello中

接着我们继续配置Redis和一些登录相关的东西(fastjson、jwt、序列化器等)

我们先添加一下redis、fastjson、jwt的依赖同时去右侧maven进行检查

同时添加以下代码

package com.example.familyeducation.config;import com.example.familyeducation.utils.FastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/*** @author 小菜* @date  2024/11/4* @description Redis序列化配置**/
@Configuration
public class RedisConfig {@Bean@SuppressWarnings(value = { "unchecked", "rawtypes" })//注解:用于告诉编译器在检查代码时忽略特定类型的警告public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory){RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setConnectionFactory(connectionFactory);FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);// 使用StringRedisSerializer来序列化和反序列化redis的key值template.setKeySerializer(new StringRedisSerializer());template.setValueSerializer(serializer);// Hash的key也采用StringRedisSerializer的序列化方式template.setHashKeySerializer(new StringRedisSerializer());template.setHashValueSerializer(serializer);template.afterPropertiesSet();return template;}
}
package com.example.familyeducation.utils;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import com.alibaba.fastjson.parser.ParserConfig;
import org.springframework.util.Assert;
import java.nio.charset.Charset;/*** Redis使用FastJson序列化*/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T>
{public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");private Class<T> clazz;static{ParserConfig.getGlobalInstance().setAutoTypeSupport(true);}public FastJsonRedisSerializer(Class<T> clazz){super();this.clazz = clazz;}@Overridepublic byte[] serialize(T t) throws SerializationException{if (t == null){return new byte[0];}return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);}@Overridepublic T deserialize(byte[] bytes) throws SerializationException{if (bytes == null || bytes.length <= 0){return null;}String str = new String(bytes, DEFAULT_CHARSET);return JSON.parseObject(str, clazz);}protected JavaType getJavaType(Class<?> clazz){return TypeFactory.defaultInstance().constructType(clazz);}
}
package com.example.familyeducation.utils;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;import java.util.*;
import java.util.concurrent.TimeUnit;
/*** @author 小菜* @date  2024/11/4* @description Redis工具类,可以快速进行Redis操作**/@SuppressWarnings(value = { "unchecked", "rawtypes" })
@Component
public class RedisCache
{@Autowiredpublic RedisTemplate redisTemplate;/*** 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值*/public <T> void setCacheObject(final String key, final T value){redisTemplate.opsForValue().set(key, value);}/*** 缓存基本的对象,Integer、String、实体类等** @param key 缓存的键值* @param value 缓存的值* @param timeout 时间* @param timeUnit 时间颗粒度*/public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){redisTemplate.opsForValue().set(key, value, timeout, timeUnit);}/*** 设置有效时间** @param key Redis键* @param timeout 超时时间* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout){return expire(key, timeout, TimeUnit.SECONDS);}/*** 设置有效时间** @param key Redis键* @param timeout 超时时间* @param unit 时间单位* @return true=设置成功;false=设置失败*/public boolean expire(final String key, final long timeout, final TimeUnit unit){return redisTemplate.expire(key, timeout, unit);}/*** 获得缓存的基本对象。** @param key 缓存键值* @return 缓存键值对应的数据*/public <T> T getCacheObject(final String key){ValueOperations<String, T> operation = redisTemplate.opsForValue();return operation.get(key);}/*** 删除单个对象** @param key*/public boolean deleteObject(final String key){return redisTemplate.delete(key);}/*** 删除集合对象** @param collection 多个对象* @return*/public long deleteObject(final Collection collection){return redisTemplate.delete(collection);}/*** 缓存List数据** @param key 缓存的键值* @param dataList 待缓存的List数据* @return 缓存的对象*/public <T> long setCacheList(final String key, final List<T> dataList){Long count = redisTemplate.opsForList().rightPushAll(key, dataList);return count == null ? 0 : count;}/*** 获得缓存的list对象** @param key 缓存的键值* @return 缓存键值对应的数据*/public <T> List<T> getCacheList(final String key){return redisTemplate.opsForList().range(key, 0, -1);}/*** 缓存Set** @param key 缓存键值* @param dataSet 缓存的数据* @return 缓存数据的对象*/public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet){BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);Iterator<T> it = dataSet.iterator();while (it.hasNext()){setOperation.add(it.next());}return setOperation;}/*** 获得缓存的set** @param key* @return*/public <T> Set<T> getCacheSet(final String key){return redisTemplate.opsForSet().members(key);}/*** 缓存Map** @param key* @param dataMap*/public <T> void setCacheMap(final String key, final Map<String, T> dataMap){if (dataMap != null) {redisTemplate.opsForHash().putAll(key, dataMap);}}/*** 获得缓存的Map** @param key* @return*/public <T> Map<String, T> getCacheMap(final String key){return redisTemplate.opsForHash().entries(key);}/*** 往Hash中存入数据** @param key Redis键* @param hKey Hash键* @param value 值*/public <T> void setCacheMapValue(final String key, final String hKey, final T value){redisTemplate.opsForHash().put(key, hKey, value);}/*** 获取Hash中的数据** @param key Redis键* @param hKey Hash键* @return Hash中的对象*/public <T> T getCacheMapValue(final String key, final String hKey){HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();return opsForHash.get(key, hKey);}/*** 删除Hash中的数据** @param key* @param hkey*/public void delCacheMapValue(final String key, final String hkey){HashOperations hashOperations = redisTemplate.opsForHash();hashOperations.delete(key, hkey);}/*** 获取多个Hash中的数据** @param key Redis键* @param hKeys Hash键集合* @return Hash对象集合*/public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys){return redisTemplate.opsForHash().multiGet(key, hKeys);}/*** 获得缓存的基本对象列表** @param pattern 字符串前缀* @return 对象列表*/public Collection<String> keys(final String pattern){return redisTemplate.keys(pattern);}
}
package com.example.familyeducation.utils;import com.fasterxml.jackson.annotation.JsonInclude;/*** @author 小菜* @date  2024/11/4* @description 结果封装类**/
//注解:减少数据冗余,当你将 ResponseResult 对象序列化为 JSON 时,只有当对象的属性不为 null 时,才会包含在生成的 JSON 中
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> {/*** 状态码*/private Integer code;/*** 提示信息,如果有错误时,前端可以获取该字段进行提示*/private String msg;/*** 查询到的结果数据,*/private T data;public ResponseResult(Integer code, String msg) {this.code = code;this.msg = msg;}public ResponseResult(Integer code, T data) {this.code = code;this.data = data;}public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}public ResponseResult(Integer code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}
}
package com.example.familyeducation.utils;import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class WebUtils
{/*** 将字符串渲染到客户端** @param response 渲染对象* @param string 待渲染的字符串* @return null*/public static String renderString(HttpServletResponse response, String string) {try{response.setStatus(200);response.setContentType("application/json");response.setCharacterEncoding("utf-8");response.getWriter().print(string);}catch (IOException e){e.printStackTrace();}return null;}
}

由于我们是要去数据库中进行用户账号密码的匹配登录,所以我们还要添加一下Mybatis-Plus和Mysql驱动器

然后去application.properties中配置一下Mysql的相关信息

都配置完之后我们就可以进行测试了

先添加一下实体类和mapper接口信息,我之前的项目中是直接将用户分成了三个表,又使用视图将三个表连接起来,后面出现了很多问题,后续也会进行全部修改,这里先进行演示

package com.example.familyeducation.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.io.Serializable;@Data
@TableName(value = "user_view")
public class User implements Serializable {//因为这个类要存数据到Redis中,所以要进行序列化操作,继承Serializableprivate static final long serialVersionUID = 1L;private Integer userId;private String userPhone;private String userPassword;private String userName;private String userPicture;private String userRole;
}
package com.example.familyeducation.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.familyeducation.entity.User;public interface UserMapper extends BaseMapper<User> {
}

编写测试类进行测试,成功得到视图中的所有用户信息,说明我们的Mysql和Mybatis-Plus配置地都没有问题

这里运行过程中出现了一个小问题,好像是MyBatis-Plus和SpringBoot的版本冲突引起的问题,将SpringBoot版本变为2.7.16解决

同时运行还报了一个错,是密码加密存储的问题,我们要添加一个BCryptPasswordEncoder来将密码进行加密存储

package com.example.familyeducation.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}}

然后我们编写一个测试类输出加密后的密码并添加到数据库中,不然登录的时候会显示密码不是BCryptPassword报错

package com.example.familyeducation.config;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.security.crypto.password.PasswordEncoder;/*** @ClassDescription:* @Author:小菜* @Create:2024/11/4 19:20**/
@SpringBootTest
public class PasswordEncoderTest {@Autowiredprivate PasswordEncoder passwordEncoder;@Testpublic void testPassword(){String rawPassword = "123456"; // 用户输入的明文密码String encodedPassword = passwordEncoder.encode(rawPassword);System.out.println(encodedPassword);}}
package com.example.familyeducation.service.impl;import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.familyeducation.entity.LoginUser;
import com.example.familyeducation.entity.User;
import com.example.familyeducation.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;import java.util.Objects;/*** @ClassDescription:* @Author:小菜* @Create:2024/11/4 19:06**///这里继承的是security中的一个默认接口,重写其中的查询用户方法
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Autowiredprivate UserMapper userMapper;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {//根据用户名查询用户信息LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();wrapper.eq(User::getUserName,username);User user = userMapper.selectOne(wrapper);//如果查询不到数据就通过抛出异常来给出提示if(Objects.isNull(user)){throw new RuntimeException("用户名或密码错误");}//TODO 根据用户查询权限信息 添加到LoginUser中//封装成UserDetails对象返回return new LoginUser(user);}
}

最后我们重启项目,输入我们数据库中视图的对应数据

成功登录!

总结

到此为止,今天的项目大概就进行到这里,我们已经创建了一个最基本的SpringBoot项目并配置了一些组件,但是原先的数据库中有很大问题,需要返工。。。

那今天就这样,先去改改数据库,我们下篇再见!

相关文章:

小菜家教平台:基于SpringBoot+Vue打造一站式学习管理系统

前言 现在已经学习了很多与Java相关的知识&#xff0c;但是迟迟没有进行一个完整的实践&#xff08;之前这个项目开发到一半&#xff0c;很多东西没学搁置了&#xff0c;同时原先的项目中也有很多的问题&#xff09;&#xff0c;所以现在准备从零开始做一个基于SpringBootVue的…...

网络自动化03:简单解释send_config_set方法并举例

目录 拓扑图设备信息 netmiko涉及方法send_config_set()方法的简单示例代码输出结果代码解释导入模块配置信息config_device_interface_description 函数主程序块总结 send_config_set方法参数&#xff1a;1. enter_config_mode2. config_commands3. enter_config_mode4. error…...

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…...

计算机毕业设计Hadoop+PySpark深度学习游戏推荐系统 游戏可视化 游戏数据分析 游戏爬虫 Scrapy 机器学习 人工智能 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

AI开发-三方库-torch-torchvision

1 需求 数据集&#xff1a;torchvision.datasets torchvision.datasets.MNIST数据变换&#xff1a;torchvision.transforms torchvision.transforms.Composetorchvision.transforms.ToTensortorchvision.transforms.Normalize模型&#xff1a;torchvision.models可视化工具&…...

解析 MySQL 数据库容量统计、存储限制与优化技巧

管理 MySQL 数据库时&#xff0c;了解数据库中的数据量和存储占用情况是非常重要的&#xff0c;尤其是在面对大规模数据时。无论是为了优化数据库性能&#xff0c;还是为了进行容量规划&#xff0c;准确地统计数据库的容量可以帮助我们做出更好的决策。mysql的客户端工具是Navi…...

智能工厂的软件设计 思维进阶与数学程序

本文要点 讨论 “智能工厂的软件设计”中的“数学程序”。 这里 “数学程序” 是指能“格物致知”来理解“相续”一词。 完整的表述是&#xff1a; 思想素养提升的 思维进阶法&#xff08;三种 数学程序 &#xff1a; 格物致知 &#xff09;之思维导图&#xff1a; 二叉树及其…...

技术速递|GitHub Copilot upgrade assistant for Java 技术预览发布!

作者&#xff1a;Nick Zhu - Senior Program Manager 排版&#xff1a;Alan Wang 随着人工智能和大型语言模型&#xff08;LLMs&#xff09;的不断发展&#xff0c;Agent&#xff08;“智能代理”&#xff09;和智能代理化工作流程正在迅速成为AI领域的下一个前沿。这些自主系统…...

淘宝有哪些API是用来获取商品列表的?(商品id列表)

淘宝商品详情接口item_get是通过商品id或者商品链接来获取商品详情数据的&#xff0c;但是不少客户是没有商品id的&#xff0c;这时需要通过接口来拿到商品id。 可以获取商品id的API有&#xff1a; item_search 通过关键字搜索商品列表 item_search_shop 获取店铺所有商品列…...

D59【python 接口自动化学习】- python基础之异常

day59 捕获异常常见问题 学习日期&#xff1a;20241105 学习目标&#xff1a;异常 -- 75 避坑指南&#xff1a;编写捕获异常程序时经常出现的问题 学习笔记&#xff1a; 捕获位置设置不当 设置范围不当 捕获处理设置不当 嵌套try-except语法错误 总结 位置&#xff0c;范围…...

解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析

解决 Spring 异步处理中的 JDK 动态代理问题及相关错误分析 遇到的问题&#xff1a; 在使用 Spring 的 Async 注解开启异步处理时&#xff0c;遇到以下错误&#xff1a; The bean ServiceImplChannel could not be injected as a com.wn.order.pay.recharge.controller.Serv…...

从xss到任意文件读取

xss一直是一种非常常见且具有威胁性的攻击方式。然而&#xff0c;除了可能导致用户受到恶意脚本的攻击外&#xff0c;xss在特定条件下还会造成ssrf和文件读取&#xff0c;本文主要讲述在一次漏洞挖掘过程中从xss到文件读取的过程&#xff0c;以及其造成的成因。 0x01 前言 xss一…...

nuiapp vue3 uni-ui uni.uploadFile 图片上传

<div style"position: relative;margin-top: 0.8em;"> <div style"position: absolute;left: 1.5em;top: 2em;">施工图片</div> <div style"position: absolute; left: 7em;top: 0em;right: 0em;bottom…...

【计算机科学】位运算:揭开二进制世界的奥秘

位运算是计算机运算的一种基础操作&#xff0c;直接作用于数据的二进制位&#xff08;bit&#xff09;&#xff0c;在计算机中具有极高的效率。无论是编写高效算法&#xff0c;还是进行底层开发&#xff0c;位运算都扮演着重要角色。本文将从位运算的起源、常见操作符、应用场景…...

弹性裸金属服务器和传统裸金属服务器有什么区别?

弹性裸金属服务器是一种结合了传统裸金属服务器和云计算资源两种特点的服务器&#xff0c;是一种云计算服务&#xff0c;下面我们就来了解一下弹性裸金属服务器和传统裸金属服务器之间有什么区别吧&#xff01; 弹性裸金属服务器能够支持企业快速部署新的硬件和软件系统&#x…...

shodan(五)连接Mongodb数据库Jenkinsorg、net、查看waf命令

声明&#xff1a;学习素材来自b站up【泷羽Sec】&#xff0c;侵删&#xff0c;若阅读过程中有相关方面的不足&#xff0c;还请指正&#xff0c;本文只做相关技术分享,切莫从事违法等相关行为&#xff0c;本人一律不承担一切后果 引言&#xff1a; 1.Shodan 是一个专门用于搜索连…...

ThingsBoard规则链节点:Push to Edge节点详解

引言 1. Push to Edge 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 边缘计算 3.2 本地数据处理 3.3 实时响应 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管…...

基于 EventBridge + DashVector 打造 RAG 全链路动态语义检索能力

作者&#xff1a;肯梦 本文将演示如何使用事件总线&#xff08;EventBridge&#xff09;&#xff0c;向量检索服务&#xff08;DashVector&#xff09;&#xff0c;函数计算&#xff08;FunctionCompute&#xff09;结合灵积模型服务 [ 1] 上的 Embedding API [ 2] &#xff0…...

【golang/navmesh】使用recast navigation进行寻路

目录 说在前面安装使用可视化 说在前面 go version&#xff1a;1.20.2 linux/amd64操作系统&#xff1a;wsl2detour-go版本&#xff1a;v0.2.0github&#xff1a;这里&#xff0c;求star! 安装 使用go mod安装即可go get github.com/o0olele/detour-go使用 使用场景模型构建n…...

【软考】Redis不同的数据类型和应用场景。

Redis的不同数据类型和对应的应用场景&#xff1a; Redis 数据类型及其应用场景 String&#xff08;字符串&#xff09; 特点&#xff1a;简单的值存储&#xff0c;支持二进制数据。应用场景&#xff1a; 缓存用户会话。缓存小的配置文件。缓存计数器。文章浏览量&#xff0…...

全方位强化 AI 逆向能力,这款 Skill 太实用了

让 Codex 默认支持 JS 逆向Codex GPT-5.4 默认对逆向和爬虫类请求比较保守&#xff0c;常见表现是只讲原则&#xff0c;不继续落地。市面上的常规做法是先发提示词&#xff0c;我这边因为每次重复发送比较麻烦&#xff0c;所以进一步封装成了 Skill&#xff0c;实际验证可行。…...

1000个文件重命名,1秒完成!批量文件重命名软件

前言&#xff1a; 大家好&#xff0c;这里是惠众资料库&#xff0c; 在日常办公、资料归档、素材整理、摄影剪辑等各类场景中&#xff0c;用户会积累大量图片、文档、视频、音频、文件夹等各类文件。为了实现文件分类规整、统一命名规范、方便快速检索调用&#xff0c;文件重命…...

保姆级教程:用Arbe或大陆4D毫米波雷达点云数据,手把手实现Freespace检测(附Python伪代码)

毫米波雷达点云实战&#xff1a;从数据到可行驶区域的完整工程指南在自动驾驶感知系统中&#xff0c;可行驶区域检测&#xff08;Freespace&#xff09;直接决定了车辆路径规划的可行空间边界。相比激光雷达和摄像头方案&#xff0c;4D毫米波雷达凭借全天候工作能力、成本优势和…...

Android HTTPS抓包全解:从Charles配置到证书固定绕过

1. 为什么你手机App的HTTPS请求总像黑箱&#xff1f;——从“看不到”到“全透明”的真实起点你有没有过这种经历&#xff1a;在测试一个安卓App时&#xff0c;明明界面上显示加载失败&#xff0c;但Logcat里翻来覆去全是D/OkHttp: <-- HTTP FAILED: java.net.SocketTimeout…...

API安全设计与防护实战

API安全设计与防护实战 一、API安全概述 API作为系统间交互的接口&#xff0c;是攻击的主要目标。一个安全的API设计需要考虑多个层面的防护&#xff0c;包括认证、授权、数据保护、攻击防护等。 二、API认证机制 2.1 API Key认证 Component public class ApiKeyFilter ex…...

Python自动化登录:破解验证码与Cookie会话维持实战

1. 这不是“绕过验证”&#xff0c;而是理解会话机制的起点很多人看到“跳过验证码登陆”第一反应是&#xff1a;这合规吗&#xff1f;会不会被封&#xff1f;其实这个问题本身就暴露了一个关键误区——我们不是在“绕过”什么&#xff0c;而是在还原真实用户登录时浏览器自动完…...

AI能力认知地图:从工具体验到工程落地的系统化拆解

1. 项目概述&#xff1a;这不是一份“AI工具清单”&#xff0c;而是一份可复用的AI能力认知地图你点开这篇文章&#xff0c;大概率不是为了收藏十个网站链接——而是想搞清楚&#xff1a;当AI能力已经像水电一样开始渗入日常工具链时&#xff0c;一个真实从业者该如何判断哪些能…...

毕业论文难写?2026年AI论文工具排行榜权威发布,一次过审不是梦!

写论文没思路、改稿没头绪、查重总翻车&#xff1f;别慌&#xff01;2026 年最新 AI 论文写作工具合集来了&#xff0c;覆盖选题、大纲、初稿、润色、降重、格式、文献引用全流程&#xff0c;帮你一键匹配最适合的学术助手&#xff0c;高效完成论文不踩坑&#xff01;&#x1f…...

用Delphi 7打造动物农场小游戏:一场编程与数据结构的趣味之旅

文章来自&#xff1a;用Delphi 7打造动物农场小游戏&#xff1a;一场编程与数据结构的趣味之旅 当经典的Pascal语言遇上可爱的动物农场&#xff0c;会擦出怎样的火花&#xff1f; 前言 还记得第一次接触编程时的兴奋吗&#xff1f;当你敲下第一行代码&#xff0c;看到"He…...

2026最新大模型入门电子书学习推荐,必读9本大模型书籍

大模型入门必读的9本书籍汇总NO.1&#xff1a; 《基于GPT-3&#xff0c;ChatGPT&#xff0c;GPT-4等Transformer架构的自然语言处理》主要内容: 了解用于解决复杂语言问题的新技术。将GPT-3与T5、GPT-2和基于BERT的Transformer的结果进行对比。使用TensorFlow、PyTorch和GPT-3执…...