api.ts.ftl 和 types.ts.ftl(TypeScript 模板参考示例1)

【Claude Code · VibeCoding】11|需求梳理:云枢智学 / 学员平台 第三章 · 项目实战以「云枢智学」学员平台为例,把业务目标拆成可执行的需求条目。 阅读详情

以下是符合 现代前端工程化规范、遵循 OpenAPI 3.0 契约 的两个 TypeScript 模板文件,专为与 Java 后端(特别是基于 MyBatis-Plus + SpringDoc 的项目)协同开发而设计:

  • api.ts.ftl:API 请求函数封装(基于 Axios)
  • types.ts.ftl:TypeScript 类型定义(与后端 DTO/VO 严格对齐)

这两个模板均包含详尽的中文注释,支持 自动生成类型安全的前端 API 客户端,可直接用于代码生成器(如 MyBatis-Plus Generator 扩展或自定义脚本)。


✅ 1. types.ts.ftl(TypeScript 类型定义模板)

/**
 * ${table.comment!} 相关类型定义
 *
 * 【设计目标】
 * 1. 与后端 Java 的 DTO/VO 结构严格对齐
 * 2. 提供完整的 TypeScript 类型安全
 * 3. 支持 OpenAPI 生成工具(如 openapi-typescript)的补充或替代
 * 4. 字段注释保留业务语义,便于前端理解
 *
 * 【关键原则】
 * - 类型命名清晰:CreateDTO → CreateReq,VO → Res
 * - 时间字段统一使用 string(ISO 8601 格式),避免 Date 对象时区问题
 * - 枚举使用联合类型("0" | "1")而非数字,提升可读性
 * - 敏感字段(如 password)绝不包含
 *
 * @author ${author}
 * @since ${date}
 */

/**
 * ${table.comment!} 创建请求参数
 */
export interface ${entity}CreateReq {
<#list table.fields as field>
<#-- 跳过主键、基类字段和敏感字段 -->
<#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  /**
   * ${field.comment!}
   */
  ${field.propertyName}: 
  <#if field.propertyType == "String">string
  <#elseif field.propertyType == "Integer" || field.propertyType == "Long">number
  <#elseif field.propertyType == "Boolean">boolean
  <#elseif field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">string // ISO 8601 格式,如 "2023-01-01T12:00:00"
  <#else>any</#if>;
</#if>
</#list>
}

/**
 * ${table.comment!} 更新请求参数
 */
export interface ${entity}UpdateReq {
  /**
   * 主键 ID
   */
  id: number;
<#list table.fields as field>
<#-- 跳过基类字段、敏感字段,保留可更新字段 -->
<#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  /**
   * ${field.comment!}
   */
  ${field.propertyName}: 
  <#if field.propertyType == "String">string | null
  <#elseif field.propertyType == "Integer" || field.propertyType == "Long">number | null
  <#elseif field.propertyType == "Boolean">boolean | null
  <#elseif field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">string | null // ISO 8601 格式
  <#else>any</#if>;
</#if>
</#list>
}

/**
 * ${table.comment!} 查询条件
 */
export interface ${entity}Query {
  /**
   * 页码(从1开始)
   * @default 1
   */
  page?: number;

  /**
   * 每页数量
   * @default 10
   */
  size?: number;
<#list table.fields as field>
<#-- 仅包含适合查询的字段(通常是 String、Integer 等) -->
<#if !(field.name == 'id' || field.name == 'create_time' || field.name == 'update_time' || field.name == 'deleted' || field.name == 'password' || field.name == 'salt')>
  <#if field.propertyType == "String" || field.propertyType == "Integer" || field.propertyType == "Boolean">
  /**
   * ${field.comment!}(模糊/精确查询)
   */
  ${field.propertyName}?: 
  <#if field.propertyType == "String">string
  <#elseif field.propertyType == "Integer" || field.propertyType == "Long">number
  <#elseif field.propertyType == "Boolean">boolean</#if>;
  </#if>
</#if>
</#list>
}

/**
 * ${table.comment!} 详情响应
 */
export interface ${entity}DetailRes {
  /**
   * 主键 ID
   */
  id: number;
<#list table.fields as field>
<#-- 跳过敏感字段和逻辑删除字段 -->
<#if !(field.name == 'password' || field.name == 'salt' || field.name == 'deleted')>
  /**
   * ${field.comment!}
   */
  ${field.propertyName}: 
  <#if field.propertyType == "String">string
  <#elseif field.propertyType == "Integer" || field.propertyType == "Long">number
  <#elseif field.propertyType == "Boolean">boolean
  <#elseif field.propertyType == "LocalDateTime" || field.propertyType == "LocalDate">string // ISO 8601 格式
  <#else>any</#if>;
</#if>
</#list>
}

/**
 * ${table.comment!} 列表项响应
 */
export type ${entity}ListItemRes = ${entity}DetailRes;

/**
 * 分页响应包装
 */
export interface PageRes<T> {
  /**
   * 总记录数
   */
  total: number;

  /**
   * 当前页数据列表
   */
  list: T[];

  /**
   * 当前页码
   */
  page: number;

  /**
   * 每页数量
   */
  size: number;
}

/**
 * 【扩展建议】以下为常见场景示例(按需取消注释)
 */

/*
// 示例:状态枚举(与后端保持一致)
export type UserStatus = '0' | '1'; // '0' - 禁用, '1' - 启用

// 示例:格式化字段(前端计算)
export interface UserDetailResWithFormat extends UserDetailRes {
  formattedCreateTime: string; // 如 "2023年01月01日 12:00"
}
*/

✅ 2. api.ts.ftl(API 请求函数模板)

/**
 * ${table.comment!} API 接口封装
 *
 * 【设计目标】
 * 1. 基于 Axios 封装类型安全的 HTTP 请求
 * 2. 与后端 Controller 路径严格对齐(/${table.mappingPath})
 * 3. 返回 Promise,便于 async/await 使用
 * 4. 集成统一错误处理(通过 axios 拦截器)
 *
 * 【关键原则】
 * - 函数命名清晰:create${entity}、update${entity} 等
 * - 参数类型严格匹配 types.ts 中的定义
 * - 响应类型使用后端统一包装格式(ApiResponse<T>)
 * - 路径常量集中管理,避免硬编码
 *
 * @author ${author}
 * @since ${date}
 */

import axios, { AxiosPromise } from 'axios';
<#-- 导入类型定义 -->
import {
  ${entity}CreateReq,
  ${entity}UpdateReq,
  ${entity}Query,
  ${entity}DetailRes,
  ${entity}ListItemRes,
  PageRes
} from './types';

/**
 * API 路径常量
 */
const API_PREFIX = '/${table.mappingPath}';

/**
 * 统一响应包装(与后端 ApiResponse<T> 对齐)
 */
interface ApiResponse<T = any> {
  code: number;
  message: string;
  data: T;
}

/**
 * 创建 ${table.comment!}
 * @param data 创建请求参数
 * @returns 创建成功的详情
 */
export function create${entity}(data: ${entity}CreateReq): AxiosPromise<ApiResponse<${entity}DetailRes>> {
  return axios.post<ApiResponse<${entity}DetailRes>>(API_PREFIX, data);
}

/**
 * 更新 ${table.comment!}
 * @param data 更新请求参数
 * @returns 更新是否成功
 */
export function update${entity}(data: ${entity}UpdateReq): AxiosPromise<ApiResponse<boolean>> {
  return axios.put<ApiResponse<boolean>>(API_PREFIX, data);
}

/**
 * 根据 ID 删除 ${table.comment!}
 * @param id 主键 ID
 * @returns 删除是否成功
 */
export function delete${entity}(id: number): AxiosPromise<ApiResponse<boolean>> {
  return axios.delete<ApiResponse<boolean>>(`${API_PREFIX}/${id}`);
}

/**
 * 根据 ID 获取 ${table.comment!} 详情
 * @param id 主键 ID
 * @returns 详情数据
 */
export function get${entity}Detail(id: number): AxiosPromise<ApiResponse<${entity}DetailRes>> {
  return axios.get<ApiResponse<${entity}DetailRes>>(`${API_PREFIX}/${id}`);
}

/**
 * 获取 ${table.comment!} 列表(不分页)
 * @returns 列表数据
 */
export function list${entity}(): AxiosPromise<ApiResponse<${entity}ListItemRes[]>> {
  return axios.get<ApiResponse<${entity}ListItemRes[]>>(API_PREFIX);
}

/**
 * 分页查询 ${table.comment!} 列表
 * @param params 查询条件
 * @returns 分页数据
 */
export function page${entity}(params: ${entity}Query): AxiosPromise<ApiResponse<PageRes<${entity}ListItemRes>>> {
  return axios.get<ApiResponse<PageRes<${entity}ListItemRes>>>(API_PREFIX, { params });
}

/**
 * 【扩展建议】以下为常见场景示例(按需取消注释)
 */

/*
// 示例:批量删除
export function batchDelete${entity}(ids: number[]): AxiosPromise<ApiResponse<boolean>> {
  return axios.delete<ApiResponse<boolean>>(`${API_PREFIX}/batch`, { data: { ids } });
}

// 示例:导出
export function export${entity}(params: ${entity}Query): AxiosPromise<Blob> {
  return axios.get(`${API_PREFIX}/export`, {
    params,
    responseType: 'blob'
  });
}
*/

🔍 关键设计说明与最佳实践

1. 前后端类型对齐策略
后端 Java 类型前端 TypeScript 类型说明
Stringstring基础字符串
Integer/LongnumberJavaScript Number 足够
Booleanboolean布尔值
LocalDateTimestring必须用 ISO 8601 字符串,避免 Date 时区问题
List<T>T[]数组类型
Page<T>PageRes<T>自定义分页结构

⚠️ 重要:时间字段绝不使用 Date 对象!
原因:new Date("2023-01-01T12:00:00") 在不同浏览器/时区解析结果不一致,应由前端 UI 库(如 dayjs)按需格式化。

2. API 函数设计规范
  • ✅ 命名清晰:createUser、getUserDetail
  • ✅ 参数单一:每个函数只接收一个参数对象(便于扩展)
  • ✅ 返回 AxiosPromise:保留 Axios 的链式调用能力
  • ✅ 路径集中管理:API_PREFIX 避免路径硬编码
3. 安全与健壮性
  • 🔒 敏感字段过滤:模板中已排除 password、salt、deleted
  • 🔒 可选字段处理:查询参数使用 ? 标记可选
  • 🔒 空值处理:更新请求字段允许 null(表示清空)
4. 工程化集成建议
  • 代码生成流程:

    MyBatis-Plus Generator
    MyBatis-Plus Generator
    Java Entity/DTO
    types.ts
    api.ts
    前端项目
  • 类型安全验证:配合 openapi-typescript 双重校验

  • Mock 支持:在开发环境可 mock api.ts 函数


🛠️ 配套使用示例

(1) 前端调用示例(Vue/React)
// Vue 3 + Composition API
import { create${entity}, get${entity}Detail } from '@/api/${table.mappingPath}';

const handleCreate = async () => {
  try {
    const res = await create${entity}({
      username: 'zhangsan',
      email: 'zhangsan@example.com',
      age: 25
    });
    ElMessage.success('创建成功');
    // res.data.code === 200
    // res.data.data 包含详情
  } catch (error) {
    // 通过 axios 拦截器统一处理
  }
};
(2) Axios 拦截器(统一错误处理)
// request.ts
axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response?.data?.message) {
      ElMessage.error(error.response.data.message);
    }
    return Promise.reject(error);
  }
);

📦 项目结构建议

src/
├── api/
│   └── user/
│       ├── types.ts      ← 类型定义
│       └── index.ts      ← API 函数(即 api.ts)
├── views/
└── utils/

并在 vite.config.ts 或 webpack 中配置路径别名:

// vite.config.ts
resolve: {
  alias: {
    '@': path.resolve(__dirname, 'src')
  }
}

✅ 这两份模板体现了 “前后端契约驱动开发(CDC)” 和 “类型安全优先” 的现代前端工程思想:

  • 类型定义与后端 DTO/VO 严格对齐
  • API 函数封装完整、可维护
  • 时间处理、枚举、分页等高频场景全覆盖
  • 安全红线明确,杜绝敏感信息泄露

可作为团队标准模板,在代码生成流程中自动生成,大幅提升前后端协作效率与代码质量。

ESP32 LVGL开发板例程使用记录:自制常用汉字字库(二) 1、将下载的文件移入工程文件中 ,路径为项目文件中 ”......\lib\lvgl\src\font“文件夹下。3、修改字库配置文件,文件名为lv_conf.h中的内容,向其中加入下面内容(位置可搜索注释块来找到地方)修改完成可以编译试试,看是否成功,如字库较大时编译出错,请使能:LV_FONT_FMT_TXT_LARGE。2、打开此文件,修改包含头文件的路径,不然会报错,修改方法可对照自己库中其他字库文件中的包含路径。导入完成后在VSCode工程中可以查看到此文件。上次说完了如何制作 字库.c 文件。 阅读详情

相关推荐

【MBD开发】Simulink中的枚举

01 什么是枚举 按百度百科的词条【枚举】是在编程语言中用来存储一组固定的常量。不同编程语言的枚举语法也不一样,以C语言为例。 typedef enum{ GEAR_P, //0:P挡 GEAR_R, //1:倒挡 GEAR_N, //2:空挡 GEAR_D, //3:前进}_GEAR; 上面枚举了一个_GEAR数据,用GEAR_P表示0,GEAR_R表示1……​​​​​​​ if(current_gear==GEAR..

f6723的博客 3095

freemarker html 引入script_FreeMarker模板注入

一、简介FreeMarker是一款模板引擎,通过Java类库引入,模板文件简称为FTL(后缀可能也为这个)。输出方式为MVC(模型,视图,控制器)模式,适用于Web开发框架生成html页面。所以此类库经常应用于MVC开发模式的Java Web程序。二、利用与发掘既然简介为模板引擎,那么就一定有可以动态利用的地方。FreeMarker动态处理变量为${}格式,当然还有标签格式,这个稍后讲解...

weixin_34282558的博客 927

数据预处理的分箱操作

数据分箱 介绍 我们在建立模型前,一般需要对特征变量进行离散化,特征离散化后,模型会更稳定,降低模型过拟合的风险。尤其是采用 logsitic 建立评分卡模型时,必须对连续变量进行离散化。而特征离散化处理通常采用的就是分箱法,数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,提高泛化性。 数据分箱又分为有监督分箱和无监督分箱,是否使用标签进行离散化(分箱)决定了有监督还是无监督的离散化方法。 知识点 无监督分箱 split 分箱 merge 分箱 无监督分箱 这里为了

随笔记 5332

api.ts.ftl 和 types.ts.ftl 模板文件参考示例2

本文档提供了两个企业级TypeScript模板文件,用于生成安全的前端API客户端和类型定义。api.ts.ftl基于Axios实现类型安全的HTTP请求方法,包含分页查询、增删改查等标准CRUD操作,所有方法均有详细JSDoc注释。types.ts.ftl定义精确的类型接口,确保前后端数据交互零歧义。两个模板均采用现代前端开发规范,支持TypeScript类型检查,提供完整的中文注释,降低团队沟通成本。模板生成的文件严格遵循前后端分离架构,确保开发效率和代码质量。

python15397的博客 843

基于zynq在linux下的AXI-CAN实战

从petalinux的搭建,到uboot、kernel、rootfs的调试、打包提示:以下是本篇文章正文内容,下面案例可供参考本次要讲述的zynq的AXI-CAN实战小知识就说到这里了,兄弟萌要有什么指导意见或疑问可以在评论区留下"足迹"。

qq_45521099的博客 3163

unity | 动画模块之滚动选项框

动画模块之滚动选项框

菌菌兹的博客 2074

OpenCode Tool:从代码生成到开发工作流自动化的核心实践

代码生成是提升软件工程效率的关键技术,其核心原理在于通过模板引擎将数据模型转换为可执行代码,实现开发流程的标准化与自动化。这项技术的核心价值在于显著减少重复劳动、统一代码规范,并确保架构一致性,尤其适用于微服务、云原生等需要快速迭代和规范统一的现代应用场景。OpenCode Tool作为一个典型的工具链生态系统,深度集成了模板渲染、插件扩展与配置即代码等机制,能够高效处理领域实体生成、API联动、基础设施即代码等高频需求。通过将标准化和自动化理念融入开发工作流,它帮助团队从繁琐的CRUD和YAML编写中解放

weixin_34221332的博客 394

【算能】TPU 指令集架构深度解析

TPU指令集以领域专用性与数据流驱动为核心,通过精简指令集、硬件固化逻辑与高并行架构,实现张量计算的极致性能。开发者通常无需直接编写指令,但理解其设计原理对性能调优(如内存布局优化、指令调度)至关重要。算能TPU通过开放指令描述与编译器工具链,为垂直行业提供了更高灵活性的定制空间,而谷歌TPU则依赖编译器的全自动化优化,更适合大规模标准模型部署。未来,随着稀疏计算、光子计算等技术的引入,TPU指令集将进一步向高能效与高泛化性演进。

浩瀚之水的专栏 1182

Promise.all、allSettled、race、any 怎么选,失败后其他请求会怎样

通过局部失败和备用服务案例比较 Promise.all、allSettled、race、any,补充取消、fetch 状态、空输入和并发限制。程序员Sunday整理,完整问答收录于 sunday面试指南。

LGD_Sunday的专栏 227

【WLAN】【调试】如何使用Wireshark分析加密的WiFi数据包

- 当配置网卡为monitor 模式的情况下,可以使用 wireshark来抓取空口报文; - 如果WiFi采用非Open加密方式,则从报文中仅能分析到 802.11协议层,更底层(如DHCP、ICMP、TCP等)被加密,此时可以使用 wireshark 来完成解密。 - 解密之后,可以通过icmp、tcp等关键词过滤报文。

一介草民,只为生活。 2984

yolov8 PTQ和QAT量化实战(源码详解)

量化():是指将高精度浮点数(FP32)转换为低精度(8bit或4bit)整数的过程,它是模型部署中的一种非常重要的优化方法,可以在较少的精度损失下,大幅提供神经网络的效率和性能。目前主流的神经网络量化方式有PTQ和QATPTQ是训练后量化(),无需数据集和训练,直接量化模型权重QAT是量化感知训练(),量化后需要在数据集上继续微调训练。QAT过程中,我们首先需要选择哪些层需要进行finetune训练,并利用FP32对应层的输出作为监督进行训练。

@bangbang的博客 5326

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 325

精密装配机器人系列编程:ABB IRB 120_(20).编程项目设计与实施

在精密装配机器人系列编程中,项目的成功设计与实施涉及多个关键步骤。从项目需求分析到最终调试,每一个环节都需要细致的考虑和专业的技术。选择合适的编程语言、设计良好的程序结构、掌握调试技巧以及解决常见问题,都是确保机器人高效、稳定运行的重要因素。通过不断优化和改进,可以提高生产效率和产品质量,满足不断变化的生产需求。

zhubeibei168的博客 1242

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 316

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Claude Code 从入门到实战(一):安装、登录与第一个Vue项目

Claude Code 系列实战第 1 篇:先认识 Claude Code 的工作方式与任务循环,完成 npm 安装、登录与授权,通过让 Claude 理解一个 Vue 项目完成第一次实战任务,并辨析默认、自动接受编辑、Plan 规划等权限模式的差异与选择策略。

weixin_45284808的博客 203

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

DSH (DeepSeek Harness) Windows 升级安装指南20261107

注意:如果在普通窗口执行 nvm 提示找不到命令,或执行 nvm use 提示 Access is denied,请务必关闭当前窗口,重新打开一个管理员CMD 执行上述完整路径命令。找到 .credentials.yaml,将其重命名为 .credentials.yaml.bak(备份并使其失效)。Node.js Storage Location:可改到非系统盘(如 D:\dev\nvm,避免路径含空格或中文)。打开文件资源管理器,进入 C:\Users<你的用户名>.dsh\。

fengye207161的博客 165

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在

# SpringBoot「衣依」服装销售平台:144个Java文件180个接口,从挑衣服到收货评价整条链路都在 > 这是一套基于 Spring Boot 的服装销售平台源码,配套 `db.sql` 建表脚本,业务覆盖商品展示、购物车、订单流转、收货地址、订单评价、商品评论、在线客服、轮播图和资讯。形态是**前后台双端**:前台是顾客逛的商城,后台是管理员管的控制台。本文带你看清里面有什么、怎么跑

面朝大海 212

使用echarts模拟甘特图

项目中需按时间段展示不同颜色的数据,通过解析时长并统计各类型总时长,结合预设颜色映射表(含自定义与默认色),动态生成ECharts图表。利用sumByTypeName聚合数据,为每类分配对应颜色,实现图例与柱状图的精准匹配,确保多时段、多类型数据可视化清晰准确。

uuai 24

Agent 的 ReAct、Plan、Execute、Reflection 模式

本文系统解析 Agent 的 ReAct、Plan、Execute、Reflection 四模式,揭示其核心为“下一步谁定”与“错了怎么发现”两大问题。ReAct 逐步决策,适合动态环境但易冗余;Plan 一次性规划,高效却惧变化;Execute 严格落地,需明确判据与失败策略;Reflection 事后校验,强化纠错闭环。四者协同:外层规划,执行中嵌入思考,每步后反思,连续失败才重规划,构建稳定可控的智能体工作流。

2401_89855466的博客 316

货运APP、货运小程序开发:网络货运平台与同城配送搬家系统实战

本文介绍一套完整的货运平台系统,涵盖货运APP、小程序、网络货运、同城配送、搬家预约等场景,基于SpringBoot+MyBatisPlus+MySQL技术栈,采用uni-app实现多端统一开发,配套TMS运输管理与物流管理系统,支持下单、派单、运输、结算全流程,适用于货运搬家、物流搬运与配送业务,可作为物流软件及TMS系统的参考实现。

juzige03的博客 214

Vue3 低代码移动表单设计器实战(二):缩放画布下的拖拽系统与树状级联数据结构

本文深入剖析Vue3低代码表单设计器在缩放画布下的拖拽失效问题,揭示SortableJS在CSS Transform下坐标崩溃的数学根源。通过自研独立视觉克隆壳层与逆向几何补偿算法,实现精准拖拽;采用扁平数据存储+运行时树状计算结构,解决级联依赖与深克隆难题,确保逻辑一致性与性能优化,为复杂低代码系统提供可复用的工程范式。

NanChen的博客 331

Vue-Router

本文详解前端路由原理与实现,以网易云音乐为例,介绍通过 vue-router 实现页面无刷新切换。核心步骤包括:安装模块、创建路由实例、注册应用、配置页面组件与路由出口。使用 router-link 实现声明式导航,结合 query 和 params 传参,支持模糊与精确匹配激活状态。强调 useRoute(读取参数)与 useRouter(执行跳转)的区别,帮助开发者掌握单页应用路由的核心机制。

2301_79245606的博客 333

LangGraph == 循环结构的实现

这是静态约束,不会参与运行时校验。主要作用是提升代码可读性、通过静态类型检查,同时帮助 LangGraph。也就是说,是否继续重试,在当前实现中主要由大模型决定,而不是由程序逻辑强制保证。因此,如果模型在多次工具调用失败后选择停止重试并生成最终回答,运行图不会阻止它。函数,也不再需要调用 add_conditional_edges()只要大模型持续返回工具调用,流程就会不断回到 llm_node。的缩写,即“推理 + 行动”架构。,运行时只负责判断具体走哪一条路径。

每天都要努力学习哦~~ 342

华为校招笔试真题 10.28 - 稀疏整数求和(C++/Py/Java /Js/Go)

华为非AI笔试 10月28号真题,华为笔试第二题【稀疏整数求和】,提供详细思路讲解以及Java、C++、Python、Go、JavaScript多语言代码实现。华为非AI笔试笔试真题【稀疏整数求和】多语言题解。

qq_45776114的博客 615

Flux 架构:一个单向数据流库是怎么跑起来的

状态只有一份 + 数据单向流 + reducer 是纯函数 + 中间件链可组合 + 视图层声明式绑定。这 30 行就是这套思想的最小完整样本:两次useStore订阅、一次拿链式 dispatch、四个按钮对应四种 action(其中一种是 thunk 形态)。

sun_weitao的博客 105

DSH 插件调试避坑:client.js 设置面板、热重载与高频报错排查表

DSH 插件装死、热重载静默失败、客户端卡片不显示?本文拆透三大调试盲区:client.js 客户端插件的两种形态与 UI 卡片回退机制、HMR 热重载完整链路与静默 PENDING 陷阱、FiberState 诊断三件套,并附一张高频报错速查表,让排查从玄学变科学。

CFzjy的博客 270
上一篇: service.java.ftl(Service 接口模板标准规范版2)
下一篇: axios-config.ts.ftl(Axios 全局配置模板文件参考)
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值