GraphQL基础知识与Spring for GraphQL使用教程
文章目录
- 1、数据类型
- 1.1、标量类型
- 1.2. 高级数据类型
- 基本操作
- 2、Spring for GraphQL实例
- 2.1、项目目录
- 2.2、数据库表
- 2.3、GraphQL的schema.graphql
- 2.4、Java代码
- 3、运行效果
- 3.1、添加用户
- 3.2、添加日志
- 3.3、查询所有日志
- 3.4、查询指定用户日志
- 3.5、数据订阅
- 4、总结
GraphQL是一种用于API开发的查询语言和运行时环境。它由Facebook开发并于2015年开源。GraphQL的主要目标是提供一种更高效、灵活和易于使用的方式来获取和操作数据。与传统的RESTful API相比,GraphQL允许客户端精确地指定需要的数据,并减少了不必要的网络传输和数据处理。
采用GraphQL,甚至不需要有任何的接口文档,在定义了Schema之后,服务端实现Schema,客户端可以查看Schema,然后构建出自己需要的查询请求来获得自己需要的数据。
1、数据类型
1.1、标量类型
- Int -32位整型数字;
- Float-双精度浮点型;
- String-UTF‐8 字符序列;
- Boolean-布尔型,true 或者 false;
- ID-标识类型,唯一标识符,注意此ID为字符,如果使用Mysql自增长id,也会自动转为对应的字符串;
1.2. 高级数据类型
- Object - 对象,用于描述层级或者树形数据结构。Object类型有一个类型名,以及类型包含的字段。
type Product {id: ID!info: String!price: Float
}
在此示例中,声明了Product对象类型,定义了3 个字段:
id:非空 ID 类型。
info:非空字符串类型。
price:浮点型。
- Interface-接口,用于描述多个类型的通用字;与 Object一样。
interface Product {id: ID!info: String!price: Float
}
- Union-联合类型,用于描述某个字段能够支持的所有返回类型以及具体请求真正的返回类型;
- Enum-枚举,用于表示可枚举数据结构的类型;
enum Status {YesNo
}
type Product {id: ID!info: String!price: Floatstat: Status
}
- Input-输入类型input本质上也是一个type类型,是作为Mutation接口的输入参数。换言之,想要定义一个修改接口(add,update,delete)的输入参数对象,就必须定义一个input输入类型。
input BookInput {isbn: ID!title: String!pages: IntauthorIdCardNo: String
}
- List -列表,任何用方括号 ([]) 括起来的类型都会成为 List 类型。
type Product {id: ID!info: Stringprice: Floatimages: [String]
}
- Non-Null-不能为 Null,类型后边加!表示非空类型。例如,String 是一个可为空的字符串,而String!是必需的字符串。
基本操作
- Query(只读操作)
#schema.graphqls定义操作
type Query {allBooks: [Book]!bookByIsbn(isbn: ID): Book
}# 接口查询语法
query{allBooks {titleauthor {nameage}}
}
- Mutation(可写操作)
#schema.graphqls定义操作
type Mutation {createBook(bookInput: BookInput): BookcreateAuthor(authorInput: AuthorInput): Author
}# mutation{
# createAuthor(authorInput:{
# idCardNo: "341234567891234567",
# name:"test1",
# age:38
# }
# ){
# name
# age
# }
# }
- Subscription(订阅操作)
type Subscription {greetings: String
}
2、Spring for GraphQL实例
GraphQL只是一种架构设计,具体的实现需要各个技术平台自己实现,目前主流的开发语言基本都已经有现成的类库可以使用,GraphQL Java就是Java平台的实现。
GraphQL Java虽然实现了GraphQL,但是只是一个执行GraphQL请求的引擎,用户在使用中需要创建自己的HTTP服务来提供服务。
Spring for GraphQL为基于GraphQL Java构建的Spring应用程序提供支持,来自 GraphQL Java 团队,它的目标是成为所有Spring、GraphQL应用程序的基础。
spring-graphql中定义的核心注解如下:
- @GraphQlController:申明该类是GraphQL应用中的控制器
- @QueryMapping:申明该类或方法使用GraphQL的query操作,等同于@SchemaMapping(typeName = “Query”),类似于@GetMapping
- @Argument:申明该参数是GraphQL应用的入参
- @MutationMapping:申明该类或方法使用GraphQL的mutation操作,等同于@SchemaMapping(typeName = “Mutation”)
- @SubscriptionMapping:申明该类或方法使用GraphQL的subscription操作,等同于@SchemaMapping(typeName = “Subscription”)
- @SchemaMapping:指定GraphQL操作类型的注解,类似@RequestMapping
2.1、项目目录
项目代码目录

2.2、数据库表
数据表结构,这里例子简单用了用户表和用户日志表
CREATE TABLE `admin_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4CREATE TABLE `admin_log` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` varchar(255) DEFAULT NULL,`visit_url` varchar(255) DEFAULT NULL,`create_date` datetime DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4
2.3、GraphQL的schema.graphql
GraphQL对应的schema.graphql定义文件,注意GraphQL默认只支持标量类型,DateTime自定义类型使用graphql-java-extended-scalars:https://github.com/graphql-java/graphql-java-extended-scalars提供
scalar DateTimetype AdminUser{id: ID!name: String!
}type AdminLog{id: ID!visitUrl: Stringuser: AdminUser!createDate: DateTime
}type Query {allLogs:[AdminLog]logByUser(userid: ID): [AdminLog]
}type Mutation {createUser(adminUserInput: AdminUserInput): AdminUsercreateLog(adminLogInput: AdminLogInput): AdminLog
}input AdminLogInput {userId: String!visitUrl: StringcreateDate: DateTime
}input AdminUserInput {name: String!
}type Subscription {greetings: String
}
2.4、Java代码
pom.xml依赖包文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.10</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.penngo.example</groupId><artifactId>graphql-app</artifactId><version>0.0.1-SNAPSHOT</version><name>graphql-app</name><description>graphql-app project for Spring Boot</description><properties><java.version>17</java.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-graphql</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.23</version></dependency><!-- https://mvnrepository.com/artifact/com.graphql-java/graphql-java-extended-scalars --><dependency><groupId>com.graphql-java</groupId><artifactId>graphql-java-extended-scalars</artifactId><version>19.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build><repositories><repository><id>alimaven</id><name>Maven Aliyun Mirror</name><url>https://maven.aliyun.com/repository/central</url></repository></repositories><pluginRepositories><pluginRepository><id>aliyun-plugin</id><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases><snapshots><enabled>false</enabled></snapshots></pluginRepository></pluginRepositories></project>
对应的数据库实体类
package com.penngo.example.entity;import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.OffsetDateTime;@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdminLog {@Id@GeneratedValue(strategy= GenerationType.IDENTITY)private Long id;private String userId;private String visitUrl;private OffsetDateTime createDate;
}package com.penngo.example.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AdminUser {@Id@GeneratedValue(strategy= GenerationType.IDENTITY)private Long id;private String name;
}
GraphQL对应的输入类
package com.penngo.example.entity;
import lombok.Data;
import java.time.OffsetDateTime;
@Data
public class AdminLogInput {private String userId;private String visitUrl;private OffsetDateTime createDate;}package com.penngo.example.entity;
import lombok.Data;
@Data
public class AdminUserInput {private String name;
}
对应的数据库操作类
package com.penngo.example.repository;
import com.penngo.example.entity.AdminUser;
import org.springframework.data.jpa.repository.JpaRepository;
public interface AdminUserRepository extends JpaRepository<AdminUser,Long> {AdminUser findById(String userId);
}package com.penngo.example.repository;
import com.penngo.example.entity.AdminLog;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;public interface AdminLogRepository extends JpaRepository<AdminLog,Long> {List<AdminLog> findAllByUserId(String userId);
}
对外服务接口类
package com.penngo.example.controller;
import com.penngo.example.entity.*;
import com.penngo.example.repository.AdminLogRepository;
import com.penngo.example.repository.AdminUserRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.graphql.data.method.annotation.SchemaMapping;
import org.springframework.stereotype.Controller;
import java.util.List;@Controller
public class AdminLogController {private final AdminUserRepository adminUserRepository;private final AdminLogRepository adminLogRepository;public AdminLogController(AdminUserRepository adminUserRepository, AdminLogRepository adminLogRepository){this.adminLogRepository = adminLogRepository;this.adminUserRepository = adminUserRepository;}@QueryMappingpublic List<AdminLog> allLogs(){List<AdminLog> logsList = adminLogRepository.findAll();return logsList;}@QueryMappingpublic List<AdminLog> logByUser(@Argument String userid){return adminLogRepository.findAllByUserId(userid);}@SchemaMapping(typeName = "AdminLog" ,field = "user")public AdminUser getAuthor(AdminLog adminLog){AdminUser adminUser = adminUserRepository.findById(adminLog.getUserId());return adminUser;}@MutationMappingpublic AdminLog createLog(@Argument AdminLogInput adminLogInput){AdminLog log = new AdminLog();BeanUtils.copyProperties(adminLogInput,log);return adminLogRepository.save(log);}
}package com.penngo.example.controller;
import com.penngo.example.entity.*;
import com.penngo.example.repository.AdminLogRepository;
import com.penngo.example.repository.AdminUserRepository;
import org.springframework.beans.BeanUtils;
import org.springframework.graphql.data.method.annotation.Argument;
import org.springframework.graphql.data.method.annotation.MutationMapping;
import org.springframework.graphql.data.method.annotation.QueryMapping;
import org.springframework.stereotype.Controller;
import java.util.List;@Controller
public class AdminUserController {private final AdminUserRepository adminUserRepository;private final AdminLogRepository adminLogRepository;public AdminUserController(AdminUserRepository adminUserRepository, AdminLogRepository adminLogRepository){this.adminLogRepository = adminLogRepository;this.adminUserRepository = adminUserRepository;}@QueryMappingpublic List<AdminLog> userById(@Argument String userid){return adminLogRepository.findAllByUserId(userid);}@MutationMappingpublic AdminUser createUser(@Argument AdminUserInput adminUserInput){AdminUser user = new AdminUser();BeanUtils.copyProperties(adminUserInput,user);return adminUserRepository.save(user);}
}package com.penngo.example.controller;
import com.penngo.example.entity.AdminLog;
import com.penngo.example.repository.AdminLogRepository;
import com.penngo.example.repository.AdminUserRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.graphql.data.method.annotation.SubscriptionMapping;
import org.springframework.stereotype.Controller;
import reactor.core.publisher.Flux;
import java.time.Duration;@Controller
public class GreetingController {private final AdminUserRepository adminUserRepository;private final AdminLogRepository adminLogRepository;public GreetingController(AdminUserRepository adminUserRepository, AdminLogRepository adminLogRepository){this.adminLogRepository = adminLogRepository;this.adminUserRepository = adminUserRepository;}// 数据订阅,取最新的5条数据,每5秒发送一条给客户端,一共5次@SubscriptionMappingpublic Flux<AdminLog> greetings(){System.out.println("greetings====================");Page<AdminLog> logsList = adminLogRepository.findAll(PageRequest.of(0,5).withSort(Sort.Direction.DESC, "id"));return Flux.fromStream(logsList.stream()).delayElements(Duration.ofSeconds(5)).take(5);}
}
自定义日期数据类型DateTime
package com.penngo.example.component;
import graphql.scalars.ExtendedScalars;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.graphql.execution.RuntimeWiringConfigurer;@Configuration
public class CustomScalarType {@Beanpublic RuntimeWiringConfigurer runtimeWiringConfigurer() {return wiringBuilder -> wiringBuilder.scalar(ExtendedScalars.DateTime);}
}
服务启动类
package com.penngo.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class GraphqlAppApplication {public static void main(String[] args) {SpringApplication.run(GraphqlAppApplication.class, args);}
}
3、运行效果
3.1、添加用户
添加用户
mutation{ createUser(adminUserInput: { name: "test1", } ) { id name } }

3.2、添加日志
添加日志
mutation{createLog(adminLogInput: {userId: "1",visitUrl: "http://localhost:8080/method1"createDate: "2023-09-17T19:39:57+08:00"} ){idvisitUrlcreateDate} }

3.3、查询所有日志
查询所有日志
query{allLogs{idvisitUrluser{idname}createDate}
}

3.4、查询指定用户日志
查询指定用户日志
query{logByUser(userid:"1") {idvisitUrluser{idname}createDate}
}

3.5、数据订阅
数据订阅,订阅需要有websocket的支持。
subscription {greetings
}


4、总结
使用Spring for GraphQL试用了GraphQL后,它实现按需取数据的功能。服务器开发人员和前端开发人员可以通过schema.graphqls定义文件,协定好接口和数据,省掉写接口文档的工作。
缺点可能就是需要一点学习成本,虽然提供数据嵌套可以通过一个请求获取所有数据,但是嵌套复杂可能引起性能问题。
Spring for GraphQL官方参考:https://docs.spring.io/spring-graphql/docs/current/reference/html/#overview
相关文章:
GraphQL基础知识与Spring for GraphQL使用教程
文章目录 1、数据类型1.1、标量类型1.2. 高级数据类型 基本操作2、Spring for GraphQL实例2.1、项目目录2.2、数据库表2.3、GraphQL的schema.graphql2.4、Java代码 3、运行效果3.1、添加用户3.2、添加日志3.3、查询所有日志3.4、查询指定用户日志3.5、数据订阅 4、总结 GraphQL…...
【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析
【SA8295P 源码分析】97 - QNX AIS Camera 框架介绍 及 Camera 工作流程分析 一、QNX AIS Server 框架分析二、QNX Hypervisor / Android GVM 方案介绍三、Camera APP 调用流程分析四、QCarCam 状态转换过程介绍五、Camera 加串-解串 硬件链路分析六、摄像头初始化检测过程介绍…...
威胁的数量、复杂程度和扩散程度不断上升
Integrity360 宣布了针对所面临的网络安全威胁、数量以及事件响应挑战的独立研究结果。 数据盗窃、网络钓鱼、勒索软件和 APT 是最令人担忧的问题 这项调查于 2023 年 8 月 9 日至 14 日期间对 205 名 IT 安全决策者进行了调查,强调了他们的主要网络安全威胁和担忧…...
NSSCTF web 刷题记录2
文章目录 前言题目[广东强网杯 2021 团队组]love_Pokemon[NCTF 2018]Easy_Audit[安洵杯 2019]easy_web[NCTF 2018]全球最大交友网站prize_p2[羊城杯 2020]easyser[FBCTF 2019]rceservice方法一方法二 前言 今天是2023年9月13号,刷题记录2正式开始。时间来到九月十七…...
Linux驱动之INPUT子系统框架
目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…...
Long类型雪花算法ID返回前端后三位精度缺失问题解决
目录 一、问题描述二、问题复现1.Maven依赖2.application.yml 配置3.DemoController.java4.snowflakePage.html 页面5.DemoControllerAdvice.java 监听6.问题复现 三、原因分析四、问题解决方案一方案二 一、问题描述 Java 后端使用雪花算法生成 Long 类型的主键 ID࿰…...
6.8-SpringIoC之循环依赖底层源码解析
解决靠,三级缓存 创建Map,存不完整的Bean 存在问题:属性存在但没有值...
Springboot 实践(18)Nacos配置中心参数自动刷新测试
前文讲解了Nacos 2.2.3配置中心的服务端的下载安装,和springboot整合nacos的客户端。Springboot整合nacos关键在于使用的jar版本要匹配,文中使用版本如下: ☆ springboot版本: 2.1.5.RELEASE ☆ spring cloud版本 Greenwich.RELEASE ☆ sp…...
uniapp引入小程序原生插件
怎么在uniapp中使用微信小程序原生插件,以收钱吧支付插件为例 1、在manifest.json里的mp-weixin中增加插件配置 "mp-weixin" : {"appid" : "你的小程序appid","setting" : {"urlCheck" : false},"usingCom…...
自己记录微信小程序开发遇到的问题
在HBuilder X中【运行】--【小程序】--【运行设置】,小程序运行配置,将【微信开发者工具】的安装路径配置进去,首次运行会自动让你填写; 1、hbuildx运行到微信开发者工具报错 Error: Unbalanced delimiter found in string 错误…...
【leetcode 力扣刷题】栈—波兰式///逆波兰式相关知识和题目
波兰式、逆波兰式相关知识和题目 波兰式、逆波兰式介绍常规表达式转换成逆波兰式编程让常规表达式转换成逆波兰式逆波兰式运算过程常规表达式转换成波兰式编程让常规表达式转换成波兰式波兰式运算过程 150. 逆波兰式表达式求值224. 基本计算器227. 基本计算器Ⅱ282. 给表达式添…...
Web 第一步:HTTP 协议(基础)
这里是JavaWeb的开头部分!那么先解释一下吧: Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。 JavaWeb:是用Java技术来解决相关 Web 互联网领域的技术栈。 …...
【Vue】快速入门案例与工作流程的讲解
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟在这里,我要推荐给大家我的专栏《Vue快速入门》。…...
LuatOS-SOC接口文档(air780E)--camera - codec - 多媒体-编解码
常量 常量 类型 解释 codec.MP3 number MP3格式 codec.WAV number WAV格式 codec.AMR number AMR-NB格式,一般意义上的AMR codec.AMR_WB number AMR-WB格式 codec.create(type, isDecoder) 创建编解码用的codec 参数 传入值类型 解释 int 多媒…...
《动手学深度学习 Pytorch版》 6.6 卷积神经网络
import torch from torch import nn from d2l import torch as d2l6.6.1 LeNet LetNet-5 由两个部分组成: - 卷积编码器:由两个卷积核组成。 - 全连接层稠密块:由三个全连接层组成。模型结构如下流程图(每个卷积块由一个卷积层、…...
【微信小程序】项目初始化
| var() CSS 函数可以插入一个自定义属性(有时也被称为“CSS 变量”)的值,用来代替非自定义 属性中值的任何部分。 1.初始化样式与颜色 view,text{box-sizing: border-box; } page{--themColor:#ad905c;--globalColor:#18191b;--focusColor…...
C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序
凑数的,仅供参考。 1 文本格式 /// <summary> /// 《小白学程序》第二十六课:大数(BigInteger)的Toom-Cook 3乘法 /// Toom-Cook 3-Way Multiplication /// </summary> /// <param name"a"></par…...
destoon自定义一个archiver内容文档
在archiver目录建立以下代码: <?php define(DT_REWRITE, true); require ../common.inc.php; $EXT[archiver_enable] or dheader(DT_PATH); //$DT_BOT or dheader(DT_PATH); $N $M $T array(); $mid or $mid 5; $vmid $list 0; foreach($MODULE as $k>…...
5-1 Dataset和DataLoader
Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。 Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素。 而DataLoader定义了按batch加载数据集的方法,它是…...
IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件
原因: 这是由于新建的Maven工程,IDEA会用它内置的默认的Maven版本,使用国外的网站下载Maven所需的插件,速度很慢 。 解决方式: 每次创建 Project 后都需要设置 Maven 家目录位置(就是我们自己下载的Mav…...
厘米级无感定位 + 毫秒级动态重建,镜像视界破解智造虚实脱节难题
厘米级无感定位 毫秒级动态重建,镜像视界破解智造虚实脱节难题植根数字孪生与视频孪生核心赛道,镜像视界(浙江)科技有限公司依托自研视频原生空间智能技术体系,以厘米级无感定位与毫秒级动态重建两大核心技术能力&…...
iCircuit:iPad上的电子电路仿真神器,从原理到实践全解析
1. 项目概述与核心价值 最近和一位老朋友Alvin聊天,他是一位资深的硬件工程师,我们曾一起合作过一些项目。他兴奋地给我发来一封邮件,强烈推荐了一款他正在使用的iPad应用——iCircuit。这让我立刻提起了兴趣,因为在移动设备上进行…...
AI-Native数据分析:43 次工具调用,蒸馏成 1 张可复用的知识卡片
很多人最近都在聊 AI-native 工作流, 也在聊"蒸馏"自己的知识库. 但聊得多, 真正落地的人少 —— 因为大家手里的 AI 工具大多停留在 "AI-enabled" 阶段: 一次性问答工具, 用完即弃, 每次重新对一遍口径.这篇文章想用一条真实的 InfiniSynapse 任务回放, 把…...
基于MCP协议与向量检索,为AI编程助手构建跨会话持久记忆
1. 项目概述:为AI编程助手构建持久记忆如果你和我一样,日常重度依赖Cursor、Claude Code、Windsurf这类AI编程助手,那你一定遇到过这个让人头疼的场景:昨天在Cursor里花了半小时跟AI解释清楚了一个复杂模块的业务逻辑和设计思路&a…...
KG与LLM:大模型时代的智能规划
这些文章给出的“推荐思路”可以浓缩成一句话 先用 Planner 产出 subgoal dependency acceptance criteria。再让 Router 判断每个子任务该走 向量RAG、KG、数据库还是工具。对需要关系、多跳、时序、因果的问题,用 KG / event graph 做结构化检索,而…...
【AI工具推荐】Awesome DESIGN.md - 让AI生成像素级完美UI的设计神器
有兴趣的朋友,点点关注。每天分享一个AI工具。每天分享一个AI工具,今天推荐:Awesome DESIGN.md - 一个让AI代理能够生成像素级完美UI的开源设计系统集合项目简介 Awesome DESIGN.md 是一个精心策划的DESIGN.md文件集合,灵感来源于…...
基于Web Audio与Three.js的VR音乐可视化系统开发实践
1. 项目概述:当音乐可视化遇上VR,一次沉浸式体验的探索最近在折腾一个挺有意思的项目,叫“VersaYT/JellyVR”。乍一看这个名字,可能有点摸不着头脑,它其实是一个将YouTube音乐视频的音频频谱,实时转化为虚拟…...
半导体供应链风险管理:从噪音中识别信号,构建韧性决策框架
1. 从一则旧闻看半导体产业的“噪音”与“信号”2013年春天,一则关于朝鲜可能威胁韩国三星和SK海力士内存芯片工厂的消息,在投资圈和部分科技媒体中泛起了一阵涟漪。一位来自俄亥俄州的投资者言之凿凿,指出全球65%的DRAM和55%的闪存产能集中在…...
macOS桌面歌词终极解决方案:LyricsX 2.0完整指南
macOS桌面歌词终极解决方案:LyricsX 2.0完整指南 【免费下载链接】Lyrics Swift-based iTunes plug-in to display lyrics on the desktop. 项目地址: https://gitcode.com/gh_mirrors/lyr/Lyrics 你是否曾经在听音乐时,想要跟着歌词一起唱却发现…...
BetaClaw:开源AI代理运行时,统一多模型调用与智能成本控制
1. 项目概述:一个为开发者打造的“瑞士军刀”级AI代理运行时如果你和我一样,每天都在和不同的AI模型打交道,那你一定也经历过这种痛苦:想用Claude写点创意文案,得去Anthropic的API;想用GPT-4o分析代码&…...
