Cursor AI IDE 开发者工具

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

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
输入:编写分片上传文件控制器

效果图:

1.png

2.png

#快捷键
Ctrl + A  全选中

#快捷键
Ctrl + K
输入:添加swagger描述

3.png

4.png

5.png

到此,Ctrl + K 基本用法已经演示完成了,是不是发现了一些问题,生成的方法内部并没有具体代码实现,仅仅是定义了类和方法,那么我们要如何让其帮助我们实现方法内部的代码,下面将展开演示:

操作:

补充方法中的代码实现

Ctrl + K
输入:先校验文件,再把文件存储到服务器中,返回文件存储路径

演示图:

5.png

6.png

7.png

8.png

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

#快捷键
手动先选中 上传文件块和上传文件完成 方法

#快捷键
Ctrl + K
输入:补充代码实现

演示图:

11.png

12.png

13.png

根据和后台接口生成前端请求示例
#手动选择类中的方法

#快捷键
Ctrl + L
输入:生成html完整示例

14.png

15.png

#快捷键
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 

AI 时代程序员必备技能

Codex、Claude Code、Cursor、Hermes Agent、OpenClaw等工程化实战专栏 ,讲透 AI 如何接管脏活累活

评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宇宙小神特别萌

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

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

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

打赏作者

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

抵扣说明:

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

余额充值