Cursor AI IDE 开发者工具
- 官网下载:https://www.cursor.so/
Cursor 是一款智能开发者编程工具,底层是由Chat-GPT3.5 or Chat-GPT4.0支持的,不需要科学上网,国内可以直接使用。
重点:免费的 ,同时不需要账号登录。
安装支持:windwos、linux、mac
支持语言:支持 java、php、html、js、py、vue、go、css、c 等
Cursor 用法
先说下用法,很简单就两个快捷键操作:
- Ctrl+K 快捷键:把输出数据直接写入文件中。
- Ctrl+L 快捷键:把输出数据展示到右侧面板中(
输出的数据不会直接输出的文件中),类似智能问答系统,根据上下文有问有答。
Ctrl+K
Ctrl + K 快捷键:输入问题后,会把生成的答案直接写入到文档中。
- 不选中内容(代码)时,直接在文件光标位置开始编写内容。
- 选中内容(代码) 时,会在选择范围内进行编辑内容。
手动创建文件 main.html :
#快捷键
Ctrl + K
输入:使用html编写一个小游戏
#下面会帮你自动随机生成一个小游戏,由于没有指定游戏名称或类型。
效果:
<!DOCTYPE html>
<html>
<head>
<title>小游戏</title>
</head>
<body>
<h1>欢迎来到小游戏</h1>
<p>游戏规则:点击下面的按钮,看看你能得到多少分!</p>
<button onclick="addScore()">点击得分</button>
<p>得分:<span id="score">0</span></p>
<script>
var score = 0;
function addScore() {
score++;
document.getElementById("score").innerHTML = score;
}
</script>
</body>
</html>
Ctrl+L
Ctrl + KL 快捷键:输入问题后,会把生成的答案,展示到右侧的面板中,并且支持根据上下文继续问答。区别于
Ctrl + K,不会把答写入到文档中。
不选中内容(代码)时,根据全文内容+问题 进行一个上下文解答,然后在右侧面板中展示问题答案。
选中内容(代码) 时,根据选中内容+问题 进行一个上下文解答,然后在右侧面板中展示问题答案。
#快捷键
Ctrl + K
输入内容为:使用html编写一个小游戏
#下面会帮你在面板中自动随机生成一个小游戏,由于没有指定游戏名称或类型。
Cursor 应用示例
支持 java、php、html、js、py、vue、go、css、c 等
尝试了哪些功能:
- 生成文件上传Controller
- 添加swagger描述
- 添加方法代码实现
- 生成方法的注释和示例
- 新建接口以及接口实现类
- 完善实现类代码
- 优化代码
- 修复代码
- 排查代码存在什么问题
- 生成文件管理接口及实现类(多步骤,本地、minio、mongodb等实现类)
- 生成分片上传的前后端代码(多步骤)
- html代码生成
- vue代码生成
- Neo4j图库操作生成
- … …
分片上传示例
使用java语言,先创建 main.java 文件,文件名可自定义
#快捷键
Ctrl + K
输入:编写分片上传文件控制器
效果图:


#快捷键
Ctrl + A 全选中
#快捷键
Ctrl + K
输入:添加swagger描述



到此,Ctrl + K 基本用法已经演示完成了,是不是发现了一些问题,生成的方法内部并没有具体代码实现,仅仅是定义了类和方法,那么我们要如何让其帮助我们实现方法内部的代码,下面将展开演示:
操作:
补充方法中的代码实现
Ctrl + K
输入:先校验文件,再把文件存储到服务器中,返回文件存储路径
演示图:




上传接口已经好了,上传文件块和上次文件完成(合并)这两个接口是有关系的,因此,要先选中这两个方法,再进行Ctrl + K ,输入:补充代码实现,演示如下:
#快捷键
手动先选中 上传文件块和上传文件完成 方法
#快捷键
Ctrl + K
输入:补充代码实现
演示图:



根据和后台接口生成前端请求示例
#手动选择类中的方法
#快捷键
Ctrl + L
输入:生成html完整示例


#快捷键
Ctrl + L
输入:依据选中的方法,生成html完整示例
继续
演示图就不放了,和上面差不多。
通用文件管理接口及多实现示例
使用java语言,先创建 main.java 文件,文件名可自定义
#创建接口及接口的方法
Ctrl + K
输入:写一个通用文件管理接口,支持分片上传、合并、上传、下载、获取所有列表
#创建接口的实现类
Ctrl + K
输入:实现类 or minio实现类 or mongodb实现类
#完善接口实现类中代码实现, 先选中实现类
Ctrl + K
输入:补充代码实现
演示图:
不贴出来了,看最总成果展示贴出来的代码。
最总成果展示
以下代码,全部由Cursor生成,但是整个调试过程还是挺漫长的。
成果1-示例
注:代码全部是由ai自动生成
import org.apache.commons.io.IOUtils;
import org.bson.types.ObjectId;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.gridfs.GridFSBucket;
import com.mongodb.client.gridfs.GridFSBuckets;
import com.mongodb.client.gridfs.GridFSDownloadByNameOptions;
import com.mongodb.client.gridfs.GridFSDownloadStream;
import com.mongodb.client.gridfs.GridFSFile;
import com.mongodb.client.gridfs.GridFSUploadOptions;
import com.mongodb.client.gridfs.GridFSUploadStream;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.bson.Document;
import io.minio.MinioClient;
import io.minio.Result;
import io.minio.errors.MinioException;
import io.minio.messages.Item;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* 文件管理器接口
*/
public interface FileManager {
/**
* 上传文件分片
* @param inputStream 文件输入流
* @param fileName 文件名
* @param contentType 文件类型
* @param chunkIndex 分片索引
* @param totalChunks 总分片数
* @throws Exception 异常
*/
void uploadFileChunk(InputStream inputStream, String fileName, String contentType, int chunkIndex, int totalChunks) throws Exception;
/**
* 合并文件
* @param fileName 文件名
* @param chunkSize 分片大小
* @param totalChunks 总分片数
* @throws Exception 异常
*/
void mergeFile(String fileName, int chunkSize, int totalChunks) throws Exception;
/**
* 上传文件
* @param inputStream 文件输入流
* @param fileName 文件名
* @param contentType 文件类型
* @throws Exception 异常
*/
void uploadFile(InputStream inputStream, String fileName, String contentType) throws Exception;
/**
* 下载文件
* @param fileName 文件名
* @return 文件输入流
* @throws Exception 异常
*/
InputStream downloadFile(String fileName) throws Exception;
/**
* 删除文件
* @param fileName 文件名
* @throws Exception 异常
*/
void deleteFile(String fileName) throws Exception;
/**
* 列出所有文件
* @return 文件列表
*/
List<Document> listFiles();
}
public class FileManagerImpl implements FileManager {
private static final String FILE_DIRECTORY = "C:/fileStorage/";
@Override
public void uploadFileChunk(InputStream inputStream, String fileName, String contentType, int chunkIndex, int totalChunks) throws Exception {
File directory = new File(FILE_DIRECTORY);
if (!directory.exists()) {
directory.mkdirs();
}
try (FileOutputStream outputStream = new FileOutputStream(new File(directory, fileName + "_" + chunkIndex))) {
IOUtils.copy(inputStream, outputStream);
} catch (Exception e) {
throw new Exception("Failed to upload file chunk", e);
}
}
@Override
public void mergeFile(String fileName, int chunkSize, int totalChunks) throws Exception {
File directory = new File(FILE_DIRECTORY);
if (!directory.exists()) {
directory.mkdirs();
}
try (FileOutputStream outputStream = new FileOutputStream(new File(directory, fileName))) {
for (int i = 0; i < totalChunks; i++) {
try (FileInputStream inputStream = new FileInputStream(new File(directory, fileName + "_" + i))) {
IOUtils.copy(inputStream, outputStream);
}
}
} catch (Exception e) {
throw new Exception("Failed to merge file", e);
}
}
@Override
public void uploadFile(InputStream inputStream, String fileName, String contentType) throws Exception {
File directory = new File(FILE_DIRECTORY);
if (!directory.exists()) {
directory.mkdirs();
}
try (FileOutputStream outputStream = new FileOutputStream(new File(directory, fileName))) {
IOUtils.copy(inputStream, outputStream);
} catch (Exception e) {
throw new Exception("Failed to upload file", e);
}
}
@Override
public InputStream downloadFile(String fileName) throws Exception {
File file = new File(FILE_DIRECTORY + fileName);
if (!file.exists()) {
throw new Exception("File not found");
}
return new FileInputStream(file);
}
@Override
public void deleteFile(String fileName) throws Exception {
File file = new File(FILE_DIRECTORY + fileName);
if (!file.exists()) {
throw new Exception("File not found");
}
file.delete();
}
@Override
public List<Document> listFiles() {
File directory = new File(FILE_DIRECTORY);
File[] files = directory.listFiles();
List<Document> documents = new ArrayList<>();
if (files != null) {
for (File file : files) {
Document document = new Document();
document.setName(file.getName());
document.setSize(file.length());
document.put("storageType", "local");
documents.add(document);
}
}
return documents;
}
}
public class MinioFileManagerImpl implements FileManager {
private static final String BUCKET_NAME = "file-storage";
private static final String ENDPOINT = "http://localhost:9000";
private static final String ACCESS_KEY = "minioadmin";
private static final String SECRET_KEY = "minioadmin";
private final MinioClient minioClient;
public MinioFileManagerImpl() throws Exception {
minioClient = new MinioClient(ENDPOINT, ACCESS_KEY, SECRET_KEY);
if (!minioClient.bucketExists(BUCKET_NAME)) {
minioClient.makeBucket(BUCKET_NAME);
}
}
@Override
public void uploadFileChunk(InputStream inputStream, String fileName, String contentType, int chunkIndex, int totalChunks) throws Exception {
String objectName = fileName + "_" + chunkIndex;
minioClient.putObject(BUCKET_NAME, objectName, inputStream, contentType);
}
@Override
public void


3万+

被折叠的 条评论
为什么被折叠?



