ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AI辅助全栈开发实战:Vue 3 + Spring Boot 3独立建站全流程

AI辅助全栈开发实战:Vue 3 + Spring Boot 3独立建站全流程 两个月前我决定做一件很多开发者都想过但迟迟没动手的事从零开始一个人上线一个完整的网站。不是用WordPress模板也不是用现成的建站工具而是真正从服务器、域名、前后端代码、数据库全部自己搭建。听起来像是一个典型的“全栈开发”练习但这次我的“队友”是AI。如果你也想过独立开发一个网站但总被“前端太复杂”、“后端逻辑理不清”、“部署流程太麻烦”这些拦路虎劝退那么我这两个月的经历或许能给你一个全新的视角。过去一个人完成全栈项目需要扎实的多领域知识储备和大量的时间试错。而现在AI编程助手如Claude Code、ChatGPT的出现正在将这个过程从“知识密集型”转向“任务驱动型”。它们无法替代你的核心架构设计能力但能极大程度地帮你填平技术细节的沟壑让你把精力集中在“做什么”而不是“怎么写”上。我的技术栈选择了当前比较主流的组合Vue 3 TypeScript负责前端Spring Boot 3构建后端API。整个项目从环境搭建、代码编写、调试到最终部署上线AI助手全程参与。这篇文章我将完整复盘这个过程重点不是展示一个完美的网站而是剖析一个普通开发者如何借助AI工具高效、少踩坑地走通独立开发上线的全链路。你会看到AI在哪些环节是“神器”在哪些环节又需要你保持清醒的头脑。1. 重新定义“从零到一”AI时代独立开发者的新工作流“从零到一上线一个网站”这个目标在今天的技术语境下内涵已经发生了变化。过去它考验的是开发者对多个技术栈的掌握深度现在它更考验你如何精准定义问题、拆解任务并高效利用工具包括AI来执行。我的核心判断是AI编程助手目前最大的价值是充当一个“永不疲倦的初级开发伙伴”和“随叫随到的技术文档库”。它能帮你快速生成样板代码、解释复杂概念、排查常见错误但它无法替你做出关键的技术决策也无法理解你模糊的业务需求。因此成功的关键在于建立一套“人主导AI辅助”的新工作流。这个工作流大致分为四个阶段规划与设计阶段你独立完成。明确网站核心功能、设计数据库ER图、规划API接口、确定技术选型。这是AI无法代劳的“战略层”。环境搭建与项目初始化AI辅助为主。通过对话让AI生成正确的依赖配置package.json,pom.xml、Dockerfile、基础目录结构。避免在环境问题上耗费过多时间。核心业务逻辑开发人机协作。你描述清楚功能模块如“用户登录接口”AI生成基础代码框架你在此基础上修改、调试、补充业务细节。调试、测试与部署AI作为高级调试器。将错误日志扔给AI分析它能快速给出可能的原因和排查方向。部署脚本和流程也可以让AI帮忙检查和优化。接下来我将以我的个人博客/项目展示网站为例拆解每个阶段的具体实践和思考。2. 技术选型与核心工具栈为什么是Vue 3 Spring Boot 3 AI在开始之前明确技术选型至关重要。我的选择基于以下几点考虑Vue 3 Composition API TypeScript对于独立开发者Vue 3的渐进式和学习曲线平缓是巨大优势。Composition API让逻辑组织更灵活TypeScript则能在开发阶段就捕获大量类型错误这对于AI生成代码的可靠性也有加成——明确的类型约束能让AI的输出更准确。Spring Boot 3Java生态的成熟度和Spring Boot“约定大于配置”的理念能快速搭建稳健的后端服务。Spring Boot 3基于Java 17提供了更好的性能和新特性。对于有Java背景或希望后端结构清晰的开发者来说这是可靠的选择。AI工具Claude Code 与 ChatGPT我主要交叉使用这两者。Claude Code在VSCode中作为插件使用其优势在于深度集成开发环境。它能直接读取你当前文件的上下文提供更精准的代码补全、解释和重构建议。对于在IDE中边写边问的场景效率极高。ChatGPT (Web版)更适合进行开放性的技术讨论、架构咨询和生成较长的示例代码块。当我需要从头设计一个模块或者被一个复杂概念卡住时我会转向ChatGPT进行“头脑风暴”。一个重要提醒网络热词中出现了大量关于“Claude Code安装”、“接入DeepSeek”、“模型不支持”等搜索这反映了工具使用初期的普遍困惑。我的经验是优先使用官方文档和主流社区教程。对于Claude Code直接在VSCode扩展商店搜索安装即可无需复杂配置。关于模型Claude Code有自己集成的模型通常不需要、也不支持用户随意切换为“GPT-5.6-sol”或“DeepSeek-v4-flash”这类外部模型遇到“model not recognized”错误基本可以断定是配置了不支持的参数。3. 环境准备避开第一个坑万事开头难环境配置是第一个拦路虎。以下是确保你本地开发环境就绪的清单3.1 基础软件安装Node.js npm用于Vue前端开发。建议安装LTS版本如18.x, 20.x。# 安装后验证 node -v npm -vJava Development Kit (JDK)Spring Boot 3需要JDK 17或更高版本。推荐安装JDK 17或21。# 安装后验证 java -versionMavenSpring Boot项目的依赖管理和构建工具。# 安装后验证 mvn -vIDEVisual Studio Code(前端主力安装Claude Code插件) IntelliJ IDEA Community/Ultimate Edition(后端主力)。VSCode也可用于后端但IDEA对Spring Boot的支持更完善。Git代码版本管理。Docker (可选但推荐)用于容器化部署能保证环境一致性。3.2 AI助手配置Claude Code in VSCode在VSCode扩展面板搜索“Claude Code”并安装。安装后侧边栏会出现Claude图标点击并按照指引登录或注册账户通常需要邮箱。无需复杂配置保持默认即可开始使用。重点学会如何使用它的几个核心功能行内问答选中代码右键选择“Claude Code: Explain”或“Claude Code: Refactor”。聊天面板在侧边栏打开聊天窗口进行开放式提问。自动补全在编写代码时它会根据上下文给出建议。ChatGPT准备一个可访问的账户。用于补充Claude Code不擅长或需要更广泛讨论的场景。环境配置的AI用法示例 当你忘记如何检查Maven版本时可以直接在Claude Code聊天框输入“如何在终端检查Maven版本” 它会立刻给出mvn -v的命令。这比打开浏览器搜索要快得多。4. 项目初始化让AI写出第一行“正确”的代码项目初始化包括创建前后端项目骨架、配置基础依赖。这里最容易出现版本冲突、配置错误。4.1 创建Spring Boot 3后端项目传统方式是去 Spring Initializr 网站生成。现在你可以直接让AI生成正确的pom.xml。向ChatGPT提问 “请为我创建一个Spring Boot 3.2.x项目的pom.xml文件需要包含以下依赖Spring Web, Spring Data JPA, MySQL Driver, Lombok。Java版本是17。”你会得到一个非常标准的pom.xml文件。复制它然后在IDEA中创建一个新的Maven项目用这个文件替换自动生成的pom.xml即可。?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version3.2.5/version !-- 使用当时最新的稳定版 -- relativePath/ /parent groupIdcom.example/groupId artifactIdmy-website-backend/artifactId version0.0.1-SNAPSHOT/version namemy-website-backend/name descriptionPersonal website backend powered by Spring Boot 3/description properties java.version17/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-data-jpa/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId scoperuntime/scope /dependency dependency groupIdorg.projectlombok/groupId artifactIdlombok/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration excludes exclude groupIdorg.projectlombok/groupId artifactIdlombok/artifactId /exclude /excludes /configuration /plugin /plugins /build /project关键点AI生成的配置通常很标准但你必须理解每个依赖的作用。例如Lombok是简化POJO编写的工具如果不习惯可以不用。4.2 创建Vue 3 TypeScript前端项目使用Vue官方脚手架create-vue这是最稳妥的方式。AI的作用在于帮你生成后续的组件模板和TypeScript配置。# 1. 使用官方命令创建项目 npm create vuelatest my-website-frontend # 在交互式命令行中选择需要的特性 # - Add TypeScript? Yes # - Add JSX Support? No (按需) # - Add Vue Router for Single Page Application? Yes # - Add Pinia for state management? Yes (推荐) # - Add Vitest for Unit Testing? No (可选) # - Add an End-to-End Testing Solution? No (可选) # - Add ESLint for code quality? Yes # 2. 进入项目并安装依赖 cd my-website-frontend npm install # 3. 启动开发服务器 npm run dev创建完成后你可以打开一个Vue组件文件如src/components/HelloWorld.vue然后使用Claude Code的“Explain”功能让它为你逐行解释script setup语法、ref和reactive的区别。这是快速上手Vue 3 Composition API的绝佳方式。5. 核心开发实战人机协作编写业务代码假设我的网站需要一个“文章管理”功能包含文章列表展示和文章详情页。我们来看AI如何辅助。5.1 后端创建JPA实体、Repository和REST Controller第一步生成JPA实体类向Claude Code或ChatGPT描述“我需要一个Spring Data JPA的实体类Article包含字段id (Long, 主键自增)title (String)content (String)author (String)createTime (LocalDateTime)。请使用Lombok注解。”// 文件路径src/main/java/com/example/website/entity/Article.java package com.example.website.entity; import jakarta.persistence.*; import lombok.Data; import lombok.NoArgsConstructor; import lombok.AllArgsConstructor; import java.time.LocalDateTime; Entity Table(name articles) Data // Lombok注解自动生成getter, setter, toString, equals, hashCode NoArgsConstructor // 生成无参构造 AllArgsConstructor // 生成全参构造 public class Article { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(nullable false) private String title; Column(columnDefinition TEXT) // 使用TEXT类型存储长内容 private String content; private String author; Column(name create_time, updatable false) private LocalDateTime createTime; PrePersist // 在持久化前自动设置创建时间 protected void onCreate() { createTime LocalDateTime.now(); } }AI生成的代码基本可直接用但你需要知道PrePersist是干什么的不懂就问AI并且根据实际情况调整Column的定义。第二步生成Repository接口提问“为上面的Article实体创建一个Spring Data JPA Repository接口包含按标题模糊查询和分页查找所有文章的方法。”// 文件路径src/main/java/com/example/website/repository/ArticleRepository.java package com.example.website.repository; import com.example.website.entity.Article; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface ArticleRepository extends JpaRepositoryArticle, Long { // 方法名查询Spring Data JPA会自动实现 ListArticle findByTitleContaining(String title); // 自定义JPQL查询示例 Query(SELECT a FROM Article a WHERE a.author :author ORDER BY a.createTime DESC) ListArticle findArticlesByAuthor(Param(author) String author); // 分页查询所有文章 PageArticle findAll(Pageable pageable); }AI展示了两种查询方式方法名派生查询和**Query注解查询**。你可以让AI解释两者的适用场景。第三步生成RESTful Controller提问“创建一个ArticleController提供对Article资源的RESTful API包括获取文章列表分页、根据ID获取文章详情、创建新文章。使用Spring Boot 3的ResponseEntity。”// 文件路径src/main/java/com/example/website/controller/ArticleController.java package com.example.website.controller; import com.example.website.entity.Article; import com.example.website.repository.ArticleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.Optional; RestController RequestMapping(/api/articles) public class ArticleController { Autowired private ArticleRepository articleRepository; // 获取文章列表分页 GetMapping public ResponseEntityPageArticle getAllArticles( RequestParam(defaultValue 0) int page, RequestParam(defaultValue 10) int size, RequestParam(defaultValue createTime,desc) String sort) { String[] sortParams sort.split(,); Sort.Direction direction sortParams[1].equalsIgnoreCase(asc) ? Sort.Direction.ASC : Sort.Direction.DESC; Pageable pageable PageRequest.of(page, size, Sort.by(direction, sortParams[0])); PageArticle articles articleRepository.findAll(pageable); return ResponseEntity.ok(articles); } // 根据ID获取文章详情 GetMapping(/{id}) public ResponseEntityArticle getArticleById(PathVariable Long id) { OptionalArticle article articleRepository.findById(id); return article.map(ResponseEntity::ok) .orElse(ResponseEntity.status(HttpStatus.NOT_FOUND).build()); } // 创建新文章 PostMapping public ResponseEntityArticle createArticle(RequestBody Article article) { // ID由数据库自增前端不应传递 article.setId(null); Article savedArticle articleRepository.save(article); return ResponseEntity.status(HttpStatus.CREATED).body(savedArticle); } }AI生成的Controller已经具备了基本的REST风格和错误处理404 Not Found。你需要理解Pageable、ResponseEntity的用法并考虑添加更完善的验证如Valid和异常处理。5.2 前端使用Vue 3 TypeScript调用API并展示第一步配置Axios并创建API服务在Vue项目中我们通常使用Axios进行HTTP请求。让AI帮你生成一个配置好的Axios实例和对应的TypeScript接口。提问“在Vue 3 TypeScript项目中如何创建一个配置了基础URL和拦截器的Axios实例并为我上面Article的API定义一个TypeScript接口和对应的服务函数。”// 文件路径src/utils/http.ts import axios from axios; const http axios.create({ baseURL: import.meta.env.VITE_API_BASE_URL || http://localhost:8080/api, // 使用环境变量 timeout: 10000, headers: { Content-Type: application/json, }, }); // 请求拦截器 http.interceptors.request.use( (config) { // 这里可以添加token等 // const token localStorage.getItem(token); // if (token) { // config.headers.Authorization Bearer ${token}; // } return config; }, (error) { return Promise.reject(error); } ); // 响应拦截器 http.interceptors.response.use( (response) { return response.data; // 直接返回data }, (error) { console.error(API请求错误:, error); // 可以在这里统一处理错误如token过期跳转登录 return Promise.reject(error); } ); export default http;// 文件路径src/types/article.ts // 定义文章类型与后端实体对应 export interface Article { id?: number; title: string; content: string; author: string; createTime?: string; // 后端返回的是字符串格式的时间 } // 分页响应类型 export interface PageResponseT { content: T[]; totalElements: number; totalPages: number; size: number; number: number; }// 文件路径src/services/articleService.ts import http from /utils/http; import type { Article, PageResponse } from /types/article; export const articleService { // 获取文章列表分页 async getArticles(page: number 0, size: number 10, sort: string createTime,desc): PromisePageResponseArticle { const params { page, size, sort }; return await http.get(/articles, { params }); }, // 根据ID获取文章详情 async getArticleById(id: number): PromiseArticle { return await http.get(/articles/${id}); }, // 创建文章 async createArticle(article: Article): PromiseArticle { return await http.post(/articles, article); }, };AI生成的代码结构清晰引入了环境变量、TypeScript接口和拦截器。你需要创建对应的.env.development文件来设置VITE_API_BASE_URL。第二步创建文章列表组件现在让AI帮你快速生成一个使用articleService的Vue组件。提问“用Vue 3的script setup语法和TypeScript写一个ArticleList组件。它使用上面定义的articleService获取分页文章列表并展示包含加载状态和错误处理。使用Element Plus的表格和分页组件假设已安装。”!-- 文件路径src/components/ArticleList.vue -- template div classarticle-list el-table :dataarticles v-loadingloading stylewidth: 100% el-table-column propid labelID width80 / el-table-column proptitle label标题 / el-table-column propauthor label作者 width120 / el-table-column propcreateTime label创建时间 width180 template #default{ row } {{ formatDate(row.createTime) }} /template /el-table-column el-table-column label操作 width120 template #default{ row } el-button typetext clickviewDetail(row.id)查看/el-button /template /el-table-column /el-table div classpagination el-pagination v-model:current-pagecurrentPage v-model:page-sizepageSize :page-sizes[5, 10, 20, 50] :totaltotal layouttotal, sizes, prev, pager, next, jumper size-changehandleSizeChange current-changehandleCurrentChange / /div el-dialog v-modeldetailVisible title文章详情 width70% div v-ifcurrentArticle h2{{ currentArticle.title }}/h2 p classmeta作者{{ currentArticle.author }} | 发布时间{{ formatDate(currentArticle.createTime) }}/p div classcontent v-htmlcurrentArticle.content/div /div /el-dialog /div /template script setup langts import { ref, onMounted, watch } from vue; import { ElMessage } from element-plus; import { articleService } from /services/articleService; import type { Article, PageResponse } from /types/article; // 响应式数据 const loading ref(false); const articles refArticle[]([]); const total ref(0); const currentPage ref(1); const pageSize ref(10); const sort ref(createTime,desc); const detailVisible ref(false); const currentArticle refArticle | null(null); // 获取文章列表 const fetchArticles async () { loading.value true; try { // 注意后端Pageable的page从0开始前端分页组件从1开始 const response: PageResponseArticle await articleService.getArticles( currentPage.value - 1, pageSize.value, sort.value ); articles.value response.content; total.value response.totalElements; } catch (error) { console.error(获取文章列表失败:, error); ElMessage.error(获取文章列表失败请稍后重试); } finally { loading.value false; } }; // 分页事件处理 const handleSizeChange (newSize: number) { pageSize.value newSize; currentPage.value 1; // 切换每页条数时回到第一页 fetchArticles(); }; const handleCurrentChange (newPage: number) { currentPage.value newPage; fetchArticles(); }; // 查看详情 const viewDetail async (id: number) { try { const data await articleService.getArticleById(id); currentArticle.value data; detailVisible.value true; } catch (error) { ElMessage.error(获取文章详情失败); } }; // 简单日期格式化 const formatDate (dateString?: string) { if (!dateString) return -; return new Date(dateString).toLocaleString(); }; // 初始加载 onMounted(() { fetchArticles(); }); // 监听排序变化如果需要 // watch(sort, () { // currentPage.value 1; // fetchArticles(); // }); /script style scoped .pagination { margin-top: 20px; display: flex; justify-content: center; } .meta { color: #666; font-size: 0.9em; margin-bottom: 15px; } .content { line-height: 1.6; } /style这个组件已经相当完整包含了数据获取、分页、详情弹窗、加载状态和错误提示。AI甚至处理了前后端分页索引的差异后端从0开始前端从1开始。你只需要安装好Element Plus并引入这个组件就能运行。6. 联调、部署与上线最后的临门一脚开发完成后在本地运行前后端进行联调是必须的。确保后端Spring Boot应用启动在8080端口前端Vue应用配置了正确的代理或API基础URL。6.1 后端应用配置与运行创建application.yml文件配置数据库和端口。# 文件路径src/main/resources/application.yml spring: datasource: url: jdbc:mysql://localhost:3306/my_website_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: hibernate: ddl-auto: update # 开发环境可用update生产环境务必改为validate或none show-sql: true properties: hibernate: format_sql: true server: port: 8080在IDEA中直接运行MyWebsiteBackendApplication的main方法或使用命令行mvn spring-boot:run6.2 前端应用配置与运行在项目根目录创建.env.development文件VITE_API_BASE_URLhttp://localhost:8080/api然后运行npm run dev6.3 部署上线最简单的Docker化方案对于个人小项目使用Docker Compose是最简单的部署方式。让AI帮你生成Dockerfile和docker-compose.yml。后端Dockerfile:# 文件路径backend/Dockerfile # 构建阶段 FROM maven:3.9-eclipse-temurin-17 AS build WORKDIR /app COPY pom.xml . RUN mvn dependency:go-offline -B COPY src ./src RUN mvn clean package -DskipTests # 运行阶段 FROM eclipse-temurin:17-jre-alpine WORKDIR /app COPY --frombuild /app/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT [java, -jar, app.jar]前端Dockerfile:# 文件路径frontend/Dockerfile # 构建阶段 FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . RUN npm run build # 运行阶段 FROM nginx:alpine COPY --frombuild /app/dist /usr/share/nginx/html COPY nginx.conf /etc/nginx/conf.d/default.conf EXPOSE 80前端Nginx配置(nginx.conf):server { listen 80; server_name localhost; root /usr/share/nginx/html; index index.html; location / { try_files $uri $uri/ /index.html; } # 代理API请求到后端 location /api/ { proxy_pass http://backend:8080/api/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }Docker Compose编排(docker-compose.yml):version: 3.8 services: mysql: image: mysql:8 container_name: website-mysql environment: MYSQL_ROOT_PASSWORD: your_strong_password MYSQL_DATABASE: my_website_db volumes: - mysql_data:/var/lib/mysql ports: - 3306:3306 networks: - website-network backend: build: ./backend container_name: website-backend depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/my_website_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai SPRING_DATASOURCE_USERNAME: root SPRING_DATASOURCE_PASSWORD: your_strong_password ports: - 8080:8080 networks: - website-network frontend: build: ./frontend container_name: website-frontend depends_on: - backend ports: - 80:80 networks: - website-network volumes: mysql_data: networks: website-network: driver: bridge在服务器上只需要安装Docker和Docker Compose将整个项目目录上传然后运行docker-compose up -d你的网站就上线了。7. 常见问题与排查思路AI作为调试伙伴在整个过程中你会遇到无数错误。AI是你最好的调试伙伴。下表总结了一些典型问题及如何利用AI解决问题现象可能原因如何向AI提问示例排查方向前端调用API返回4041. 后端服务未启动2. API路径错误3. 跨域问题“我的Vue应用在localhost:5173Spring Boot在localhost:8080调用/api/articles报404可能是什么原因”1. 检查后端日志是否启动成功。2. 用Postman直接测后端API。3. 检查前端请求URL查看浏览器Network面板。Spring Boot启动报DataSource错误1. 数据库连接失败2. 依赖缺失3. 配置错误“Spring Boot启动时报Failed to configure a DataSource我的application.yml配置是...如何解决”1. 检查数据库服务是否运行。2. 检查pom.xml是否有mysql-connector-j依赖。3. 检查application.yml的缩进和配置项。Vue组件中TypeScript类型报错1. 类型未正确导入或定义2. 响应式API使用错误“在Vue 3script setup里我定义了一个const list ref([])往里面push对象时报类型错误怎么解决”1. 使用refArticle[]([])明确泛型。2. 检查Article接口定义是否正确导出和导入。Docker构建失败1. Dockerfile语法错误2. 构建上下文缺失文件3. 网络问题下载依赖失败“Docker build时在RUN npm ci这一步失败错误信息是npm ERR! code ENOENT怎么办”1. 检查package.json是否在构建上下文。2. 尝试先本地npm ci看是否成功。3. 考虑使用国内镜像源。页面样式混乱或JS不生效1. 静态资源路径错误2. Nginx配置未正确代理或处理SPA路由“我的Vue项目用DockerNginx部署后页面能打开但所有JS和CSS文件都404Nginx配置是...哪里错了”1. 检查Docker构建的dist目录内容。2. 检查Nginx配置中的root和try_files指令。3. 查看浏览器开发者工具Console和Network标签。关键技巧向AI提问时一定要提供具体的错误信息、相关代码片段和你的环境。模糊的问题只能得到模糊的答案。8. 最佳实践与经验总结AI辅助开发的“道”与“术”经过两个月的实践我总结出以下经验这可能比具体的代码更有价值你仍是总工程师AI是高级助手项目的整体架构、技术选型、核心业务流程必须由你掌控。AI负责实现细节你负责把握方向。分而治之精准提问不要问“如何做一个博客网站”。要拆解成“Spring Boot如何接收Multipart文件上传”、“Vue 3中如何实现路由懒加载”。问题越具体AI的回答质量越高。理解而非复制对于AI生成的每一段代码尤其是你不熟悉的一定要追问“为什么这么写”、“这个注解的作用是什么”。用AI来学习而不是单纯复制。版本意识AI的知识有截止日期。对于Spring Boot 3、Vue 3等较新版本要在提问中明确指定版本号否则它可能给出旧版本的答案例如Spring Boot 2的配置方式与3有所不同。交叉验证对于关键配置或复杂逻辑不要完全依赖一个AI的回答。可以用Claude Code和ChatGPT分别询问或者结合官方文档、Stack Overflow进行验证。安全与生产就绪AI生成的代码通常侧重于功能实现。你必须手动审查数据库连接密码是否硬编码API接口是否有权限校验JPA的ddl-auto在生产环境是否设置为update应该用validate或none并通过迁移工具管理表结构日志是否完善善用IDE的AI插件Claude Code在VSCode中的行内解释、代码补全和重构建议功能在日常开发中的效率提升是颠覆性的。养成选中代码右键询问的习惯。回顾这两个月AI并没有让我一夜之间成为全栈专家但它确实移走了学习道路上大量的“碎石”。它让我能够快速跨越“不知道用什么关键词搜索”的初始障碍直接进入“验证-调试-理解”的深度循环。最终上线的网站可能并不复杂但独立走完设计、开发、部署全流程所带来的信心和完整认知是任何教程都无法替代的。如果你也有一个想做但一直没开始的项目不妨现在就打开编辑器向AI说出你的第一个精准的指令。从创建一个“Hello World” API开始你会发现从零到一的路已经比想象中平坦了许多。
返回列表