当前位置: 首页 > news >正文

Spring Boot+Vue课程作业管理系统毕业设计实战指南

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度

每年毕业季,计算机专业的学生们都会面临一个共同的“灵魂拷问”:毕业设计到底该怎么做?是选一个看似高大上但无从下手的课题,还是找一个能跑通、能答辩、能体现自己四年所学,但又不会耗费过多精力的项目?如果你正在为“课程作业管理系统”这类题目发愁,手头有一堆Java、Vue、Spring Boot、MySQL的技术栈要求,却不知道如何将它们串联成一个完整的、可运行的、有深度的系统,那么这篇文章就是为你准备的。

我见过太多同学,拿到一个开源项目源码,兴冲冲地clone下来,结果卡在环境配置、数据库连接、前后端联调的第一步,最终只能对着报错信息一筹莫展。也见过一些同学,项目虽然跑起来了,但答辩时被老师问到“为什么用MyBatis-Plus而不是JPA?”、“Vue组件间数据流怎么设计的?”、“这个系统的并发瓶颈在哪里?”时,却只能支支吾吾。问题的核心在于,很多人把毕业设计当成了一个“找源码、改界面、交差”的任务,而忽略了它本质上是一次将零散技术知识整合为完整工程能力的实战演练。

今天,我们不谈空洞的理论,就以一个典型的“课程作业管理系统”为例,拆解从零到一构建一个Spring Boot + Vue前后端分离项目的完整心法。你会发现,真正的价值不在于你找到了多完美的源码,而在于你能否理解每一行代码背后的设计逻辑,能否将项目改造成属于你自己的作品,并能在答辩中清晰阐述你的技术选型与架构思考。

1. 理解核心需求:你的系统到底要解决什么问题?

在动手写第一行代码或导入第一个开源项目之前,你必须先想清楚:一个课程作业管理系统,核心要解决哪些问题?这直接决定了你的数据库表设计和接口规划。

一个常见的误区是,一上来就照着某个“学生管理”、“课程管理”、“作业管理”的通用增删改查模板去套。结果做出来的系统,和“图书管理系统”、“酒店管理系统”除了名词不同,底层逻辑一模一样,毫无特色,自然也难以在答辩中出彩。

1.1 从用户角色出发,梳理核心业务流程

让我们回归业务本质。一个作业管理系统,至少涉及三类用户:

  • 学生:查看课程、提交作业、查看成绩与评语、可能还有补交或重交。
  • 教师:发布作业(含题目、要求、截止日期、附件)、批改作业、打分、写评语、统计成绩。
  • 管理员:管理用户(学生/教师)、管理课程绑定关系、管理学期等基础数据。

仅仅这样还不够。你需要思考更深层次的流程和状态:

  1. 作业生命周期:一个作业从“已发布” -> “待提交”(学生可见)-> “已提交” -> “已批改” -> “成绩发布”,这中间的状态流转如何设计?是否允许在截止日期前修改提交?是否允许迟交(迟交是否扣分)?
  2. 文件管理:作业附件和提交的文件如何存储?是存在服务器本地,还是使用对象存储(如OSS)?文件上传的并发和大小限制如何?如何防止学生互抄文件?
  3. 批改与反馈:打分是百分制还是等级制?评语是纯文本还是支持富文本?教师能否在线预览学生提交的文档(如PDF、Word)?
  4. 数据统计:教师是否需要查看班级作业提交率、平均分、成绩分布?学生是否需要查看自己历次作业的趋势?

这些思考,会直接体现在你的数据库设计中。例如,你的homework(作业)表可能就需要这些字段:

CREATE TABLE `homework` ( `id` bigint NOT NULL COMMENT '主键', `course_id` bigint NOT NULL COMMENT '关联课程', `teacher_id` bigint NOT NULL COMMENT '发布教师', `title` varchar(255) NOT NULL COMMENT '作业标题', `content` text COMMENT '作业要求(富文本)', `attachment_url` varchar(500) COMMENT '附件路径', `deadline` datetime NOT NULL COMMENT '截止时间', `total_score` int DEFAULT 100 COMMENT '总分', `status` varchar(20) DEFAULT 'PUBLISHED' COMMENT '状态:PUBLISHED, CLOSED', `allow_late_submission` tinyint(1) DEFAULT 0 COMMENT '是否允许迟交', `late_submission_deduction` int DEFAULT 0 COMMENT '迟交扣分比例', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

homework_submission(作业提交)表则需要更精细的设计:

CREATE TABLE `homework_submission` ( `id` bigint NOT NULL, `homework_id` bigint NOT NULL, `student_id` bigint NOT NULL, `submit_content` text COMMENT '文本答案', `attachment_url` varchar(500) COMMENT '提交文件路径', `submit_time` datetime NOT NULL COMMENT '提交时间', `status` varchar(20) DEFAULT 'SUBMITTED' COMMENT '状态:SUBMITTED, LATE_SUBMITTED, GRADED', `score` int COMMENT '得分', `teacher_comment` text COMMENT '教师评语', `grade_time` datetime COMMENT '批改时间', PRIMARY KEY (`id`), UNIQUE KEY `uk_homework_student` (`homework_id`, `student_id`) -- 防止重复提交 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

关键点uk_homework_student这个唯一索引非常重要,它保证了每个学生对同一份作业只能有一条提交记录(后续的修改是更新这条记录)。status字段的设计,让你能轻松筛选出“已批改”和“未批改”的作业,以及区分“正常提交”和“迟交”。

1.2 明确技术栈选型的“为什么”

项目标题给出了 Java + Vue + Spring Boot + MySQL,这是一个非常经典且合理的选择。但在答辩中,你需要能解释为什么是它们:

  • Spring Boot:相比传统的SSM(Spring+SpringMVC+MyBatis),它通过“约定大于配置”和自动装配,极大地简化了初始配置。内嵌Tomcat,让你可以一键运行,非常适合作为毕业设计的后端框架,能让你更专注于业务逻辑而非XML配置。
  • Vue.js:作为渐进式前端框架,它组件化的思想清晰,学习曲线相对平缓。与React和Angular相比,Vue的模板语法对新手更友好,生态中的Element Plus或Ant Design Vue等UI库能快速搭建出美观的管理界面。前后端分离的架构,也符合现代Web开发的主流趋势。
  • MySQL:关系型数据库,事务ACID特性保证数据一致性(如扣分、成绩更新),丰富的查询功能便于实现各类统计报表。对于作业管理系统这类结构化数据强、事务要求明确的场景,它是稳妥的选择。

你的答辩优势在于,不仅要会用,还要能对比。你可以简单提一句:“也曾考虑过使用 MongoDB 来存储灵活的作业内容,但考虑到成绩、用户关系等强一致性要求,最终选择了更成熟的 MySQL。” 这立刻体现了你的技术思考深度。

2. 项目启动与骨架搭建:避开第一个“坑”

假设你现在拿到了一个开源的项目源码压缩包。很多教程会直接让你导入IDE然后运行,但这恰恰是噩梦的开始。正确的姿势应该是先理解项目结构,再按步骤搭建环境。

2.1 后端(Spring Boot)项目结构解析

一个典型的Spring Boot项目骨架如下:

course-homework-backend/ ├── src/main/java/com/yourdomain/ │ ├── CourseHomeworkApplication.java // 启动类 │ ├── config/ // 配置类(如跨域、MyBatis-Plus、Swagger) │ ├── controller/ // 控制层,接收HTTP请求 │ ├── entity/ // 实体类,对应数据库表 │ ├── mapper/ // MyBatis Mapper接口 │ ├── service/ // 业务逻辑层接口 │ │ └── impl/ // 业务逻辑层实现 │ └── dto/ // 数据传输对象(用于前后端交互) │ └── vo/ // 视图对象(用于返回给前端的数据封装) ├── src/main/resources/ │ ├── application.yml // 主配置文件 │ ├── mapper/ // MyBatis XML映射文件(如果使用) │ └── static/ // 静态资源 └── pom.xml // Maven依赖管理

第一个实操要点:application.yml的配置。这是连接数据库和配置项目行为的核心。

server: port: 8080 # 后端服务端口 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/course_homework?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: yourpassword # 务必改成你自己的! servlet: multipart: max-file-size: 10MB # 文件上传大小限制 max-request-size: 10MB mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志,调试必备 global-config: db-config: logic-delete-field: deleted # 全局逻辑删除字段 logic-delete-value: 1 logic-not-delete-value: 0

注意serverTimezone=Asia/Shanghai这个参数至关重要,它能避免数据库时间与Java程序时间不一致导致的诡异问题。很多同学遇到的“提交时间比实际晚8小时”问题,根源就在这里。

2.2 前端(Vue)项目结构解析

一个基于Vue CLI或Vite创建的标准项目结构:

course-homework-frontend/ ├── public/ │ └── index.html // 入口HTML ├── src/ │ ├── api/ // 封装所有后端API请求 │ ├── assets/ // 静态资源(图片、样式) │ ├── components/ // 可复用Vue组件 │ ├── router/ // Vue Router路由配置 │ ├── store/ // Vuex状态管理(如需) │ ├── views/ // 页面视图组件 │ │ ├── Login.vue // 登录页 │ │ ├── Teacher/ │ │ │ ├── HomeworkPublish.vue // 教师-发布作业 │ │ │ └── HomeworkGrade.vue // 教师-批改作业 │ │ └── Student/ │ │ ├── HomeworkList.vue // 学生-作业列表 │ │ └── HomeworkSubmit.vue // 学生-提交作业 │ ├── App.vue // 根组件 │ └── main.js // 入口JS文件 ├── .env.development // 开发环境配置 ├── .env.production // 生产环境配置 ├── vue.config.js // Vue CLI配置 └── package.json // 依赖管理

第二个实操要点:环境变量与API封装。.env.development中配置后端接口地址:

VUE_APP_BASE_API = http://localhost:8080/api

src/api/下创建homework.js,使用 Axios 统一管理请求:

import request from '@/utils/request' // 一个基于axios封装的工具 export function getHomeworkList(params) { return request({ url: '/homework/list', method: 'get', params }) } export function submitHomework(data) { return request({ url: '/homework/submit', method: 'post', data, headers: { 'Content-Type': 'multipart/form-data' // 文件上传必须用这个格式 } }) }

这样封装的好处是,接口地址变更、请求拦截(如自动添加Token)、响应处理、错误统一提示都可以在utils/request.js中集中管理,代码更清晰。

2.3 数据库初始化与联调准备

  1. 创建数据库:在MySQL中执行CREATE DATABASE course_homework CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;utf8mb4支持存储Emoji等特殊字符。
  2. 运行SQL脚本:如果源码包里有.sql文件,在数据库中执行它。如果没有,你需要根据实体类(Entity)和上面的设计,自己编写建表语句。
  3. 修改配置:确保后端application.yml中的数据库连接信息正确。
  4. 启动顺序:先启动MySQL服务,再启动Spring Boot后端,最后启动Vue前端。用浏览器访问前端地址(通常是http://localhost:8081)。

常见启动失败排查

  • 后端启动报错Failed to configure a DataSource:检查数据库连接URL、用户名、密码,确保MySQL服务已启动,且数据库名存在。
  • 前端运行报错Cannot find module:在项目根目录执行npm installyarn install安装依赖。
  • 前端访问后端接口404或跨域(CORS)错误:在后端增加一个跨域配置类。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOriginPatterns("*") // 或指定前端地址如 "http://localhost:8081" .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowCredentials(true) .maxAge(3600); } }

3. 核心功能实现与代码理解:从“能用”到“懂行”

项目跑起来只是第一步。你需要深入关键业务代码,理解其实现逻辑,并知道如何修改和扩展。我们聚焦两个最核心的功能:作业发布与提交。

3.1 后端:作业发布接口剖析

HomeworkController.java中,你可能会看到类似这样的代码:

@RestController @RequestMapping("/homework") @Api(tags = "作业管理") public class HomeworkController { @Autowired private IHomeworkService homeworkService; @PostMapping("/publish") @ApiOperation("发布作业") public Result<String> publishHomework(@RequestBody HomeworkDTO homeworkDTO) { // 1. 数据校验(简单示例) if (StringUtils.isBlank(homeworkDTO.getTitle())) { return Result.error("作业标题不能为空"); } if (homeworkDTO.getDeadline() == null) { return Result.error("截止时间不能为空"); } // 2. 数据转换与填充 Homework homework = new Homework(); BeanUtils.copyProperties(homeworkDTO, homework); homework.setPublishTime(new Date()); homework.setStatus("PUBLISHED"); // 假设从ThreadLocal或JWT中获取当前教师ID homework.setTeacherId(getCurrentTeacherId()); // 3. 调用服务层 boolean success = homeworkService.save(homework); return success ? Result.ok("发布成功") : Result.error("发布失败"); } }

你需要关注和能解释的点

  • @RequestBody:表示接收JSON格式的请求体。
  • DTO (Data Transfer Object):为什么要有HomeworkDTO?因为前端传过来的数据字段可能和实体类Homework不完全一致,或者有些字段(如id,publishTime)不应该由前端传入。DTO起到了隔离和适配的作用。
  • 数据校验:这里的校验是简单的,生产环境会使用@Valid注解配合校验注解(如@NotBlank)进行更优雅的校验。
  • Result<T>:这是一个自定义的统一响应封装类,通常包含codemsgdata字段。它让前端能以一种固定的格式处理所有接口响应。
  • getCurrentTeacherId():这是一个关键方法,涉及用户认证与授权。在真实的系统中,教师登录后,后端会生成一个JWT Token返回给前端。前端后续请求都在Header中携带此Token。后端通过一个拦截器(Interceptor)或过滤器(Filter)来解析Token,获取当前用户信息并存入安全上下文(如SecurityContextHolder)或ThreadLocal。这是毕业设计中体现技术深度的加分项。

3.2 后端:文件上传接口

作业系统和附件密不可分。Spring Boot处理文件上传的典型代码如下:

@PostMapping("/upload") @ApiOperation("上传作业附件") public Result<String> uploadFile(@RequestParam("file") MultipartFile file) { if (file.isEmpty()) { return Result.error("文件为空"); } // 防止文件名冲突,生成新文件名 String originalFilename = file.getOriginalFilename(); String fileExtension = originalFilename.substring(originalFilename.lastIndexOf(".")); String newFileName = UUID.randomUUID().toString() + fileExtension; // 指定存储路径(可配置化) File dest = new File("/path/to/upload/dir/" + newFileName); try { file.transferTo(dest); // 将文件访问路径(如 /upload/{newFileName})存入数据库或返回给前端 String fileUrl = "/upload/" + newFileName; return Result.ok("上传成功", fileUrl); } catch (IOException e) { log.error("文件上传失败", e); return Result.error("上传失败"); } }

进阶思考

  • 存储路径:硬编码路径不好,应该放在application.yml中配置。
  • 生产环境:通常不会把文件直接存在应用服务器本地,而是上传到云对象存储(如阿里云OSS、腾讯云COS),这样便于扩容和备份。你可以将这部分作为项目亮点或扩展方向来阐述。
  • 作业提交接口:学生提交作业时,会调用这个上传接口拿到文件URL,然后将URL连同作业ID、学生ID、文本内容一起,提交到/homework/submit接口。

3.3 前端:作业提交页面逻辑

HomeworkSubmit.vue中,核心是表单处理和文件上传。

<template> <el-form :model="form" :rules="rules" ref="formRef"> <el-form-item label="作业答案" prop="content"> <el-input type="textarea" v-model="form.content"></el-input> </el-form-item> <el-form-item label="上传文件"> <el-upload class="upload-demo" :action="uploadAction" :on-success="handleUploadSuccess" :before-upload="beforeUpload" :limit="1"> <el-button type="primary">点击上传</el-button> </el-upload> <div v-if="form.attachmentUrl">{{ form.attachmentUrl }}</div> </el-form-item> <el-form-item> <el-button type="primary" @click="submitForm">提交作业</el-button> </el-form-item> </el-form> </template> <script> import { submitHomework } from '@/api/homework'; import { uploadFile } from '@/api/upload'; export default { data() { return { form: { homeworkId: null, content: '', attachmentUrl: '' }, rules: { content: [{ required: true, message: '请输入答案', trigger: 'blur' }] }, uploadAction: '' // 上传地址 }; }, created() { this.homeworkId = this.$route.params.id; // 从路由获取作业ID }, methods: { beforeUpload(file) { // 文件类型和大小校验 const isLt10M = file.size / 1024 / 1024 < 10; if (!isLt10M) { this.$message.error('文件大小不能超过10MB'); return false; } return true; }, handleUploadSuccess(response) { if (response.code === 200) { this.form.attachmentUrl = response.data; // 保存返回的文件路径 this.$message.success('文件上传成功'); } }, async submitForm() { try { const params = { homeworkId: this.homeworkId, content: this.form.content, attachmentUrl: this.form.attachmentUrl }; const res = await submitHomework(params); if (res.code === 200) { this.$message.success('作业提交成功'); this.$router.push('/student/homework-list'); } } catch (error) { this.$message.error('提交失败'); } } } }; </script>

关键点:这里演示了文件上传和表单提交分离的模式。先上传文件获得URL,再将URL和其他表单数据一起提交。这是一种更清晰、更易于处理失败重试的策略。

4. 从项目完成到答辩出色:超越代码的思考

一个能运行的毕业设计只是60分。要拿到高分,你需要展示出对项目更深层次的理解和思考。

4.1 系统设计层面的阐述

在答辩PPT和报告中,不要只罗列功能。要讲清楚你的系统架构图核心模块划分。可以画一个简单的示意图:

[浏览器] <-> [Nginx] <-> [Vue前端静态资源] <-> [Spring Boot后端API] <-> [MySQL]

并解释:

  • 前后端分离的好处:职责清晰、并行开发、前端用户体验更动态、后端API可复用(未来可开发小程序、APP)。
  • 为什么没用Session而用JWT:JWT无状态,更适合分布式和扩展;Token可存储自定义信息;前端处理更灵活。
  • 数据库索引的设计:在homework_submission表的homework_idstudent_id上建了联合索引,加速根据作业查询提交列表或根据学生查询其所有提交。

4.2 遇到的挑战与解决方案

这是答辩中最能体现你个人能力的部分。提前准备2-3个你实际遇到或可能遇到的“坑”及其解决方案。

  1. 跨域问题:一开始前端访问后端接口失败,通过在后端配置CorsConfig解决。理解了浏览器同源策略和CORS机制。
  2. 文件上传路径问题:上传的文件在开发环境能访问,打包部署后找不到。原因是使用了绝对路径。解决方案是将上传目录配置在项目外部(如/data/upload),或者使用相对路径并通过资源处理器(ResourceHandler)映射。
  3. 日期时间显示问题:从数据库查出的时间在前端显示慢8小时。原因是数据库存储的UTC时间与前端时区不一致。解决方案有三:一是在后端返回给前端时,使用@JsonFormat注解格式化;二是在数据库连接串中指定serverTimezone;三是前端使用类似dayjs的库进行时区转换。
  4. 批量操作性能:教师批量下载全班作业时,如果同步处理会导致服务器阻塞。扩展思路:可以提出使用异步处理,将任务放入消息队列(如RabbitMQ),生成一个ZIP文件后提供下载链接。这体现了你对性能优化的思考。

4.3 项目的可扩展性与改进方向

在答辩结尾,可以简要谈谈如果时间更充裕,你会如何完善这个系统:

  • 引入Redis缓存:将频繁访问且不常变的数据(如课程列表、用户基本信息)缓存起来,减轻数据库压力。
  • 接入对象存储:将文件上传至阿里云OSS,提升可靠性和访问速度。
  • 实现作业查重功能:这是一个很好的技术亮点。可以简单提及思路:提取学生提交文本的指纹(如SimHash),进行相似度比对。
  • 增加消息通知:作业发布、截止提醒、成绩发布时,通过WebSocket或邮件通知学生。
  • 容器化部署:编写Dockerfile和docker-compose.yml,实现一键部署,体现运维能力。

4.4 关于“源码数据库配套文档”

如果项目资料中包含这些,你要做的是:

  • 源码:不是照搬,而是读懂。在关键处加上你自己的注释,理解每一层(Controller, Service, Mapper)的职责。
  • 数据库:理解每张表、每个字段、每个索引、每个外键约束的意义。能自己画出ER图。
  • 文档:参考其结构,但务必自己重新编写你的项目文档。包括需求分析、系统设计、模块说明、部署指南。这是你项目完整性的体现。
  • 答辩教程:将其作为提纲,但准备你自己的演讲逻辑和应对问题的答案。

毕业设计不是一次简单的编码作业,它是你从学生思维转向工程师思维的一次关键演练。通过“课程作业管理系统”这个载体,你真正应该收获的,是如何将一个模糊的需求,通过技术选型、系统设计、编码实现、调试部署,最终变成一个可运行、可演示、可讲解的软件产品。这个过程里,每一个报错、每一次搜索、每一次尝试,都是比最终那个“能跑的系统”更宝贵的财富。当你站在答辩台上,能够清晰地说出你为何这样设计、遇到了什么问题、又是如何解决的时候,你就已经完成了这次演练最重要的部分。

🚀 30+款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度

http://www.gsyq.cn/news/1646502.html

相关文章:

  • 从Harness Engineering到Hermes Agent:构建可靠、可进化AI智能体的工程实践
  • 企业微信第三方应用扫码登录 3 步实战:Spring Boot 后端 + 域名配置避坑
  • 锂离子电池过压保护与STM32L031C6系统设计
  • Hadoop Web控制台安全加固实战:绕过官方Simple认证,实现Nginx反向代理密码验证
  • 设计系统 Token 工程化:从定义到 CI 校验的完整链路
  • MetaMask 13.37.0 安全配置进阶:5项关键设置防范钓鱼与资产丢失
  • TongWeb 7.0 连接池配置优化:10个关键参数详解与性能压测对比
  • Windows 11/10系统AutoCAD 2025安装部署与优化全指南
  • MetaMask 13.37.0 安全配置进阶:3项关键设置与5类常见钓鱼攻击防范
  • OpenAI Codex CLI 十大必装技能:从代码补全到智能开发工作流
  • ChatGPT API成本优化实战:从计费原理到架构级省钱策略
  • Contrastive Clustering 代码复现:PyTorch 实现 AAAI 2021 论文,CIFAR-10 精度提升 39%
  • 淘宝开放平台奇门接口 Java 验签实战:Spring Boot 接收 XML 请求与 3 种签名算法解析
  • WMIC命令替代方案:PowerShell 7与CIM/WMI查询获取设备信息的3种新方法
  • JVM 内存参数 -Xms 与 -Xmx 同值实战:Spring Boot 应用启动时间优化 30%
  • 大气层系统完整指南:从零开始掌握Switch终极破解方案
  • Node.js + Express 搭建 CORS 跨域服务:5分钟配置 3个关键响应头
  • VMware安装CentOS 7完整指南:从零搭建Linux开发环境
  • 如何在老旧安卓电视上免费观看高清直播:MyTV-Android开源应用完全指南
  • 微信小程序Canvas图表库的5大突破性特性:从技术实现到商业应用的全方位解析
  • Linux C++网络编程实战:从零构建多线程日志服务器
  • 数据库自治运维展望:从 AI 辅助诊断到全自动故障自愈的技术路线
  • ai电扇模特图效果如何?主流AI换模特工具全解析
  • 大气层Atmosphere终极指南:从源码编译到高级定制的完整技术方案
  • SpringBoot+MySQL物资管理系统实战:从环境搭建到功能验证
  • Java+Vue+Spring Boot课程作业管理系统毕业设计实战指南
  • 01.05.01.DeepSeek:环境搭建篇(检索增强生成工具AnythingLLM: 安装配置)
  • Prompt 模板版本治理:别让线上效果被一句文案改崩
  • Java+Vue+Spring Boot+MySQL课程作业管理系统:从环境搭建到二次开发的毕业设计实战
  • 01.01.02.DeepSeek:环境搭建篇(安装配置 开发环境 conda+python+modelscope)