news 2026/4/5 21:49:02

AI 辅助开发实战:基于 Vue 的健身项目毕业设计全流程解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
AI 辅助开发实战:基于 Vue 的健身项目毕业设计全流程解析


AI 辅助开发实战:基于 Vue 的健身项目毕业设计全流程解析

毕业设计最怕“功能越堆越乱、代码越写越脏”。去年我用 Vue 3 写健身管理项目时,把 GitHub Copilot 和通义灵码混着用,两周搞定从需求到部署。今天把踩过的坑、省下的时间、留下的代码全部摊开,给还在熬夜改 Bug 的同学一条能抄的近路。


1. 毕业设计三宗罪:为什么你总被导师打回

  1. 功能冗余:把“健身”做成大杂烩,饮食、社交、商城全塞进去,结果每个模块都只有 30% 完成度。
  2. 逻辑耦合:页面里直接调 axios,请求地址硬编码,后期换接口要改 40 个文件。
  3. 缺乏工程规范:文件夹层级随意,命名拼音与英文混用,README 只有一句“本项目基于 Vue”。

这些问题单靠自己“多写几遍”很难根治,AI 工具的价值就在于把“规范”变成“一键生成”。


2. AI 工具选型:Copilot 与通义灵码实测对比

维度GitHub Copilot通义灵码
组件骨架生成快捷键Ctrl+Enter直接出.vue三段式模板,样式用 Tailwind,需要再改 class输入“生成健身计划卡片组件”,自动带<script setup>与 TypeScript 类型
注释补全能识别函数意图,英文注释精准;中文需手动改原生中文语义,方法级注释一次到位
单元测试生成 Jest 代码,但断言简单,常漏边界默认给出 vitest 示例,覆盖率为 0 的 case 会标红提示
安全校验不会主动加权限判断在生成路由守卫时附带meta.requiresAuth模板

结论:
Copilot 适合“快”,通义灵码适合“准”。我通常让 Copilot 先生成 70% 骨架,再用通义灵码补测试、补注释,最后人工 merge。


3. 核心实现:AI 如何帮你写业务代码

3.1 训练计划模块(Composition API)

需求:根据用户目标(减脂/增肌)返回 7 日训练表,支持拖拽调整顺序。

操作步骤:

  1. src/composables/useTrainingPlan.ts里输入注释:

    // 根据 goal 返回计划列表,支持拖拽排序,数据格式见 TrainingItem

    Copilot 自动生成接口类型与核心逻辑。

  2. 手动把拖拽库换成vue-draggable-plus,AI 会误引旧版vuedraggable,需要pnpm add vue-draggable-plus并改 import。

  3. 用通义灵码补单测:

    // useTrainingPlan.spec.ts it('应把新增动作插入到对应星期', () => { const { addMovement } = useTrainingPlan('fat-loss') addMovement({ name: '跳绳', sets: 4 }) expect(plan.value[0].movements).toContainEqual(expect.objectContaining({ name: '跳绳' })) })

关键收获:AI 生成的类型 90% 可用,但数组方法顺序可能不符合业务,务必 review。

3.2 全局状态:Pinia 用户模块

让通义灵码“生成 Pinia 用户 store,包含登录、注册、token 刷新”。

得到src/stores/user.ts雏形后,手动加两项约束:

  • 刷新接口必须携带refreshToken,AI 常漏判。
  • 登录后把avatar写入本地localStorage,防止 F5 后闪烁。
export const useUserStore = defineStore('user', () => { const token = ref(localStorage.getItem('tk') ?? '') const profile = ref<Profile | null>(null) async function login(form: LoginForm) { const { data } = await http.post<LoginRsp>('/auth/login', form) token.value = data.accessToken localStorage.setItem('tk', data.accessToken) // AI 忘记持久化 await fetchProfile() } async function fetchProfile() { const { data } = await http.get<Profile>('/user/me') profile.value = data localStorage.setItem('avatar', data.avatar) // 手动补 } return { token, profile, login, fetchProfile } })

3.3 表单验证:AI 生成 yup 方案

需求:体脂率字段仅在目标为“减脂”时必填,范围 5-50。

提示词:

目标为减脂时体脂率必填,number,min:5,max:50,给出 yup + vee-validate 代码

通义灵码返回:

import * as yup from 'yup' export const bodySchema = yup.object({ goal: yup.string().oneOf(['fat-loss', 'bulk']), bodyFat: yup.number().when('goal', { is: 'fat-loss', then: schema => schema.min(5, '体脂率不低于 5').max(50, '体脂率不高于 50').required('请输入体脂率'), otherwise: schema => schema.strip() }) })

直接可用,无需改一行。


4. 可运行代码片段:Clean Code 示范

下面是把训练计划卡片拆出来的<PlanCard>,AI 先生成,我删掉冗余div,补aria-label提升可访问性。

<!-- src/components/PlanCard.vue --> <template <template> <li class="plan-card" role="article" :aria-label="`第${dayIndex + 1}天计划`"> <header class="plan-card__header"> <h3>第 {{ dayIndex + 1 }} 天</h3> <Tag :type="plan.goal">{{ plan.goal }}</Tag> </header> <draggable v-model="plan.movements" item-key="id" @end="emit('sorted')"> <template #item="{ element }"> <MovementRow :movement="element" @remove="handleRemove(element.id)" /> </template> </draggable> <footer class="plan-card__footer"> <Button size="sm" @click="emit('add')">添加动作</Button> </footer> </li> </template> <script setup lang="ts"> import draggable from 'vue-draggable-plus' import type { TrainingPlan } from '@/types' interface Props { plan: TrainingPlan; dayIndex: number } defineProps<Props>() const emit = defineEmits<{ sorted: [] add: [] }>() function handleRemove(id: string) { emit('remove', id) } </script> <style scoped> .plan-card { border: 1px solid #e5e7eb; border-radius: 8px; padding: 1rem; } .plan-card__header { display: flex; justify-content: space-between; align-items: center; } </style>

要点:

  • 逻辑只处理“删”,增与排序交给父组件,保持单一职责。
  • aria-label让自动化测试能抓到节点,导师看代码也挑不出毛病。

5. AI 代码的暗礁:别等线上爆了才发现

  1. 幂等性缺失:AI 生成的“创建计划”接口调用放在onMounted里,用户刷新就会重复插入。解决:用createNew参数或唯一索引约束。
  2. 安全校验遗漏:Copilot 给出的 JWT 解析函数不验签,直接atob解码。上线前必须换成jose库。
  3. 过度查询:AI 喜欢select *,把用户密码哈希也返回到前端。要在后端仓库另开 PR,和毕业设计一起打分。

6. 生产环境避坑指南

  1. 路由守卫:通义灵码会写router.beforeEach,但经常忘记next()调用顺序。模板:

    router.beforeEach((to, from, next) => { const user = useUserStore() if (to.meta.requiresAuth && !user.token) next('/login') else next() })

    注意next()必须被调用一次且仅一次,否则白屏。

  2. Mock → 真实接口:用vite-plugin-mock-dev-server,在.env.production中把VITE_MOCK=false即可一键切换,无需改业务代码。

  3. 架构失控检查清单:

    • 任何 AI 生成的 service 文件必须单元测试覆盖 ≥ 80%。
    • 每个composable对应一个.md说明输入输出,防止后人“看不懂就重写”。
    • 代码评审自己给自己开 PR,用 GitHub 的copilot-review动作跑一遍,有 warning 就修不通过。

7. 动手环节:重构一个 AI 组件

请把 AI 生成的MovementRow.vue拿过来,完成以下任务:

  1. 把行内样式全部替换成 Tailwind utility。
  2. computed拆分“显示重量单位”逻辑,杜绝魔法字符串。
  3. 补一条aria-live提示,确保删除动作后屏幕阅读器能播报“已删除”。

做完后对比 AI 原始版本,你会直观看到“人机协作”的边界:AI 负责 0→1,人负责 1→90 分。



8. 写在最后:毕业设计不是终点,是协作模式的起点

把 AI 当“加速键”而非“万能钥匙”,我的项目 70% 代码由机器产出,但 100% 事故由人兜底。下次面对需求,先写清晰注释,再让 AI 跑通主干,最后用测试与 Code Review 把住质量关——这套流程,比任何花哨的 prompt 都更能帮你准时下班,也让导师在答辩时挑不出刺。祝你一次过、不二辩,代码干净,身材也精干。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 14:57:22

VisionPro 工业相机驱动连接(GigE 接口)结构化速记版

VisionPro 工业相机驱动连接&#xff08;GigE 接口&#xff09;结构化速记版核心说明工业相机驱动连接核心是「硬件接线→网络配置→驱动安装→VisionPro 连接」&#xff0c;GigE 接口是工业场景最常用类型&#xff0c;以下步骤针对 GigE 相机&#xff08;如康耐视、海康威视等…

作者头像 李华
网站建设 2026/4/1 17:53:20

VisionPro 几何学工具 核心学习笔记

VisionPro 几何学工具 核心学习笔记VisionPro 几何学工具是视觉测量中基于像素 / 定位空间&#xff0c;实现几何形状创建、查找、拟合、相交计算、距离 / 角度测量的专用工具集&#xff0c;所有操作均基于图像的坐标空间&#xff08;可结合 Fixture 定位空间使用&#xff09;&a…

作者头像 李华
网站建设 2026/3/15 1:29:37

java+vue基于springboot框架的线上订餐骑手配送管理系统的设计与实现

目录线上订餐骑手配送管理系统的设计与实现摘要技术架构核心功能模块系统优化特性应用价值开发技术源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;线上订餐骑手配送管理系统的设计与实现摘要 该系统基于SpringBoot和Vue.js框架开发&am…

作者头像 李华
网站建设 2026/4/5 12:13:06

吐血推荐! AI论文软件 千笔·专业学术智能体 VS 学术猹,MBA写作神器!

随着人工智能技术的迅猛迭代与普及&#xff0c;AI辅助写作工具已逐步渗透到高校学术写作场景中&#xff0c;成为专科生、本科生、研究生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生&#xff0c;开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时…

作者头像 李华
网站建设 2026/3/25 5:33:56

基于Dify的智能客服系统搭建:从零到生产的AI辅助开发实践

背景痛点&#xff1a;规则引擎的“长尾”困境 传统客服系统大多基于正则规则树&#xff0c;上线初期看似“指哪打哪”&#xff0c;一旦业务扩张&#xff0c;问题就暴露无遗&#xff1a; 长尾问题覆盖率低&#xff1a;新活动、新话术每周都在变&#xff0c;规则库膨胀到几千条…

作者头像 李华
网站建设 2026/4/3 23:09:37

MyBatis批量插入数据:foreach的陷阱与最佳实践

一、问题引入&#xff1a;为什么需要谨慎使用foreach&#xff1f; 在MyBatis中进行批量插入时&#xff0c;很多开发者习惯使用<foreach>标签来拼接SQL语句&#xff1a; xml <insert id"batchInsert" parameterType"java.util.List">INSERT …

作者头像 李华