大家好,上次跟大家分享了我用Cursor做的光伏决策系统,反响还挺不错的!不过做这个项目时我踩了不少坑,今天就来聊聊项目结构这个话题。
刚开始做这个光伏系统时,我完全没注意代码结构,结果写着写着就变成了一锅粥 —— 所有功能都揉在一起,最夸张的一个文件竟然有四五千行 代码!
这么长的代码直接超出了大模型的上下文限制,导致Cursor都处理不了我的需求,甚至没法直接修改代码,只能采用命令行的方式、不停地重复备份文件...改一个小功能都提心吊胆,生怕出问题。
看图感受一下:
最后直接罢工了,让我自己找前端开发人员帮我修改...,给我气够呛!!
所以,如果你也在用Cursor做项目,不想重蹈我的覆辙,今天这篇文章一定要看完!
一、为什么项目结构这么重要?
//
如果你只是用Cursor做些简单的小项目,可能不会太在意这个问题。但如果你像我一样想做个更复杂的系统(比如我的光伏决策系统),前期不做好项目结构设计,后面就会面临这些问题:
-
代码难以维护 :所有功能混在一起,想改一处就得翻遍全文
-
超出上下文窗口 :大模型处理不了太长的代码,Cursor直接罢工
-
功能难以扩展 :新增功能时发现牵一发而动全身,只能硬着头皮重构
-
团队协作困难 :多人开发时无法并行工作,代码冲突频发
二、我光伏系统是怎么组织的
//
经过惨痛教训后,我重构了整个光伏决策系统的代码。
看下我重构后的项目结构。
从最顶层来看,我的系统分为三大部分(只贴出核心服务):
├── auth-service(认证服务)
├── frontend(前端)
└── neo4j-service(图数据库服务)
1. 前端部分(frontend)
前端采用了Vue框架,整体结构如下:
frontend/
├── public/ # 静态资源
├── src/ # 源代码
│ ├── api/ # API调用
│ ├── assets/ # 图片、样式资源
│ ├── components/ # 可复用组件
│ │ └── graph-analysis/ # 图分析相关组件
│ ├── mixins/ # 混入
│ ├── router/ # 路由配置
│ ├── store/ # 状态管理
│ ├── utils/ # 工具函数
│ ├── views/ # 页面视图
│ └── App.vue # 主组件
├── .env # 环境变量
└── main.js # 入口文件
我特别注意把图分析相关的组件单独放在一个文件夹中,包括:
- CompanyRiskForm.vue
- GraphVisualization.vue
- IndustryAnalysisForm.vue
- RegionAnalysisForm.vue
- SupplyChainForm.vue
- ...等
这样一来,每个文件专注于单一功能,文件大小控制在500行以内,Cursor可以轻松处理。
2. 后端部分(neo4j-service)
后端使用Java Spring Boot + Neo4j图数据库,结构如下:
neo4j-service/
├── src/main/
│ └── java/com/photovoltaic/neo4j/
│ ├── config/ # 配置
│ ├── controller/ # 控制器
│ │ ├── CompanyController.java
│ │ ├── GraphAnalysisController.java
│ │ └── IndustryController.java
│ ├── entity/ # 数据实体
│ │ ├── Company.java
│ │ ├── Industry.java
│ │ └── Product.java
│ ├── mapper/ # 对象映射
│ ├── service/ # 业务逻辑
│ └── Neo4jServiceApplication.java # 启动类
└── resources/ # 资源文件
这样组织后,每个控制器专注于处理特定领域的请求,每个实体类对应数据库中的一种节点类型,逻辑清晰很多。
三、项目结构的核心原则
//
通过重构这个光伏系统,我总结了几条项目结构的核心原则:
1. 模块化
把功能模块拆分独立,互不干扰。比如我系统中的公司分析、行业分析、区域分析都是独立模块,可以单独开发和维护。
2. 职责分离
每个文件只负责一件事。前端的每个组件只处理特定的UI和交互,后端的每个控制器只处理特定的API请求。
在我最初的代码中,一个组件同时处理了UI渲染、数据获取、数据处理、状态管理等多种功能,导致代码难以维护。重构后,这些职责被清晰地分开。
3. 可扩展性
设计时要考虑未来的扩展。比如我后来需要增加"关键材料分析"功能,只需在components/graph-analysis/下添加KeyMaterialsResult.vue,在后端添加对应的控制器和服务即可,不影响现有功能。
4. 可读性
目录结构和命名要一目了然。我给所有组件和文件都起了能直观反映其功能的名字,比如RegionAnalysisForm.vue就是区域分析表单,让自己和AI都能快速理解。
四、实操:如何重构混乱的代码
//
如果你的项目已经变成了一团乱麻(就像我最初的光伏系统),以下是我的重构步骤:
1. 分析现有代码
先理清各部分的功能和依赖关系。我用了思维导图工具,把所有功能模块和它们之间的关系画出来,这一步很关键。
2. 设计新结构
基于功能分析,设计符合上述原则的目录结构。
3. 逐步迁移
不要一次性重构所有代码!我采用的是渐进式重构:
- 先建立新的目录结构
- 一个功能一个功能地迁移
- 每迁移一个功能就测试一次
- 使用Git管理每步变更,方便回滚
- 让AI帮你重构
使用Kimi这种支持长上下文的大模型,直接把大文件贴给它,描述清楚你的系统功能。它就会帮你拆解,然后给出拆解后的每个文件名和对应的代码,你手动复制粘贴到项目中即可。
五、我学到的经验教训
//
做完这个光伏决策系统后,我总结了几点经验:
-
提前规划胜于事后重构 :项目一开始就应该设计好结构,省时省力
-
单文件不超过1000行 :超过这个长度,考虑拆分组件
-
使用版本控制 :重构前一定要先把当前版本提交一次git,给自己留后路
-
循序渐进 :一次重构一个小功能,而不是全部推倒重来
-
注重文档 :给主要模块和文件写清楚文档,方便后续维护
-
记得我那个最初4000多行的组件吗?重构后变成了12个小组件,每个都不超过500行,Cursor可以轻松处理,开发效率提高了好几倍!
所以,如果你正在用Cursor做项目,特别是想做中大型项目,一定要重视项目结构和代码组织。前期多花点时间做规划,会让后面的开发事半功倍。
END
长按关注
子昕AI
点「在看」
和大家一起看