IntelliJ IDEA给Controller、Service、Mapper不同文件设置不同的文件头注释模板、Velocity模板引擎

news2025/5/18 12:14:07

通过在 IntelliJ IDEA 中的 “Includes” 部分添加多个文件头模板,并在 “Files” 模板中利用这些包含来实现不同类型文件的注释。以下是为 Controller、Service、Mapper 文件设置不同文件头的完整示例:

1. 设置 Includes 文件头模板

File > Settings (在 macOS 上是 Preferences)> Editor > File and Code Templates > includes

在 “Includes” 选项卡中,创建以下三个文件头模板:

ControllerHeader

/**
 * 控制层:
 * Controller Class: ${NAME}
 * @Author: ${USER}
 * @Date: ${DATE} ${TIME}
 * @Version: ${VERSION}
 * @Description: ${DESCRIPTION}
 */

ServiceHeader

/**
 * 服务层:
 * Service Class: ${NAME}
 * @Author: ${USER}
 * @Date: ${DATE} ${TIME}
 * @Version: ${VERSION}
 * @Description: ${DESCRIPTION}
 */

MapperHeader

 /**
 * 数据层:
 * Mapper Class: ${NAME}
 * @Author: ${USER}
 * @Date: ${DATE} ${TIME}
 * @Version: ${VERSION}
 * @Description: ${DESCRIPTION}
 */

2. 设置 Files 模板

2.1 设置路径

File > Settings (在 macOS 上是 Preferences)> Editor > File and Code Templates > includes
在这里插入图片描述

2.2 在 “Files” 选项卡中,找到或创建 Java 类模板,并使用条件判断来选择合适的文件头:

2.2.1 根据文件名区分

${NAME.endsWith("Controller")}这种写法专业名词叫Velocity 模板引擎,关于该引擎在后续有详细介绍

#if (${NAME.endsWith("Controller")})
    #parse("ControllerHeader.java")
#elseif (${NAME.endsWith("Service")})
    #parse("ServiceHeader.java")
#elseif (${NAME.endsWith("Mapper")})
    #parse("MapperHeader.java")
#else
/**
 * Class: ${NAME}
 * Author: ${USER}
 * Date: ${DATE}
 * Description: ${DESCRIPTION}
 */
#end

使用更严谨的File template


#if (${NAME.matches(".*Controller$")})
    #parse("ControllerHeader.java")
#elseif ($NAME.matches(".*Service$") || $NAME.matches(".*ServiceImpl$"))
    #parse("ServiceHeader.java")
#elseif (${NAME.matches(".*(Mapper|Dao|Repo)$")})
    #parse("DataLayerHeader.java")
#else
/**
 * Class: ${NAME}
 * Author: ${USER}
 * Date: ${DATE}
 * Description: ${DESCRIPTION}
 */
#end

2.2.2根据包名区分


#if (${PACKAGE_NAME}.contains("controller"))
/**
 * Controller层 - ${NAME}
 * 包路径:${PACKAGE_NAME}
 */
#elseif (${PACKAGE_NAME}.contains("service"))
/**
 * Service层 - ${NAME}
 */
#elseif (${PACKAGE_NAME}.contains("mapper"))
/**
 * Mapper接口 - ${NAME}
 */
#end
  • 更严谨的判断
#set($isMapperPackage = ${PACKAGE_NAME.contains(".mapper")} || ${PACKAGE_NAME.contains(".dao")})
#set($isServiceImplPackage = ${PACKAGE_NAME.contains(".service.impl")})

#if ($isMapperPackage && ($isMapper || ${NAME.endsWith("Repository")}))
  #parse("mapperHeader.java")
#elseif ($isServiceImplPackage)
  #parse("serviceImplHeader.java")
#end

3. 应用模板

  • 当你创建一个新文件时,例如 UserController.javaUserService.javaUserMapper.java,IDEA 将根据文件名后缀自动应用相应的文件头注释。
  • 确保新文件的命名遵循 *Controller*Service*Mapper 的模式,以便条件判断能够正确匹配。

4. 为不同文件类型创建完全独立模板

4.1 实图讲解

  • 新增Controller模板—效果图:
    在这里插入图片描述
  • New -> Java Class-> Controller 就会出现新添加的模板
    在这里插入图片描述

4.2 自定义Files模板详细设置

在 IntelliJ IDEA 中创建需要的文件模板,比如 Controller、Service、Mapper,可以通过以下步骤来实现:

  1. 打开文件模板设置

    • 在 IntelliJ IDEA 的菜单栏中,点击 File -> Settings(在 macOS 上是 IntelliJ IDEA -> Preferences)。
    • 在左侧栏中,选择 Editor -> File and Code Templates
  2. 创建新的文件模板

    • Files 标签页中,点击右上角的 + 按钮,创建一个新的文件模板(如Controller)。
    • 为你的模板命名,比如 ControllerServiceMapper
    • 设置文件名:如Controller等,扩展名:java
  3. 定义文件模板内容

    • 在模板的编辑器中输入你希望的文件内容。你可以使用变量来动态生成代码,如 ${NAME}${PACKAGE_NAME} 等。

    • 例如,对于一个 Controller 模板,你可以这样定义:

      package ${PACKAGE_NAME};
      
      import org.springframework.web.bind.annotation.*;
      
      #parse("ControllerHeader.java")
      @RestController
      @RequestMapping("/${NAME}")
      public class ${NAME}Controller {
          
          // Add your endpoints here
      }
      
    • 对于 Service 模板,可以这样定义:

      package ${PACKAGE_NAME};
      
      import org.springframework.stereotype.Service;
      
      #parse("ServiceHeader.java")
      @Service
      public class ${NAME}Service {
          
          // Add your service methods here
      }
      
    • 对于 Mapper 模板,可以这样定义:

      package ${PACKAGE_NAME};
      
      import org.apache.ibatis.annotations.Mapper;
      
      #parse("MapperHeader.java")
      @Mapper
      public interface ${NAME}Mapper {
          
          // Add your mapper methods here
      }
      
  4. 使用模板

    • 当你创建新文件时,右键点击项目结构树中的目标包或目录,选择 New -> Java Class
    • 在弹出的对话框中,选择你创建的模板(如 ControllerServiceMapper)。
    • 输入文件名,IDEA 会根据模板自动生成文件内容,包括你预定义的文件头注释。

通过这些步骤,你可以为常用的文件类型创建模板,提升开发效率和代码的一致性。

5. Velocity 模板引擎

如**#set** 是 Velocity 模板引擎的核心指令之一。以下为您完整解析 Velocity 的语法体系和学习路径:


5.0 相关指令

以下是 Velocity 模板引擎核心指令的详细解析:


一、变量操作指令

1. #set - 变量赋值
#set($var = "value")              ## 字符串
#set($num = 10 + 5)               ## 数值计算
#set($list = [1, 2, 3])           ## 列表
#set($map = {"key":"value"})      ## 键值对

特性

  • 右值可以是表达式、方法调用或嵌套指令
  • 变量类型动态推断(无需声明类型)
  • 变量作用域为整个模板(类似全局变量)

特殊场景

## 多变量赋值
#set($a = $b = 10)

## 空值处理
#set($result = $optionalValue ?: "default")

二、流程控制指令

2. #if / #elseif / #else - 条件分支
#if($user.role == "admin")
  ADMIN MODE
#elseif($user.age >= 18)
  ADULT USER
#else
  GUEST MODE
#end

判断规则

条件表达式判定为 false 的情况
$varnull、空字符串、空集合、false
$var == 5值不相等或类型不同
$list && $list.size() > 0组合逻辑判断
3. #foreach - 循环迭代
#foreach($item in $items)
  Item $foreach.index: $item.name
  #if($foreach.count == 5)
    #break  ## 退出循环
  #end
#end

循环变量

属性说明
$foreach.index当前索引(从 0 开始)
$foreach.count当前计数(从 1 开始)
$foreach.first是否是第一次迭代(布尔值)
$foreach.last是否是最后一次迭代(布尔值)

三、模板组织指令

4. #include - 静态引入
#include("header.html") 

特点

  • 引入的文件内容不解析 Velocity 语法
  • 适合引入静态 HTML/CSS/JS 片段
  • 可一次引入多个文件:
    #include("head.html", "footer.html")
    
5. #parse - 动态解析
#parse("user_card.vm")

与 #include 对比

特性#parse#include
语法解析✅ 会解析 VTL 指令❌ 原样输出
变量共享✅ 共享当前上下文变量❌ 无变量传递
性能较低(需解析)较高(直接读取)
6. #stop - 引擎停止
#if($error)
  #stop  ## 立即终止模板渲染
#end

使用场景

  • 遇到致命错误时中断渲染
  • 调试时快速定位问题

四、逻辑控制指令

7. #break - 退出当前指令
#foreach($item in $list)
  #if($item == "stop") 
    #break  ## 退出当前 #foreach 循环
  #end
#end

作用范围

  • 仅对当前所在指令有效(如 #foreach#macro
8. #evaluate - 动态执行
#set($template = "Hello $name")
#evaluate($template)  ## 输出:Hello John

危险操作

## 可能引发代码注入(慎用!)
#evaluate($userInput)

五、代码复用指令

9. #define - 定义代码块
#define($block)
  <div class="alert">
    This is a reusable block
  </div>
#end

## 调用
$block

特点

  • 类似变量赋值,但可包含复杂 HTML/VTL
  • 每次调用输出相同内容
10. #macro - 定义可传参宏
#macro(renderUser $user $isAdmin)
  <div class="#if($isAdmin)admin#end">
    $user.name
  </div>
#end

## 调用
#renderUser($currentUser true)

高级特性

功能示例
默认参数#macro(show $msg="Hello")
可变参数#macro(sum $nums...)
嵌套调用宏内可调用其他宏

六、指令对比矩阵

指令是否解析内容是否共享变量典型应用场景
#include引入静态资源文件
#parse模块化动态模板
#define定义重复使用的静态内容块
#macro创建带参数的复用组件

七、安全实践建议

  1. 避免 #evaluate 用户输入

    ## 危险!
    #evaluate($request.getParameter("tpl"))
    
  2. 防御性模板设计

    ## 安全变量引用
    $!{userInput}  ## 自动处理 null
    
    ## 集合判空
    #if($!{list} && $list.size() > 0)
    
  3. 性能优化

    ## 复杂计算预编译
    #set($regex = "^\\d{4}-\\d{2}-\\d{2}$")
    #if($dateStr.matches($regex))
    

八、完整示例模板

## 用户列表模板 (user_list.vm)
#define($header)
  <!DOCTYPE html>
  <html>
  <head>
    <title>User List</title>
    #include("styles.css")
  </head>
#end

#macro(userCard $user)
  <div class="card">
    #parse("user_avatar.vm")
    <h3>$!{user.name}</h3>
    #if($user.isAdmin)
      <span class="badge">ADMIN</span>
    #end
  </div>
#end

$header
<body>
  #foreach($user in $users)
    #if($user.name == "root")
      #stop  ## 禁止显示 root 用户
    #end

    #userCard($user)

    #if($foreach.count >= 100)
      #break  ## 最多显示 100 条
    #end
  #end

  #parse("footer.vm")
</body>
</html>

以上内容可作为 Velocity 开发的权威参考,建议结合官方文档实践验证。每个指令的详细行为可能因 Velocity 版本略有差异(本文基于 2.x 版本)。

5.1、#set 指令详解

5.1.1. 基础作用

#set($variable = "value") 
  • 变量定义:创建或修改变量(类似编程中的赋值)
  • 动态计算:可赋值为字符串、数字、布尔值,或通过表达式计算的结果
  • 作用域:在整个模板中有效(类似全局变量)

5.1.2. 典型用法

## 字符串赋值
#set($className = "UserController")

## 数值计算
#set($total = 10 + 5 * 3)  ## $total = 25

## 布尔逻辑
#set($isValid = $name && $name.length() > 5)

## 对象方法调用
#set($firstChar = $className.substring(0,1)) 

5.2、Velocity 的语法规则

Velocity 的语法规则来源于以下渠道:
5.2.1. 官方文档
Apache Velocity 官网 (velocity.apache.org) 提供完整的 VTL (Velocity Template Language) 规范。

5.2.2. IDE 集成

  • IntelliJ IDEA 等 IDE 的 Velocity 模板编辑界面会提供语法提示
  • 输入 # 时会自动弹出指令列表(如 #if, #foreach, #macro

5.2.3. 开源项目实践

  • 许多 Java 项目(如 Spring Boot 的代码生成器)使用 Velocity 模板
  • 通过阅读开源代码学习实际应用技巧

5.3、系统学习 Velocity 语法的路径

5.3.1. 基础语法

指令/语法用途示例
变量引用输出变量值$variable${variable}
注释添加模板注释## 单行注释#* 多行注释 *#
#set变量赋值#set($price = 99.9)
#if/#else/#elseif条件分支见下方示例
#foreach循环遍历集合见下方示例

条件判断示例

#if($user.role == "admin")
  <p>管理员权限</p>
#elseif($user.age > 18)
  <p>成年用户</p>
#else
  <p>未成年用户</p>
#end

循环示例

<ul>
#foreach($item in $items)
  <li>${foreach.index} - ${item.name}</li>
#end
</ul>

5.3.2. 高级功能

功能说明示例
宏 (Macro)定义可复用的代码片段#macro(showError $msg)<div class="error">$msg</div>#end
引入其他模板模块化模板设计#parse("header.vm")
内置工具对象提供字符串/数学等工具方法$math.add(1,2)$date.format('yyyy-MM-dd')
转义输出防止 XSS 攻击$!{userInput}#escape($htmlContent)

宏定义与调用

## 定义宏
#macro(renderButton $text $color)
  <button style="color:${color}">$text</button>
#end

## 调用宏
#renderButton("提交", "blue")

5.3.3. 调试技巧

  • 输出原始文本:使用 #[[ 不解析的内容 ]]#
    #[[
     这里的 $variable 不会被解析 → 直接输出 $variable
    ]]#
    
  • 查看变量类型
    $variable.class.name  ## 输出变量类型(如 java.lang.String)
    

5.4、快速查询手册

在模板开发中常用以下语法:

需求场景对应语法
避免变量为 null 时报错$!{variable}
字符串拼接#set($fullName = "$firstName $lastName")
集合是否为空判断#if($list.isEmpty()) 或 `#if(!$list
数值格式化$number.format("#,###", $price)
日期格式化$date.format('yyyy-MM-dd', $today)

5.5、学习资源推荐

5.5.1. 官方文档(必读)

  • VTL 语法参考
  • 用户指南

5.5.2. 实战教程

  • Baeldung 的 Velocity 指南
  • TutorialsPoint 的 Velocity 教程

5.5.3. IDE 辅助

  • 在 IntelliJ IDEA 中创建 .vm 文件,IDE 会提供:
    • 语法高亮
    • 指令自动补全(输入 # 触发)
    • 错误检查

5.6、示例:完整模板文件

## 模板:user_profile.vm
#set($user = $data.getUser())
#set($birthday = $date.format('yyyy-MM-dd', $user.birthDate))

<html>
<head>
  <title>$!{user.name} 的资料</title>
</head>
<body>
  #if($user.isAdmin())
    <div class="admin-banner">管理员用户</div>
  #end

  <h1>用户信息</h1>
  <ul>
    <li>姓名:$!{user.name}</li>
    <li>年龄:$math.sub($date.getYear(), $user.birthYear)</li>
    <li>生日:$birthday</li>
  </ul>

  #macro(renderSection $title $content)
    <div class="section">
      <h2>$title</h2>
      <p>$content</p>
    </div>
  #end

  #renderSection("联系方式", $user.contactInfo)
</body>
</html>

通过系统学习上述内容,您将能:

  1. 熟练使用 Velocity 生成动态内容
  2. 理解模板引擎的运行机制
  3. 快速定位和解决模板渲染问题

建议边学边实践,在 IntelliJ 中创建 .vm 文件体验实时语法反馈。

5.7 Velocity引擎与Freemarker等热门引擎对比以及应用场景

Velocity 确实不如 Freemarker、Thymeleaf 这类模板引擎知名度高,但它是一个历史悠久特定场景下非常高效的模板引擎。以下是它的核心应用场景和特点解析,帮助您理解为什么某些场景(比如 IDEA 的注释模板)会选择它:


一、Velocity 的典型应用场景

1. 代码生成(核心优势场景)
  • Java 注释模板(如 IDEA 内置)
  • MyBatis 逆向工程(生成 DAO/Mapper 文件)
  • Spring Boot 项目脚手架(如 JHipster 早期版本)
  • API 文档生成(结合 Swagger 模板)

优势
✅ 语法简单,适合非前端开发者使用
✅ 无复杂依赖,可嵌入任何 Java 环境
✅ 生成纯文本(代码/配置文件)时性能极高

2. 传统 Web 页面渲染(逐渐被替代)
  • 早期的 Java Web 项目(如 Struts 1.x 时代)
  • 企业级 CMS 内容模板(如 Alfresco)

现状
⚠️ 新项目更推荐 Thymeleaf/FreeMarker(对现代前端更友好)
⚠️ 不支持响应式设计等现代特性

3. 邮件模板
  • 企业级邮件内容动态生成(如订单通知)
  • 相比 HTML 页面,邮件模板更简单,Velocity 足够轻量
4. 配置文件动态化
#set($dbHost = "192.168.1.100")
jdbc.url=jdbc:mysql://${dbHost}:3306/db

二、为什么 IDEA 选择 Velocity 做注释模板?

  1. 轻量级
    无需引入额外依赖,IDEA 内置的模板引擎需要极低的开销。

  2. 逻辑简单
    注释模板通常只需要变量替换和简单条件判断,例如:

    /**
     * @author ${USER}
     * @date ${DATE}
     #if(${DESCRIPTION})
     * @description ${DESCRIPTION}
     #end
     */
    
  3. 无副作用
    不会像 FreeMarker 那样产生意外换行或空格(对代码格式敏感)。


三、与现代模板引擎对比

特性VelocityFreeMarkerThymeleaf
学习曲线⭐(最简单)⭐⭐⭐⭐⭐(需懂 HTML)
性能⭐⭐⭐(最快)⭐⭐
前端友好度❌(纯后端)✅⭐⭐⭐(原生 HTML)
动态代码生成✅⭐⭐⭐✅⭐
社区活跃度⭐(维护模式)⭐⭐⭐⭐⭐⭐⭐

四、经典代码生成示例

MyBatis 生成器模板(mapper.xml.vm
<!-- 生成于 ${date} -->
<mapper namespace="${package.Mapper}.${table.mapperName}">
  #foreach($field in ${table.fields})
    #if(${field.keyFlag})
      <id column="${field.name}" property="${field.propertyName}" />
    #else
      <result column="${field.name}" property="${field.propertyName}" />
    #end
  #end
  
  <select id="selectById" resultMap="BaseResultMap">
    SELECT * FROM ${table.name} WHERE id = #{id}
  </select>
</mapper>
Spring Controller 模板(Controller.java.vm
#set($entity = ${table.entityName.toLowerCase()})
@RestController
@RequestMapping("/api/${entity}")
public class ${table.controllerName} {
    @Autowired
    private ${table.serviceName} ${entity}Service;

    @GetMapping("/{id}")
    public Result<${table.entityName}> getById(@PathVariable ${table.primaryKeyType} id) {
        return Result.success(${entity}Service.getById(id));
    }
}

五、什么时候应该选择 Velocity?

  1. 需要生成代码/配置文件
    (如自动生成 CRUD 代码、批量创建相似文件)

  2. 嵌入式模板需求
    (如插件系统需要允许用户自定义模板)

  3. 历史项目维护
    (老系统升级时保留原有模板)


六、为什么不推荐新项目用 Velocity 做页面渲染?

  1. 功能局限
    缺少模板继承、片段复用等现代特性,复杂页面难以维护。

  2. 前后端协作困难
    设计师无法直接修改 HTML(模板语法混合在标签中)。

  3. 安全风险
    默认不开启 HTML 转义,容易导致 XSS 攻击(需手动处理)。


七、快速识别 Velocity 模板

  1. 文件扩展名.vm
  2. 语法特征
    <!-- 变量使用 $ 前缀 -->
    <h1>$title</h1>
    
    <!-- 指令以 # 开头 -->
    #foreach($item in $list)
      <li>$item</li>
    #end
    

如果您只需要一个轻量级文本生成工具(如代码注释、配置文件生成),Velocity 仍然是优秀选择。但对于 Web 页面开发,建议转向 FreeMarker/Thymeleaf 等现代引擎。

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

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

相关文章

【论文阅读】BEVFormer

〇、Introduction BEVFormer是现在端到端无人驾驶中常使用的一个Backbone&#xff0c;用于将六个视角下的图像转换为鸟瞰图视角下的特征&#xff0c;转换出的BEV特征则会被用于后续模块的特征交互。然而在这个模型设计的初期&#xff0c;其最本质的意图是为了提取用于各种CV任…

IDEA编辑器设置的导出导入

背景 最近新换了电脑&#xff0c;因为之前是 Intel 芯片的 Mac&#xff0c;这次换了 arm 架构的 M 芯片的 Mac&#xff0c;旧 Mac 上的很多软件不兼容&#xff0c;所以就没有选择换机数据迁移&#xff0c;一点一点下载、配置了所有环境。 导出 IDEA 支持设置的导入导出&…

成功案例丨从草图到鞍座:用先进的发泡成型仿真技术变革鞍座制造

案例简介 在鞍座制造中&#xff0c;聚氨酯泡沫成型工艺是关键环节&#xff0c;传统依赖实验测试的方法耗时且成本高昂。为解决这一问题&#xff0c;意大利自行车鞍座制造商 Selle Royal与Altair合作&#xff0c;采用Altair Inspire PolyFoam软件进行发泡成型仿真。 该工具帮助团…

电机试验平台:创新科技推动电动机研究发展

电机试验平台是电机制造和研发过程中不可或缺的重要设备&#xff0c;其功能涵盖了电机性能测试、电机寿命测试、电机质量评估等多个方面。随着科技的不断发展和电机应用领域的日益扩大&#xff0c;对电机试验平台的要求也越来越高。本文将从现代化电机试验平台的设计与应用两个…

【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)

该系列项目整体介绍及源代码请参照前面写的一篇文章【springcloud学习(dalston.sr1)】项目整体介绍&#xff08;含源代码&#xff09;&#xff08;一&#xff09; springcloud学习&#xff08;dalston.sr1&#xff09;系统文章汇总如下&#xff1a; 【springcloud学习(dalston…

Qt与Hid设备通信

什么是HID&#xff1f; HID&#xff08;Human Interface Device&#xff09;是‌直接与人交互的电子设备‌&#xff0c;通过标准化协议实现用户与计算机或其他设备的通信&#xff0c;典型代表包括键盘、鼠标、游戏手柄等。‌ 为什么HID要与qt进行通信&#xff1f; 我这里的应…

2024 山东省ccpc省赛

目录 I&#xff08;签到&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; A&#xff08;二分答案&#xff09; 题目简述&#xff1a; 思路&#xff1a; 代码&#xff1a; K&#xff08;构造&#xff09; 题目&#xff1a; 思路&#xff1a; 代…

SAP HCM 0008数据存储逻辑

0008信息类型&#xff1a;0008信息类型是存储员工基本薪酬的地方&#xff0c;因为很多企业都会都薪酬带宽&#xff0c;都会按岗定薪&#xff0c;所以在上线前为体现工资体系的标准化&#xff0c;都会在配置对应的薪酬关系&#xff0c;HCM叫间接评估&#xff0c;今天我们就分析下…

如何使用通义灵码辅助学习C++编程 - AI编程助手提升效率

一、引言 C 是一门功能强大且灵活的编程语言&#xff0c;在软件开发、系统编程、游戏开发等领域广泛应用。然而&#xff0c;其复杂的语法和丰富的特性使得学习曲线较为陡峭。对于初学者而言&#xff0c;在学习过程中难免会遇到各种问题&#xff0c;如语法理解困难、代码调试耗…

【Docker】CentOS 8.2 安装Docker教程

目录 1.卸载 2.安装依赖 3.设置yum源 4.安装Docker 5.启动Docker 6.设置Docker开机自启 7.验证Docker是否安装成功 8.配置多个国内镜像地址 9.重启Docker 10.Docker指令大全 10.1.启动与关闭Docker 10.2.Docker镜像操作 10.3.Docker容器操作 10.4.Docker Compose操作…

K230 ISP:一种新的白平衡标定方法

第一次遇见需要利用光谱响应曲线进行白平衡标定的方法。很好奇是如何利用光谱响应曲线进行白平衡标定的。 参考资料参考&#xff1a;K230 ISP图像调优指南 K230 介绍 嘉楠科技 Kendryte 系列 AIoT 芯片中的最新一代 AIoT SoC K230 芯片采用全新的多核异构单元加速计算架构&a…

桃芯ingchips——windows HID键盘例程无法同时连接两个,但是安卓手机可以的问题

目录 环境 现象 原理及解决办法 环境 PC&#xff1a;windows11 安卓&#xff1a;Android14 例程使用的是HID Keyboard&#xff0c;板子使用的是91870CQ的开发板&#xff0c;DB870CC1A 现象 连接安卓手机时并不会出现该现象&#xff0c;两个开发板都可以当做键盘给手机发按…

[Linux] vim及gcc工具

目录 一、vim 1.vim的模式 2.vim的命令集 (1):命令模式 (2):底行模式 3.vim配置 二、gcc 1.gcc格式及选项 2.工作布置 三、自动化构建工具makefile 1.基本使用方法 2.配置文件解析 3.拓展 在linux操作系统的常用工具中&#xff0c;常用vim来进行程序的编写&#xff1b…

MySQL只操作同一条记录也会死锁吗?

大家好&#xff0c;我是锋哥。今天分享关于【MySQL只操作同一条记录也会死锁吗?】面试题。希望对大家有帮助&#xff1b; MySQL里where条件的顺序影响索引使用吗&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在MySQL中&#xff0c;死锁通常发生在多…

数据结构与算法——双向链表

双向链表 定义链表分类双向链表&#xff1a;带头双向循环链表 初始化打印尾插头插尾删头删查找在pos(指定位置)之后插入结点在pos(指定位置)之前插入结点删除pos(指定位置)的结点销毁顺序表与链表的分析 定义 链表分类 单向和双向 带头和不带头 带头是指存在一个头结点&…

MODBUS RTU调试助手使用方法详解

一、软件简介 485调试助手是一款常用的串口通信调试工具&#xff0c;专门用于RS-485总线设备的测试、调试和通信监控。它支持多种串口参数设置&#xff0c;提供数据收发功能&#xff0c;是工业现场调试的必备工具之一。 二、软件安装与启动 1. 系统要求 Windows 7/10/11操作…

自由学习记录(60)

Lecture 16 Ray Tracing 4_哔哩哔哩_bilibili 老师说的“高频采样”问题是什么&#xff1f; 现在考虑一个特殊情况&#xff1a; ❗ 一个像素内&#xff0c;图像信号变化很剧烈&#xff08;高频&#xff09;&#xff1a; 比如&#xff1a; 细网格纹理 马赛克背景 很高频的…

现代计算机图形学Games101入门笔记(三)

三维变换 具体形式缩放&#xff0c;平移 特殊点旋转。这里涉及到坐标系&#xff0c;先统一定义右手坐标系&#xff0c;根据叉乘和右手螺旋判定方向。这里还能法线Ry Sina 正负与其他两个旋转不一样。这里可以用右手螺旋&#xff0c;x叉乘z&#xff0c;发现大拇指朝下&#xff0…

WeakAuras Lua Script <BiaoGe>

WeakAuras Lua Script <BiaoGe> 表格拍卖插件WA字符串 表格字符串代码&#xff1a; !WA:2!S3xA3XXXrcoE2VH9l7ZFy)C969PvDpSrRgaeuhljFlUiiSWbxaqXDx(4RDd0vtulB0fMUQMhwMZJsAO5HenLnf1LPSUT4iBrjRzSepL(pS)e2bDdWp5)cBEvzLhrMvvnAkj7zWJeO7mJ8kYiJmYiImYF0b(XR)JR9JRD…

chrome 浏览器插件 myTools, 日常小工具。

1. 起因&#xff0c; 目的: 比如&#xff0c;chatgpt, google&#xff0c; 打开网页&#xff0c;就能直接输入文字&#xff0c;然后 grok 就不行&#xff0c;必须用鼠标点一下&#xff0c;才能输入文字。 对我而言&#xff0c;是个痛点&#xff01;写个插件&#xff0c;自动点…