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

java架构一/1:微服务电商/地基/登录

一、构建聚合工程Java-Mavenfoodie-dev为父工程其他为子模块。foodie-dev-api的pom.xml引入依赖-service-service引入-mapper-mapper引入-pojo-pojo引入-common。二、使用PDMan进行数据库建模可以生成表图和表创建或版本更新等功能。三、整合springboot1.pom.xml这步难在版本springbootjdkMySQL等等有问题让AI去寻找协调的依赖即可parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.0/version relativePath/ /parent properties project.build.sourceEncodingUTF-8/project.build.sourceEncoding project.reporting.outputEncodingUTF-8/project.reporting.outputEncoding maven.compiler.source17/maven.compiler.source maven.compiler.target17/maven.compiler.target java.version17/java.version /properties dependencies !-- Spring Boot 基础 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId optionaltrue/optional /dependency !-- MyBatis-Plus兼容 Spring Boot 3.x -- dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.5/version exclusions exclusion groupIdorg.mybatis/groupId artifactIdmybatis-spring/artifactId /exclusion /exclusions /dependency !-- MySQL 8 驱动 -- dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId version8.2.0/version /dependency !-- Lombok -- dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId version1.18.30/version scopeprovided/scope /dependency /dependencies2.application.yml# Web 访问端口号server:port: 8088tomcat:uri-encoding: UTF-8max-http-header-size: 80KB############################################################## 配置数据源信息#############################################################spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://192.168.64.128:3306/foodie-shop-dev?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneAsia/ShanghaiautoReconnecttrueallowPublicKeyRetrievaltrueusername: rootpassword: roothikari:connection-timeout: 30000 # 连接超时时间毫秒minimum-idle: 5 # 最小连接数maximum-pool-size: 20 # 最大连接数auto-commit: true # 自动提交idle-timeout: 600000 # 空闲连接最大存活时间毫秒pool-name: DateSourceHikariCP # 连接池名字max-lifetime: 1800000 # 连接的最大生命周期毫秒connection-test-query: SELECT 1 # 连接测试查询############################################################## MyBatis 配置#############################################################mybatis:type-aliases-package: com.imooc.pojo # 所有 POJO 类所在包路径mapper-locations: classpath:mapper/*.xml # Mapper XML 文件路径############################################################## MyBatis-Plus 配置#############################################################mybatis-plus:configuration:map-underscore-to-camel-case: true # 开启驼峰命名转换log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印 SQL 日志global-config:db-config:id-type: auto # 主键自增logic-delete-field: deleted # 逻辑删除字段名logic-delete-value: 1 # 逻辑删除值logic-not-delete-value: 0 # 逻辑未删除值mybatis-plus在mybatis上只增强不修改所以我选择了MP因此springboot用3jdk17MySQL8......此外不论是mybatis还是MP都有相应的配置一键生成工具另一个项目可以自行去寻找。不过我直接用通义灵码的智能体插件告诉它需要生成的位置实体类的字段需要生成的文件也能快速生成一套基本的增删改查类pojomapperserviceserviceImpl。引入lombok依赖不用写实体类的getset方法只需要注解很方便。数据源url配置根据自己MySQL下载位置修改一般是localhost我是下载到了虚拟机Ubuntu中。数据库名foodie-shop-dev要与自己创建的一致。3.启动类package com.imooc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; SpringBootApplication ComponentScan(basePackages {com.imooc, org.n3r.idworker}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }三、api接口1.遵循restful编写风格2.可以使用PostMan去调试接口很简单自行学习swgger没使用教学教学视频中较老的swagger2因为版本不兼容所以改成了更新的openapiUI增强使用的knife4j能有更好看的界面。生成api文档更方便前端人员去调用接口去请求。文中未说明的依赖都是引入到父工程的pom中1.pom.xml!-- springdoc-openapi (替代 Swagger2兼容 Spring Boot 3.x) -- dependency groupIdorg.springdoc/groupId artifactIdspringdoc-openapi-starter-webmvc-ui/artifactId version2.3.0/version /dependency !-- knife4j 增强 UI (支持 OpenAPI 3) -- dependency groupIdcom.github.xiaoymin/groupId artifactIdknife4j-openapi3-jakarta-spring-boot-starter/artifactId version4.4.0/version /dependency2.Swagger.java位置foodie-dev\foodie-dev-api\src\main\java\com\imooc\config\Swagger.javapackage com.imooc.config; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; // http://localhost:8088/swagger-ui/index.html // http://localhost:8088/doc.html Configuration public class Swagger { Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info() .title(饕餮吃货 电商平台接口 api) .version(1.0.1) .description(饕餮吃货 电商平台接口 api 文档) .contact(new Contact() .name(imooc) .email(123imooc.com) .url(http://www.imooc.com))); } }3.application.yml############################################################ # # Knife4j 增强配置 # ############################################################ springdoc: api-docs: enabled: true path: /v3/api-docs swagger-ui: enabled: true path: /swagger-ui.html group-configs: - group: default paths-to-match: /** packages-to-scan: com.imooc.controller # Knife4j 增强 UI 配置 knife4j: enable: true setting: language: zh_cn swagger-model-name: 实体类列表四、跨域解决foodie-dev\foodie-dev-api\src\main\java\com\imooc\config\CorsConfig.javapackage com.imooc.config; 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 { public CorsConfig(){ } Bean public CorsFilter corsFilter(){ // 1. 添加CORS配置信息 CorsConfiguration config new CorsConfiguration(); config.addAllowedOrigin(http://localhost:8080); // 是否发送cookie信息 config.setAllowCredentials(true); // 允许的请求方式 config.addAllowedMethod(*); // 允许的header config.addAllowedHeader(*); // 2. 为URL添加映射路径 UrlBasedCorsConfigurationSource corsSource new UrlBasedCorsConfigurationSource(); corsSource.registerCorsConfiguration(/**, config); return new CorsFilter(corsSource); } }五、基本功能实现1.判断用户名是否存在1.UserServiceImpl主要用于前端页面的用户名校验用户填写密码前就能校验出结果。Autowired private UserMapper userMapper; /** * 判断用户名是否存在 * param username */ Override public boolean queryUsernameIsExist(String username) { if (StringUtils.isBlank(username)) { return false; } LambdaQueryWrapperUsers wrapper new LambdaQueryWrapper(); wrapper.eq(Users::getUsername, username); Users user this.baseMapper.selectOne(wrapper); return user ! null; }2.PassportController** * 校验用户名是否存在 * * param username 用户名 * return 200-OK(用户名可用), 500-用户名已存在或为空 */ Operation(summary 用户名是否存在, description 用户名是否存在) GetMapping() public IMOCCJSONResult checkUsername( Parameter(description 用户名, required true) RequestParam String username) { // 1. 校验用户名是否为空 if (StringUtils.isBlank(username)) { return IMOCCJSONResult.errorMsg(用户名不能为空); } // 2. 校验用户名是否存在 boolean isExist userService.queryUsernameIsExist(username); if (isExist) { return IMOCCJSONResult.errorMsg(用户名已存在请换一个试试); } // 3. 用户名可用 return IMOCCJSONResult.ok(用户名可用); }2.注册功能1.User.javapackage com.imooc.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * 用户实体类 */ Data TableName(users) public class Users implements Serializable { private static final long serialVersionUID 1L; /** * 主键 ID */ TableId(value id, type IdType.ASSIGN_UUID) private String id; /** * 用户名 */ private String username; /** * 密码 */ private String password; /** * 昵称 */ private String nickname; /** * 真实姓名 */ private String realname; /** * 头像 */ private String face; /** * 手机号 */ private String mobile; /** * 邮箱 */ private String email; /** * 性别 (1:男 0:女 2:保密) */ private Integer sex; /** * 生日 */ private Date birthday; /** * 创建时间 */ private Date createdTime; /** * 更新时间 */ private Date updatedTime; }2.UserServiceImpl/** * 用户服务实现类 */ Service public class UserServiceImpl extends ServiceImplUserMapper, Users implements UserService { Autowired public Sid sid; private static final String USER_FACE https://img.zcool.cn/community/01a2f05e8d07e45f4ab05c1f60b4df.jpg; Autowired private UserMapper userMapper; /** * 创建用户 * param userBo */ Override public Users createUser(UserBo userBo) { String userId sid.nextShort(); Users user new Users(); user.setId(userId); user.setUsername(userBo.getUsername()); try { user.setPassword(MD5Utils.getMD5Str(userBo.getPassword())); } catch (Exception e) { throw new RuntimeException(e); } user.setNickname(userBo.getUsername()); user.setFace(USER_FACE); user.setBirthday(DateUtil.stringToDate(1900-01-01)); user.setSex(Sex.secret.type); user.setCreatedTime(new Date()); user.setUpdatedTime(new Date()); userMapper.insert(user); return user; }这段涉及很多其他的知识点1.createUser(UserBo userBo)用户注册时输入包含用户名密码确认密码用于前端传入而后端不需要对确认密码进行其他操作因此自定义UserBo用于参数传入且不用写过长的参数保持优雅。package com.imooc.pojo.bo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; Schema(description 用户对象 BO) Data public class UserBo { Schema(description 用户名, example imooc, required true) private String username; Schema(description 密码, example 123456, required true) private String password; Schema(description 确认密码, example 123456, required false) private String confirmPassword; }2.sid.nextShort()使用雪花算法来生成全局唯一id支持分布式3.MD5Utils.getMD5Str(userBo.getPassword())用到了MD5加密我们把设置的密码加密后存到数据库中显示但实际用户登录还是用ta原先设置好的那串。!-- Apache 工具类 -- dependency groupIdcommons-codec/groupId artifactIdcommons-codec/artifactId version1.11/version /dependency dependency groupIdorg.apache.commons/groupId artifactIdcommons-lang3/artifactId version3.4/version /dependency dependency groupIdorg.apache.commons/groupId artifactIdcommons-io/artifactId version1.3.2/version /dependency4.DateUtil.stringToDate(1900-01-01)将字符串转换成日期。5.user.setSex(Sex.secret.type)用枚举类设置性别一目了然而非数字。3.PassportControllerpackage com.imooc.controller; Tag(name 注册登录, description 用于用户注册登录相关接口) RestController RequestMapping(/passport) public class PassportController { Autowired private UserService userService; /** * 用户注册 * * param userBo 用户名 * return 200-OK(用户名可用), 500-用户名已存在或为空 */ Operation(summary 用户注册, description 用户注册) PostMapping(/regist) public IMOCCJSONResult regist(RequestBody UserBo userBo, HttpServletRequest request, HttpServletResponse response) throws Exception { String username userBo.getUsername(); String password userBo.getPassword(); String confirmPassword userBo.getConfirmPassword(); // 0. 判断用户和密码是否为空 if (StringUtils.isBlank(username) || StringUtils.isBlank(password) || StringUtils.isBlank(confirmPassword)) { return IMOCCJSONResult.errorMsg(用户名或密码不能为空); } // 1. 校验用户名是否存在 boolean isExist userService.queryUsernameIsExist(username); if (isExist) { return IMOCCJSONResult.errorMsg(用户名已存在请换一个试试); } // 2.密码长度不能少于 6 位 if (password.length() 6) { return IMOCCJSONResult.errorMsg(密码长度不能少于 6 位); } // 3.判断两次密码是否一致 if (!password.equals(confirmPassword)) { return IMOCCJSONResult.errorMsg(两次密码不一致); } // 4. 实现注册 Users userResult userService.createUser(userBo); userResult setNullProperty(userResult); CookieUtils.setCookie(request, response, user, JsonUtils.objectToJson(userResult), true); return IMOCCJSONResult.ok(); }这有一个自定义响应数据结构类IMOCCJSONResultpackage com.imooc.utils; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data; /** * 自定义响应数据结构 * 本类可提供给 H5/ios/安卓/公众号/小程序 使用 * 前端接受此类数据 (jsonobject) 后可自行根据业务去实现相关功能 * * 200: 表示成功 * 500: 表示错误错误信息在 msg 字段中 * 501: bean 验证错误不管多少个错误都以 map 形式返回 * 502: 拦截器拦截到用户 token 出错 * 555: 异常抛出信息 * 556: 用户 qg 校验异常 */ Data JsonInclude(JsonInclude.Include.NON_NULL) public class IMOCCJSONResult { /** * 响应状态码 */ private Integer status; /** * 响应消息 */ private String msg; /** * 响应数据 */ private Object data; /** * 响应时间戳 */ private Long timestamp; public IMOCCJSONResult() { this.timestamp System.currentTimeMillis(); } /** * 成功响应不带数据 */ public static IMOCCJSONResult build(Integer status, String msg) { IMOCCJSONResult result new IMOCCJSONResult(); result.setStatus(status); result.setMsg(msg); return result; } /** * 成功响应带数据 */ public static IMOCCJSONResult build(Integer status, String msg, Object data) { IMOCCJSONResult result new IMOCCJSONResult(); result.setStatus(status); result.setMsg(msg); result.setData(data); return result; } /** * 成功响应200 */ public static IMOCCJSONResult ok() { return build(200, OK); } /** * 成功响应200带数据 */ public static IMOCCJSONResult ok(Object data) { return build(200, OK, data); } /** * 错误响应500 */ public static IMOCCJSONResult errorMsg(String msg) { return build(500, msg); } /** * 错误响应500带数据 */ public static IMOCCJSONResult errorMsg(String msg, Object data) { return build(500, msg, data); } }3.登录功能1.UserServiceImpl/** * 检索用户名和密码是否匹配用于登录 * param username * param password */ Override public Users queryUserForLogin(String username, String password) { LambdaQueryWrapperUsers wrapper new LambdaQueryWrapper(); wrapper.eq(Users::getUsername, username); wrapper.eq(Users::getPassword, password); Users result userMapper .selectOne(wrapper); return result; }2.PassportController/** * 用户登录 * * param userBo 用户输入 */ Operation(summary 用户登录, description 用户登录) PostMapping(/login) public IMOCCJSONResult login(RequestBody UserBo userBo, HttpServletRequest request, HttpServletResponse response) throws Exception { String username userBo.getUsername(); String password userBo.getPassword(); // 0. 判断用户和密码是否为空 if (StringUtils.isBlank(username) || StringUtils.isBlank(password)) { return IMOCCJSONResult.errorMsg(用户名或密码不能为空); } // 1. 实现登录 Users userResult userService.queryUserForLogin(username, MD5Utils.getMD5Str(password)); if (userResult null) { return IMOCCJSONResult.errorMsg(用户名或密码不正确); } // 数据敏感信息隐藏 userResult setNullProperty(userResult); // 保存会话 CookieUtils.setCookie(request, response, user, JsonUtils.objectToJson(userResult), true); return IMOCCJSONResult.ok(userResult); } private Users setNullProperty(Users userResult) { userResult.setPassword(null); userResult.setMobile(null); userResult.setEmail(null); userResult.setCreatedTime(null); userResult.setUpdatedTime(null); return userResult; }注册和登录后都需要把敏感信息设置为空然后设置cookie用于身份令牌识别。这部分涉及一个JsonUtils.objectToJson(userResult)在com/imooc/utils下。!-- Jakarta Servlet API (兼容 Spring Boot 3.x) -- dependency groupIdjakarta.servlet/groupId artifactIdjakarta.servlet-api/artifactId version6.0.0/version scopeprovided/scope /dependency4.登出/** * 用户退出登录 * param userId 用户ID */ Operation(summary 用户退出登录, description 用户退出登录) PostMapping(/logout) public IMOCCJSONResult logout(RequestParam String userId, HttpServletRequest request, HttpServletResponse response) { // 清除用户相关信息的 cookie CookieUtils.deleteCookie(request, response, user); // TODO 用户退出登录需要清空购物车 // TODO 分布式会话中需要清除用户数据 return IMOCCJSONResult.ok(); }六、日志记录1.依赖!-- Spring Boot 基础 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-logging/artifactId /exclusion /exclusions /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency !--引入日志依赖 抽象层 与 实现层-- dependency groupIdorg.slf4j/groupId artifactIdslf4j-api/artifactId version1.7.21/version /dependency dependency groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId version1.7.21/version /dependency2.log4j.propertieslog4j.rootLoggerDEBUG,stdout,file log4j.additivity.org.apachetrue log4j.appender.stdoutorg.apache.log4j.ConsoleAppender log4j.appender.stdout.thresholdINFO log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern%-5p %c{1}:%L - %m%n log4j.appender.fileorg.apache.log4j.DailyRollingFileAppender log4j.appender.file.layoutorg.apache.log4j.PatternLayout log4j.appender.file.DatePattern.yyyy-MM-dd-HH-mm log4j.appender.file.layout.ConversionPattern%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n log4j.appender.file.ThresholdINFO log4j.appender.file.appendtrue log4j.appender.file.File/workspaces/logs/foodie-api/imooc.log3.ServiceLogAspect.javafoodie-dev\foodie-dev-api\src\main\java\com\imooc\aspect\ServiceLogAspect.javapackage com.imooc.aspect; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; Aspect Component public class ServiceLogAspect { private static final Logger log LoggerFactory.getLogger(ServiceLogAspect.class); /** * A0P通知: * 1.前置通知:在方法调用之前执行 * 2.后置通知:在方法正常调用之后执行 * 3.⭐环绕通知:在方法调用之前和之后都分别可以执行的通知 * 4.异常通知:如果在方法调用过程中发生异常则通知 * 5.最终通知:在方法调用之后执行 */ /** * 切面表达式:execution代表所要执行的表达式主体 * 第一处 * 代表方法返回所有类型 * 第二处 包名代表aop监控的类所在的包 * 第三处 ..代表该包以及其子包下的所有类 * 第四处 *代表(所有)类名 * 第五处 *代表类中的方法名(..)表示方法中的任何参数 */ Around(execution(* com.imooc.service.impl..*.*(..))) public Object recordTimeLog(ProceedingJoinPoint joinPoint) throws Throwable { log.info(开始执行{}.{}, joinPoint.getTarget().getClass().getSimpleName(), joinPoint.getSignature().getName()); // 记录开始时间 long begin System.currentTimeMillis(); // 执行目标 service Object result joinPoint.proceed(); // 记录结束时间 long end System.currentTimeMillis(); long takeTime end - begin; if (takeTime 3000) { log.error(执行结束耗时{}毫秒, takeTime); } else if (takeTime 2000) { log.warn(执行结束耗时{}毫秒, takeTime); } else { log.info(执行结束耗时{}毫秒, takeTime); } return result; } }

相关文章:

java架构一/1:微服务电商/地基/登录

一、构建聚合工程(Java-Maven)foodie-dev为父工程,其他为子模块。foodie-dev-api的pom.xml引入依赖-service,-service引入-mapper,-mapper引入-pojo,-pojo引入-common。二、使用PDMan进行数据库建模&#x…...

OpenClaw多模态实践:千问3.5-27B图片理解+文件整理自动化

OpenClaw多模态实践:千问3.5-27B图片理解文件整理自动化 1. 为什么需要自动化图片管理 上周整理项目资料时,我发现桌面上散落着237张截图——有会议纪要片段、代码报错提示、参考文档关键页,甚至还有随手截的灵感草图。手动分类这些文件花了…...

AI大揭秘:从ChatGPT到深度学习,普通人如何抓住AI风口?

一提及AI,大家脑海里想的是什么呢?是Deepseek、豆包、元宝等软件应用,还是能跑会跳的机器人?或者是那些能自己跑的车子、能自己运转的机器? 这些都是AI,都是人工智能。 基本概念 AI是英文Artificial Intell…...

OpenClaw(小龙虾)Windows 11 一键部署教程|2026 最新版|零代码・免配置・解压即用

适用系统:Windows 11 专业版 / 家庭版 / 正式版(全版本兼容) 项目介绍:OpenClaw 是 GitHub 星标 28W 的开源本地 AI 智能体,可自动操控电脑、整理文件、浏览器自动化、办公自动化,被国内用户称为小龙虾&am…...

从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集

从标注到训练:手把手教你用Labelme制作YOLOv8-Pose可用的关键点数据集 在计算机视觉领域,关键点检测技术正逐渐成为研究热点。无论是人体姿态估计、面部表情识别还是工业质检中的零件定位,准确的关键点检测都是实现这些应用的基础。然而&…...

MySQL 索引特性与性能优化全解

🔥草莓熊Lotso:个人主页 ❄️个人专栏: 《C知识分享》 《Linux 入门到实践:零基础也能懂》 ✨生活是默默的坚持,毅力是永久的享受! 🎬 博主简介: 文章目录前言:一. 索引是什么1.1 初…...

SentenceTransformer:计算句子嵌入的模型

原文:towardsdatascience.com/sentencetransformer-a-model-for-computing-sentence-embedding-e8d31d9e6a8f 在这篇帖子中,我们探讨了 2019 年发布的 SentenceTransformer [1],它具有双编码器架构,并将 BERT 调整为产生高效的句子…...

题目整理之线性dp

周赛137_D小苯的序列涂色 #include<bits/stdc.h> #define int long long #define fi first #define se second using namespace std; const int mod1e97; typedef pair<int,int>pii; const int N3e5; int dx[4]{1,-1,0,0}; int dy[4]{0,0,1,-1}; int num[N],inv[N]…...

新手避坑指南:用Pandas高效合并CIC-IDS-2018的10个CSV文件(附内存优化技巧)

新手避坑指南&#xff1a;用Pandas高效合并CIC-IDS-2018的10个CSV文件&#xff08;附内存优化技巧&#xff09; 网络安全数据分析的第一步往往是从处理原始数据集开始。CIC-IDS-2018作为业内广泛使用的基准数据集&#xff0c;其分散在10个CSV文件中的特征数据给初学者带来了不小…...

OpenClaw个人知识库构建:Qwen3-14b_int4_awq自动标注与归档

OpenClaw个人知识库构建&#xff1a;Qwen3-14b_int4_awq自动标注与归档 1. 为什么需要自动化知识管理 作为一个长期与技术文档打交道的开发者&#xff0c;我的本地硬盘里堆积着超过20GB的研究资料——从PDF论文、Markdown笔记到代码片段和会议记录。传统文件夹分类早已失效&a…...

校正协变量的相关:偏相关分析

当你想研究两个变量&#xff08;X 和 Y&#xff09;的关系&#xff0c;但担心其他变量&#xff08;Z&#xff09;可能干扰这个关系时&#xff0c;偏相关分析 (Partial Correlation) 可以在剔除协变量的影响后&#xff0c;计算 X 和 Y 之间更“纯粹”的关联。 1. 核心定义 偏相关…...

数字游民工作流:OpenClaw+千问3.5-27B自动处理跨境邮件

数字游民工作流&#xff1a;OpenClaw千问3.5-27B自动处理跨境邮件 1. 为什么需要自动化邮件处理 作为数字游民&#xff0c;我每天需要处理来自不同时区的客户邮件。这些邮件往往混杂着英语、西班牙语和中文&#xff0c;且包含大量模糊的需求描述。最痛苦的是凌晨三点被手机提…...

OpenClaw+Qwen3-14b_int4_awq:自动化文档生成工具

OpenClawQwen3-14b_int4_awq&#xff1a;自动化文档生成工具 1. 为什么需要自动化文档生成 作为一名技术写作者&#xff0c;我经常面临一个困境&#xff1a;代码写完了&#xff0c;文档却迟迟无法完成。每次面对空白的Markdown文件&#xff0c;总有种无从下笔的感觉。更糟糕的…...

基于SpringBoot + Vue的人工智能时代个人计算机的安全防护科普系统

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...

NaViL-9B多场景落地:物流运单图像识别+地址结构化+异常标记

NaViL-9B多场景落地&#xff1a;物流运单图像识别地址结构化异常标记 1. 物流行业的AI变革机遇 现代物流行业每天处理数以亿计的运单&#xff0c;传统人工处理方式面临三大挑战&#xff1a; 效率瓶颈&#xff1a;人工录入一张运单平均耗时30秒&#xff0c;高峰期处理能力不足…...

基于SpringBoot + Vue的鲜花销售系统(角色:用户、商家、管理员)

文章目录前言一、详细操作演示视频二、具体实现截图三、技术栈1.前端-Vue.js2.后端-SpringBoot3.数据库-MySQL4.系统架构-B/S四、系统测试1.系统测试概述2.系统功能测试3.系统测试结论五、项目代码参考六、数据库代码参考七、项目论文示例结语前言 &#x1f49b;博主介绍&#…...

小程序常用页面跳转 5 种方式汇总(开发常备手册)

小程序多页面协作离不开路由跳转&#xff0c;不同场景对应不同跳转 API&#xff0c;今天一次性整理齐全&#xff0c;开发随时查阅。保留当前页跳转&#xff08;普通内页&#xff09;wx.navigateTo({url:"/pages/detail/detail"})关闭当前页再跳转wx.redirectTo({url:…...

Python脚本打包成.exe方法

利用 pyinstaller打包 先安装这个库 pip install pyinstaller安装完成后&#xff0c;就可台利用pyinstaller进行打包了 在脚本文件的目录下切到cmd中&#xff0c;执行以下 pyinstaller -F tcping.py-F参数&#xff1a; 表示覆盖打包&#xff0c;不管我们打包几次&#xff0c;都…...

SEO 优化师如何处理网站收录和排名下降的问题

SEO 优化师如何处理网站收录和排名下降的问题 在数字营销中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;是一个至关重要的环节&#xff0c;尤其是对于那些希望在百度上获得高排名和流量的网站。即使是最优秀的SEO策略&#xff0c;也可能会在某些时候面临网站收录和排…...

Linux ioctl系统调用实战

Linux ioctl系统调用实战 ioctl&#xff08;input/output control&#xff09;是Linux系统中一个强大的系统调用&#xff0c;用于设备控制和配置。从网络接口配置到串口通信&#xff0c;ioctl无处不在。本文将深入讲解ioctl的原理和实战应用。 一、ioctl概述 1.1 什么是ioctl i…...

嵌入式轻量级调试追踪组件dbg-trace设计与应用

1. 项目概述dbg-trace是一个面向嵌入式系统的轻量级调试追踪&#xff08;Debug & Trace&#xff09;组件&#xff0c;其核心设计目标是在资源受限的 MCU 环境中提供可配置、低开销、高可靠性的日志输出能力。它不依赖标准 C 库的printf实现&#xff0c;而是基于“追踪端口”…...

Obsidian插件实战:5个提升笔记效率的神器(附避坑指南)

Obsidian插件实战&#xff1a;5个提升笔记效率的神器&#xff08;附避坑指南&#xff09; 如果你正在寻找能够真正提升Obsidian笔记效率的插件组合&#xff0c;这篇文章将为你揭示5个经过实战检验的效率神器。不同于泛泛而谈的插件列表&#xff0c;我们聚焦于那些能够形成工作…...

MySQL索引优化快速入门

这里需要知道什么是B树 从数据结构角度简单分析&#xff1a; 二叉树和B树可以简单理解为通过二分法减少查询的次数&#xff0c;但是仍存在严重的性能问题 1&#xff0c;插入顺序不对时&#xff0c;会退化为链表&#xff0c;时间复杂度由O(logn)变成O(n)。 2. 大数据情况下…...

刷题不再难:用代码随想录和Hot100打造你的算法思维

算法思维跃迁&#xff1a;从代码随想录到Hot100的实战精进指南 1. 算法能力提升的黄金路径 在技术面试中&#xff0c;算法能力往往是区分候选人的关键指标。但许多开发者在刷题过程中常陷入"刷了就忘"的困境&#xff0c;缺乏系统性训练方法。本文将揭示如何通过代码随…...

双向buck-boost电路仿真模型-储能双向DCDC变换器 电压电流双闭环PI控制 蓄电池充放电模式可切换 恒流充电_恒压输出 Matlab_Simulink模型

双向buck-boost电路仿真模型-储能双向DCDC变换器 电压电流双闭环PI控制 蓄电池充放电模式可切换 恒流充电/恒压输出 Matlab/Simulink模型核心控制算法&#xff1a;双闭环 PI 控制器 (MATLAB Function/S-Function) 这是模型的“大脑”。它需要根据模式切换&#xff0c;决定是外环…...

盘姬工具箱功能详解:百余款实用工具助力系统优化

盘姬工具箱最大的特点就是功能的全面性。 软件安装后即可直接使用&#xff0c;打开界面就能看到丰富多样的功能模块。 这些功能模块分类清晰&#xff0c;操作直观&#xff0c;即使是电脑新手也能快速上手。 从日常的小工具到高级的技术工具&#xff0c;盘姬工具箱几乎涵盖了…...

盘姬工具箱:一款值得收藏的免费无广告系统维护神器

在日常使用电脑的过程中&#xff0c;我们难免会遇到各种各样的问题。 系统崩溃、文件误删、右键菜单混乱、网络故障等等&#xff0c;这些问题都让人头疼不已。 为了解决这些问题&#xff0c;很多用户会安装各种专门的工具软件。 但每安装一个软件&#xff0c;都会占用磁盘空…...

算法——bfs/dfs

Find The Multiple 给定一个正整数 n&#xff0c;编写一个程序找出 n 的一个非零倍数 m&#xff0c;其十进制表示只包含数字 0 和 1。可以假设 n 不大于 200&#xff0c;并且存在一个 m&#xff0c;其十进制表示不超过 100 位。 输入 输入文件可能包含多个测试用例。每一行包含…...

04.Python 循环:while+for详解

1. 循环 while或 for后边都记得加:&#xff08;英文冒号&#xff09; 1.1 while 1.1.1 概述 ① 初始化计数器 ② 编写循环条件&#xff08;判断计数器是否达到了目标位置&#xff09; ③ 在循环内部更新计数器 1.1.2 猜数字案例 #适用于 循环次数未知的情况, 例如: 猜数字游戏.…...

CSS自定义变量在JS中动态读取_利用setProperty处理兼容赋值

JS读取CSS自定义变量需确保变量已作用于目标元素&#xff08;如:root或元素自身&#xff09;&#xff0c;再用getComputedStyle(el).getPropertyValue(--var)获取&#xff0c;注意双短横、返回字符串、空字符串非undefined&#xff1b;动态修改用setProperty仅限当前元素&#…...