AI编程实战:从安装到第一个项目,手把手教你用Cursor做开发
早上写了篇有关AI编程的理论,具体见公众号今天早上发布的文章《AI编程实战:从安装到第一个项目,手把手教你用Cursor做开发》
下午思考了下,还是需要有一篇如何动手AI编程的实战文章。
见过不少人装了Cursor、下了Claude Code,然后就没然后了。
不是因为工具难用,而是不知道从哪里开始。
这篇文章手把手带你从零开始,到跑通第一个真实项目。
学完之后,你可以:
用Cursor写一个完整的用户管理模块
知道怎么配置项目约束文件
理解什么人该交给AI,什么不该
一、安装Cursor:10分钟搞定
1.1 下载安装
官网地址:cursor.com
支持 Windows、macOS、Linux。安装包约200MB,双击一路点"下一步"即可。
小提示:windows的读者,安装路径建议不要选C盘。Cursor的缓存会占用不少空间。
1.2 登录账号
登录方式 | 优缺点 |
GitHub账号 | 快捷,推荐 |
邮箱注册 | 通用 |
免费版够用(有次数限制,每个重置次数限制),Pro版$20/月。
二、配置AI模型
2.1 支持的模型
模型 | 提供方 | 特点 |
Claude 3.5 Sonnet | Anthropic | 编程能力强,推荐 |
GPT-4o | OpenAI | 综合能力强 |
DeepSeek | 深度求索 | 国内可用,便宜 |
cursor-small | Cursor自带 | 免费但较弱 |
2.2 配置DeepSeek(国内用户推荐)(我用的cursor 3.2.21版本)
1. 打开Cursor设置:Cmd + ,(Mac)或 Ctrl + ,(Windows)
2. 点击左侧 Models 选项卡
3. 找到 OpenAI API Key 输入框,填入你的DeepSeek API Key
4. 找到 Override OpenAI Base URL(有些版本叫Base URL),填入:https://api.deepseek.com/v1
5. 向下滚动,找到 Add Model 按钮,点击
6. 在弹出框中手动输入模型名称:
`deepseek-chat`(常规编程,推荐)
或 `deepseek-reasoner`(深度推理)
验证配置:打开任意代码文件,按 Cmd + L 打开Chat面板,在模型下拉菜单中选择DeepSeek,发送一条消息测试。
三、第一个AI编程案例:用户注册功能
3.1 场景
做一个用户注册功能:
输入:用户名、邮箱、密码
处理:密码加密(bcrypt)、参数校验
输出:JWT token
3.2 项目结构
my-project/├── src/│ ├── app.py# Flask应用入口│ ├── models/│ │ └── user.py# 用户模型│ ├── routes/│ │ └── auth.py# 认证路由│ └── utils/│ └── jwt_utils.py# JWT工具├──.cursorrules# 项目约束文件├── requirements.txt └── README.md3.3 配置项目约束文件
在项目根目录创建 .cursorrules:
# 项目约定 ## 技术栈 - 后端:Python 3.11 + Flask - 数据库:SQLite(开发用) - ORM:SQLAlchemy - 密码加密:bcrypt - Token:PyJWT ## 编码规范 - Python函数命名:snake_case - 类命名:PascalCase - 注释:中文 - 行长度:不超过120字符 ## 错误处理 - 使用自定义异常类 - 所有API都要有try-except包裹 - 错误返回统一格式:{"code": 错误码, "message": "错误信息"} ## 禁止事项 - 不要使用eval() - 不要在代码里硬编码密码或密钥 - 不要省略参数类型注解3.4 开始写代码
Step 1:创建用户模型
打开 src/models/user.py,输入:
帮我创建用户模型,包含字段:id、用户名、邮箱、密码哈希、创建时间Cursor生成:
fromdatetimeimportdatetimefromsqlalchemyimportColumn,Integer,String,DateTimefromsqlalchemy.ext.declarativeimportdeclarative_base Base=declarative_base()classUser(Base): __tablename__="users"id=Column(Integer,primary_key=True,autoincrement=True)username=Column(String(50),unique=True,nullable=False,index=True)email=Column(String(100),unique=True,nullable=False,index=True)password_hash=Column(String(255),nullable=False)created_at=Column(DateTime,default=datetime.utcnow)def __repr__(self):returnf"<User {self.username}>"Step 2:审查并修改
审查后发现:
❌ 缺少密码最小长度验证
❌ 缺少updated_at字段
选中代码,按 Ctrl+K,输入:
添加:1.密码最小8位验证2.updated_at字段3.邮箱格式验证Cursor修改后:
importrefromdatetimeimportdatetimefromsqlalchemyimportColumn,Integer,String,DateTimefromsqlalchemy.ext.declarativeimportdeclarative_baseimportbcrypt Base=declarative_base()classUser(Base):__tablename__="users"id=Column(Integer,primary_key=True,autoincrement=True)username=Column(String(50),unique=True,nullable=False,index=True)email=Column(String(100),unique=True,nullable=False,index=True)password_hash=Column(String(255),nullable=False)created_at=Column(DateTime,default=datetime.utcnow)updated_at=Column(DateTime,default=datetime.utcnow,onupdate=datetime.utcnow)defset_password(self,password:str)->None:"""设置密码,自动加密"""iflen(password)<8:raiseValueError("密码至少8位")ifnotre.match(r"[^@]+@[^@]+\.[^@]+",self.email):raiseValueError("邮箱格式不正确")self.password_hash=bcrypt.hashpw(password.encode('utf-8'),bcrypt.gensalt()).decode('utf-8')defcheck_password(self,password:str)->bool:"""验证密码"""returnbcrypt.checkpw(password.encode('utf-8'),self.password_hash.encode('utf-8'))def__repr__(self):returnf"<User{self.username}>"Step 3:创建JWT工具
打开 src/utils/jwt_utils.py,输入:
帮我创建JWT工具类,包含:1.生成token方法2.验证token方法3.提取用户ID方法Cursor生成:
importjwtfromdatetimeimportdatetime,timedeltafromtypingimportOptionalclassJWTUtils:SECRET_KEY="your-secret-key-change-in-production"ALGORITHM="HS256"EXPIRE_HOURS=24@classmethoddefgenerate_token(cls,user_id:int)->str:"""生成JWT token"""expire=datetime.utcnow()+timedelta(hours=cls.EXPIRE_HOURS)payload={"user_id":user_id,"exp":expire,"iat":datetime.utcnow()}returnjwt.encode(payload,cls.SECRET_KEY,algorithm=cls.ALGORITHM)@classmethoddefverify_token(cls,token:str)->Optional[dict]:"""验证token,返回payload或None"""try:payload=jwt.decode(token,cls.SECRET_KEY,algorithms=[cls.ALGORITHM])returnpayloadexceptjwt.ExpiredSignatureError:returnNoneexceptjwt.InvalidTokenError:returnNone@classmethoddefget_user_id(cls,token:str)->Optional[int]:"""从token中提取用户ID"""payload=cls.verify_token(token)ifpayload:returnpayload.get("user_id")returnNoneStep 4:创建认证路由
打开 src/routes/auth.py,输入:
帮我创建用户认证路由,包含:1. 用户注册接口 POST /register2. 用户登录接口 POST /login 要求:参数校验、错误处理、返回格式统一Cursor生成:
fromflaskimportBlueprint,request,jsonifyfromsrc.models.userimportUser,Base,enginefromsrc.utils.jwt_utilsimportJWTUtilsfromsqlalchemy.ormimportsessionmakerfromsqlalchemy.excimportIntegrityError auth_bp=Blueprint('auth',__name__,url_prefix='/api/auth')Session=sessionmaker(bind=engine)classAPIError(Exception):"""自定义API异常"""def__init__(self,message:str,code:int=400):self.message=message self.code=codesuper().__init__(message)@auth_bp.errorhandler(APIError)defhandle_api_error(error):"""统一错误处理"""returnjsonify({"code":error.code,"message":error.message}),error.code@auth_bp.route('/register',methods=['POST'])defregister():"""用户注册"""data=request.get_json()ifnotdata:raiseAPIError("请求体不能为空",400)username=data.get('username','').strip()email=data.get('email','').strip()password=data.get('password','')ifnotusername:raiseAPIError("用户名不能为空",400)ifnotemail:raiseAPIError("邮箱不能为空",400)ifnotpassword:raiseAPIError("密码不能为空",400)user=User(username=username,email=email)try:user.set_password(password)exceptValueErrorase:raiseAPIError(str(e),400)session=Session()try:session.add(user)session.commit()returnjsonify({"code":200,"message":"注册成功","data":{"user_id":user.id,"username":user.username,"email":user.email}}),201exceptIntegrityError:session.rollback()raiseAPIError("用户名或邮箱已存在",409)finally:session.close()@auth_bp.route('/login',methods=['POST'])deflogin():"""用户登录"""data=request.get_json()ifnotdata:raiseAPIError("请求体不能为空",400)username=data.get('username','').strip()password=data.get('password','')ifnotusernameornotpassword:raiseAPIError("用户名和密码不能为空",400)session=Session()try:user=session.query(User).filter_by(username=username).first()ifnotuserornotuser.check_password(password):raiseAPIError("用户名或密码错误",401)token=JWTUtils.generate_token(user.id)returnjsonify({"code":200,"message":"登录成功","data":{"token":token,"user_id":user.id,"username":user.username}})finally:session.close()四、什么人该交给AI,什么不该
AI擅长的
场景 | 效果 | 示例 |
CRUD代码 | ⭐⭐⭐⭐⭐ | 用户管理、列表查询 |
重复性代码 | ⭐⭐⭐⭐⭐ | 增删改查、参数校验 |
代码翻译 | ⭐⭐⭐⭐⭐ | Java转Python |
代码优化 | ⭐⭐⭐⭐ | 重构、添加注释 |
测试生成 | ⭐⭐⭐⭐ | 单元测试、集成测试 |
AI不擅长的
场景 | 原因 | 建议 |
核心业务逻辑 | AI不懂你们公司的业务 | 自己做设计 |
复杂Bug定位 | 需要深入上下文 | 人工排查 |
架构决策 | 需要综合考量 | 团队讨论 |
安全敏感代码 | AI可能忽略安全细节 | 自己做审查 |
经验总结
AI写代码的标准流程:
1.我设计功能怎么做
2.AI写具体代码
3.我审查每一行
4.有问题让AI改
绝对不让AI做的:数据库schema设计、安全相关代码、核心算法
五、常见问题
Q1:Cursor免费版够用吗?
够用。免费版每月2000次Tab补全、50次慢速Premium请求。
Q2:AI生成的代码有bug怎么办?
正常。AI生成的代码一定要review。先让AI写100行以内的代码,写完立即测试。
Q3:Context窗口不够用怎么办?
每个功能开新对话,用.cursorrules配置项目规范。
六、总结
✅ 安装配置好了Cursor
✅ 配置好了AI模型
✅ 用Cursor写了完整的用户注册登录模块
✅ 知道什么该交给AI,什么不该
AI编程不是让你"躺平",而是让你把时间花在更有价值的地方。
关于作者
作者:近 20 年技术生涯,待过大厂也创过业。 懂大厂的规范与困境,也懂创业公司的敏捷与无奈。 懂技术也懂商业,实践用技术重构传统业务。
欢迎转发,转载请注明出处。
📌 觉得有用?欢迎:
点赞 - 让更多人看到
转发 - 分享给需要的同事/朋友
关注 - 不错过后续更多精彩内容分享
