Claude Code实战:自然语言驱动开发学生选课管理系统全流程
最近帮朋友带一个课程设计项目题目就是学生管理系统。这东西说难不难但真要一步步手写表单、路由、数据库、增删改查一套下来工作量也不小。正值手头的 Claude Code 用得比较顺手索性就拿它来试了一把用自然语言对话的方式从零搭了一个学生选课管理系统。整个过程基本是我描述需求Claude Code 写代码、改文件、跑命令我再 review 和调优。今天把整个实战过程梳理出来包括安装配置、对话开发、模块实现、踩坑记录希望对想用 AI 辅助写业务系统的朋友有点参考价值。这个项目适合这几类人一是正在做学生管理系统或类似 CRUD 课设、毕设的同学二是想试试 Claude Code 但还没上手的开发者三是对 AI 编程工具持观望态度、想看看实际效果的人。我会尽量把操作细节写完整包括命令、配置项、Prompt 写法和遇到的问题包你拿过去就能照着跑。1. 为什么选 Claude Code 来做学生管理系统1.1 学生管理系统到底在解决什么问题学生管理系统说白了就是一堆数据的增删改查。学生信息要录、课程信息要维护、学生要选课、老师要录成绩、管理员要管理所有东西。几乎每个计算机专业的学生都做过类似的课设业务本身不复杂但繁琐。真正消耗时间的地方在于系统包含多个相互关联的功能模块学生表、教师表、课程表、选课表、成绩表彼此之间有外键约束选课要判断课程容量和选课时间成绩要跟选课记录绑定。这种数据模型一旦设计不合理后面写代码时会在各种 JOIN 查询里吃苦头。我当时的需求是这样一个简单的学生选课管理系统角色分为管理员、教师、学生。管理员维护学生和教师信息教师负责开课和录成绩学生可以查看课程列表并进行选课、退课操作。技术栈没打算搞得太重选了 Python Flask SQLite够用且方便演示跑起来没有额外依赖。1.2 为什么选择 Claude Code 而不是直接手写或找模板市面上现成的学生管理系统模板非常多但大多数年代久远技术栈老旧要么是 JSP Servlet要么是 PHP 老项目代码风格和现代开发习惯差距很大。直接拿来改反而要花大量时间理解别人的逻辑不如自己搭。另一个方案是纯手写工作量其实也还好但问题在于重复劳动太多每个模块都要写路由、写模板、写表单校验、写数据库操作。这些事情对老手来说没有技术含量但对时间紧的同学来说确实是负担。Claude Code 解决的是“重复劳动”这部分。它不是一个简单的代码补全工具而是能直接在终端里读取项目文件、生成代码、执行命令、根据报错信息自行修复的智能体。你只需要把需求讲清楚它会把后端、前端、数据库一次性给你搭起来。用它的核心价值不是“AI 帮我写代码”而是“AI 帮我把一小段业务逻辑从想法变成可运行的代码”我再花精力做审查和修正等于把工时压缩到了原来的三分之一左右。1.3 Claude Code 的工作方式和传统 AI 编程工具有什么不同用之前我也用过不少 AI 编程工具大多数是在 IDE 里做代码补全或单文件生成。Claude Code 的差异在于它运行在终端中被授予了读写项目文件和执行命令的能力所以它可以完成整条任务链路。以“新增一个学生管理页面”这个任务为例。传统 AI 补全工具能做到的是你打开 student.py输入注释它帮你补出函数体。而 Claude Code 能做的是你在对话里说“创建一个学生管理模块包括数据表、API 路由和前端页面”它会自动创建相关文件、写代码、安装依赖、启动服务甚至能在你启动后说“页面报错 500”它自己去看日志、修复、再重启。这种“带手带脚”的协作方式让开发节奏发生了根本变化。你需要从一个“写代码的人”变成一个“审查代码和定义需求的人”。刚开始会有点不适应因为总觉得不亲手写一遍不放心但跑通第一个完整功能后你会发现效率确实不一样。2. 环境准备安装 Claude Code 并接入开发环境2.1 安装前需要确认的前置条件Claude Code 目前是一个基于 Node.js 的命令行工具所以第一步是确认你的机器上有 Node.js 环境。不同操作系统的安装方式略有差异但前提一致Node.js 版本要求 18 以上建议直接装最新的 LTS 版本。我建议在开始之前先准备好一个独立的工作目录。后面会让 Claude Code 直接在当前目录下生成文件如果把项目文件散落在系统目录或已有项目里会让它的操作范围变得难以控制也容易把无关文件改坏。还有个容易被忽略的点是账号权限。Claude Code 需要登录 Claude 账号才能使用。账号类型会影响使用额度和速度具体根据你手上的账号情况来。首次使用时它会要求登录认证过程不复杂但一定要保证网络通畅避免认证中断。我当时就是在网络不稳定的情况下反复登录失败了几次后面换了网络环境一次就过了。2.2 安装 Claude Code 的具体步骤安装过程其实很简单核心就是一条 npm 命令。打开终端执行npm install -g anthropic-ai/claude-code全局安装的好处是之后在任何目录下都能直接使用claude命令。等待安装完成后执行版本检查claude --version如果能看到版本号输出说明安装成功。之后在项目目录中输入claude就会启动交互式命令行界面。有一点需要注意npm 源建议使用官方源部分第三方镜像源的包同步可能不及时会导致安装到旧版本或依赖解析报错。如果遇到权限问题Linux 和 macOS 下可以尝试sudo npm install -gWindows 下确保以管理员身份运行终端。2.3 在 VS Code 中配置 Claude Code我个人的习惯是在 VS Code 里工作因为 Claude Code 生成的代码最终还是要打开编辑器去看、去改。虽然它本身是终端工具但配合 VS Code 会顺手很多。有两个配置方式。第一种方式最简单VS Code 自带集成终端直接按Ctrl \ 打开终端在里面运行claude 就可以了。这样左边是代码下面是 Claude Code 对话它改文件后编辑器会自动刷新体验非常顺。第二种方式是通过 VS Code 的扩展市场搜索 Claude 相关插件。这类插件通常会把对话界面嵌入到侧边栏本质上还是调用同一套底层能力。如果你喜欢图形化操作可以试试但我觉得集成终端已经足够少装一个插件就少一个配置项。实际使用中我的推荐是在 VS Code 中打开项目根目录再打开集成终端运行claude这样 Claude Code 的文件操作都局限于当前项目目录比较安全也方便随时查看它生成的代码。2.4 首次运行需要做的几个关键设置第一次运行claude后有几个设置会影响后面的使用体验我先踩过坑提前给大家说。第一个是权限确认。Claude Code 在操作文件或执行命令前通常会询问是否允许。如果你对接下来的操作有信心可以用/permissions命令快捷调整权限策略允许它自动执行部分常见操作比如读写项目内文件、运行测试命令等。不要上来就全放开建议先把常用目录加入允许列表别的操作保持手动确认安全第一。第二个是对话模式的切换。Claude Code 支持多种模式默认的 normal 模式下它会在动手前先跟你确认方案适合项目初期。等需求明确、项目结构稳定后可以切到更高效的模式让它写完代码再统一报告。这样能减少交互轮次效率更高。第三个是确认终端字体和编码。Claude Code 的界面会用到一些特殊字符和彩色输出终端字体建议设置为支持中文和 Unicode 的字体编码保持 UTF-8否则可能出现文字错位或中文乱码的情况。3. 实战用 Claude Code 从零搭建学生选课管理系统3.1 先梳理需求再动手AI 才能听懂你很多人用 AI 编程工具效果不好问题往往出在需求表达上。Claude Code 再聪明也不可能替你把一团乱麻的需求理清楚。我在动手前用十分钟列了一份需求清单跟着对话告诉它系统角色有三类管理员、教师、学生管理员可以维护学生信息和教师信息教师可以创建课程、录入课程成绩学生可以浏览课程列表、选课、退课、查看个人课表和成绩技术栈选用 Flask SQLite前后端使用简单的 HTML 模板对话大概是这样开的头我想做一个学生选课管理系统。使用 Flask SQLite 实现 有三类角色管理员、教师、学生。 管理员管理学生和教师信息教师创建课程和录入成绩 学生选课退课并查看成绩。请先生成项目结构。Claude Code 收到这个指令后先输出了项目规划列出了目录结构、数据表设计和接口划分然后询问我是否确认。这个阶段其实是整个开发过程中最重要的一步因为它决定了后续所有代码的骨架。如果一开始结构没对齐后面返工成本很高。3.2 数据库设计与建模让 AI 先生成 ER 关系我让 Claude Code 先生成数据库模型。五张核心表必不可少students学生表存储学号、姓名、专业、入学年份等基础信息teachers教师表存储工号、姓名、职称、院系courses课程表存储课程编号、名称、学分、授课教师、容量、已选人数enrollments选课表存储选课记录包含学生和课程的关联关系scores成绩表存储学生某门课程的考试成绩对话里我特别加了一句“把外键关系设计好选课时要校验课程容量成绩只允许任课教师录入”。这个要求很重要因为如果没有明确业务规则AI 默认生成的模型往往只是简单的字段堆砌不会自动处理容量校验和权限控制。Claude Code 生成的 SQLAlchemy 模型代码质量还不错。比如 Student 模型中学号被设为主键并加了唯一约束姓名和专业的字段长度做了限制enrollment 表使用了复合主键避免重复选课。这些细节如果手写花不了太多时间但在对话中一并生成还是很省事的。这里我有个经验你给 AI 明确的“业务规则”越多生成的代码就越接近生产级。比如“退课时已选人数减一”、“删除课程时级联删除选课记录”这些规则提一句它就懂了不提它就只会做表面操作。3.3 学生信息管理模块先跑通最简单的增删改查数据库模型确认后我让 Claude Code 先实现学生信息管理模块。这个模块是最典型的 CRUD也是验证整个技术链路是否跑通的关键。我给出的指令是请实现学生信息管理的完整模块包括 学生列表页面分页显示、新增学生、编辑学生、删除学生。 删除学生时同步删除其选课记录和成绩记录。 使用 Flask Blueprint 组织代码。Claude Code 生成了 blueprint 路由、表单模板和操作逻辑。列表页我用的是最简单的 Bootstrap 样式表格展示学号、姓名、专业、入学年份右上角放“新增学生”按钮每条记录后面放“编辑”和“删除”操作。它生成的模板代码里直接用了 Jinja2 的分页宏省去了我手写分页逻辑的时间。点击“新增学生”后会进入表单页面。Claude Code 在表单里做了基础校验比如学号必填、学号格式为数字、姓名为空时提示。它还用 flash 消息做了交互反馈保存成功或失败都会在页面上方显示提示。这一套流程跑下来前后端闭环就通了。3.4 课程与选课模块业务约束是难点课程管理和选课模块是整个系统的业务核心也是最容易出现逻辑漏洞的地方。这里我特意多花了一些时间围绕业务规则和 Claude Code 进行了多轮对话。课程管理的功能比较直白教师创建课程时需要填写课程名称、学分、所属专业、课程容量和上课时间。Claude Code 生成的表单逻辑里把“授课教师”字段做成了下拉框数据来源是 teachers 表选人时看到的是教师姓名而不是工号这个细节做得很到位。选课模块则有意思得多。我要求实现以下规则学生登录后只能看到当前学期的可选课程选课时校验课程是否已满已满则提示同一学生不能重复选择同一门课程退课后课程已选人数减一Claude Code 在实现时选课逻辑写在了一个独立的 service 函数里先检查是否已存在记录再检查容量最后执行插入。这个顺序是对的。不过它最初生成的代码有个问题它检查容量时用的是course.enrolled course.capacity但enrolled字段在模型里没有定义。这是因为我在需求中提到了“显示已选人数”但它没把这个字段加到模型里。我直接把报错信息复制回对话它很快就修正了。这里要说一下我的工作习惯我从不让 Claude Code 一次生成所有模块。一个模块跑通、验证、审查后再进入下一个模块。这样即使出现问题排查范围也只局限在一个模块内不会出现满项目都是报错的情况。3.5 成绩管理模块处理好角色权限成绩管理模块相对独立但要考虑权限边界。需求是教师只能录入自己授课课程的成绩学生只能查看自己的成绩管理员可以查看所有成绩但不能修改。Claude Code 的权限设计思路是登录后把用户角色写入 session然后在成绩录入页面查询教师当前的课程列表只显示属于该教师的课程。录入成绩时会校验当前成绩记录对应的课程教师是否为当前登录教师不匹配就拒绝操作。这个逻辑如果手写大概需要写几十行代码和两个页面的模板。Claude Code 在几分钟内就生成完了而且生成的代码结构比较清晰。不过它在校验“当前教师是否为此课程的授课教师”时最初是用教师姓名做字符串匹配我指出应该用教师 ID 关联查询它在下一轮就改成了 ID 关联这个修改很关键避免了很多潜在 bug。3.6 界面和交互优化让 AI 打磨细节核心功能完成后我让 Claude Code 做了两轮界面优化。第一轮是统一页面风格所有页面共用一个基础模板 layout.html导航栏根据登录角色显示不同菜单项。第二轮是增加一些提示信息比如课程已选人数显示为“已选 12/30”成绩录入后显示是否已录过的标记。说实话Claude Code 生成的前端代码比较朴素毕竟它是命令行工具不是设计师。但做课设或内部演示系统完全够用。如果你对 UI 有更高要求可以让它接入 Bootstrap 或 Tailwind 的 CDN再描述一下想要的组件风格基本能达到整洁耐看的程度。第二轮优化时我要求把学生选课页面改成卡片式布局每门课程用一张卡片展示课程名、教师、学分、容量和选课按钮。这个效果它实现了但卡片样式比较粗糙。我提了一句“卡片 hover 时加阴影选课按钮统一放在右下角”它调整后就顺眼多了。所以把需求描述得越具体AI 出来的东西就越接近你脑子里想要的效果。4. 常见问题与排查技巧实录4.1 对话偏离需求怎么拉回来用 Claude Code 的过程中最容易遇到的问题就是它跑偏。明明让它做学生管理的列表页它却开始设计数据库迁移脚本让它修复选课时段冲突它给整个 course 表加了若干新字段。遇到这种情况第一反应不是否定它而是明确缩小范围。我会把需求重新描述一遍并且加上限制词“只修改 courses 相关文件不要改动其他文件”“不要引入新的依赖”。Claude Code 支持上下文外记忆窗口但对话轮次太多时仍会遗漏早期信息我习惯在关键操作前把核心约束重述一遍让它不要只凭上下文猜测。如果偏差实在太大有一个好方法是用/clear命令清空当前对话然后在新会话中继续描述需求。不用担心它会丢失之前的代码因为所有代码都已经落盘了它只需要读取项目文件就能恢复上下文。这比在一条乱糟糟的对话里反复纠正要高效得多。4.2 生成代码的运行问题怎么处理我遇到最多的是两类运行问题。第一类是依赖缺失Claude Code 默认生成的代码会用到一个 requirements.txt但并不会自动为你创建虚拟环境并安装依赖。在让它启动项目之前我会主动加一句“请先创建虚拟环境并安装依赖”或者在它报ModuleNotFoundError时直接把报错文本贴给它让它自行安装缺失的库。第二类是数据库初始化问题。SQLite 表的创建通常是在应用启动时执行的如果表结构改动过旧的数据库文件会留下旧字段导致查询报错。处理方式很简单删除旧的 SQLite 文件重新生成。Claude Code 还提供了修复建议但我更喜欢自己掌握这个操作毕竟 AI 生成的修复路径不一定符合预期手动删除 db 文件再重启是最省事的。4.3 让 Claude Code 更懂你的 Prompt 写法经过这个项目我总结出几个和 Claude Code 协作的 Prompt 技巧分享一下一次只让 AI 干一件完整的事。比如“实现学生列表并支持分页”是一个任务“实现学生列表、增加编辑功能和删除功能”又是另一个任务。后者看似简单实则会导致它写代码时思路混乱容易出现顾此失彼的情况。描述业务规则优先于描述技术实现。直接说“选课后课程已选人数减一”比说“在 enroll 函数里加一行 enrolled - 1”更有用。因为 AI 知道业务规则后会自己找到合适的位置实现你说得太具体反而可能和它的代码结构不匹配。报错信息原样贴回。程序出错时直接把终端里的整段报错复制到对话里不要自己“总结”成一句话。AI 能准确地从堆栈中定位问题你转述反而丢失了关键信息。用确认型提问代替开放式提问。问“帮我优化一下选课逻辑”不如问“目前选课逻辑是如果有重复选课会返回提示如果改为已选课程直接隐藏选课按钮是否更合理”。这种提问方式能让 AI 更快理解你的意图。4.4 一些值得记住的避坑清单最后把这次实战里比较有价值的坑和心得整理成一张速查表方便以后复用场景问题建议项目初始化Claude Code 生成了大量零散文件先在对话里明确目录结构和技术栈确认后再让它逐个模块生成数据库模型AI 生成的外键关系不符合预期把表关系写进需求描述中如“选课表包含 student_id 外键关联学生表”前后端联调接口报 404 或 500让它先打印所有路由再检查模板里提交的 URL 是否匹配权限控制任何人都能访问管理页面明确要求“装饰器检查登录角色”并验证未登录跳转到登录页数据校验表单提交异常数据导致程序崩溃让 AI 在服务端加入字段格式校验不要只依赖前端提示重复会话新对话中 AI 不记得之前的约定用项目文档或 CLAUDE.md 记录关键约定新会话后让它先读该文件还有一个细节每完成一个阶段建议让 Claude Code 更新一次项目的 README 文件。这样即使后续对话上下文丢失你也能通过 README 快速回顾系统结构和功能清单。这个习惯对 AI 辅助开发尤其重要因为你自己写过的东西可能还会靠记忆AI 生成的代码如果没有文档时间久了连自己都容易看晕。5. 项目之外的几点体会这个项目从头到尾用 Claude Code 的实际开发时间大概只占我过去手写同类系统的一半都不到。做完之后我有几个很直观的感受。第一AI 编程工具最大的价值不是写代码本身而是处理那些“写起来没技术含量但量很大”的代码。学生管理系统里大量的页面模板、表单校验、路由注册、数据模型定义长远来看完全是可复用的模式代码AI 对这些内容的生成质量已经相当稳定。第二开发者的核心能力正在从“亲手敲代码”变成“定义问题和审查方案”。用 Claude Code 的项目里我花在写代码上的时间少了但花在想清楚需求、设计数据模型、审核边界条件上的时间没有减少。而且正是因为我不需要亲自写每一行反而更容易站在全局视角检查系统结构。第三AI 生成代码不是没有 bug但它修复 bug 的能力比生成新功能更让人惊喜。整个项目里我遇到的最复杂的 bug 是成绩录入时外键约束冲突我把报错贴给它之后它直接定位到是一行数据初始化语句写错了字段名还顺带写了一条数据迁移脚本。这种“自主定位问题”的能力是传统代码补全工具远远做不到的。如果你准备用 Claude Code 做一个类似的管理系统我的建议是先把需求清单写在纸上再打开终端一步步让 AI 帮你落地。过程中保持对代码的审查不要把 AI 的输出当成最终结果。工具再好决定项目质量的最后还是你的思路和判断力。