资讯动态

SpringBoot+Vue教学辅助平台实战开发:从数据库设计到部署联调全记录

发布时间:2026/10/16 3:40:31 来源:尧图企业网站定制
做教学辅助平台这个方向有一段时间了最近刚把手头这套基于SpringBoot Vue MyBatis MySQL的源码完整整理出来顺便把开发过程中那些容易踩的坑、值得留意的设计细节一并记录下来。如果你正打算做类似的项目或者毕业设计、课设选题正好落在“教学辅助平台”“在线教学系统”这个方向上这篇文章应该能帮你省下不少时间。我会从项目定位、技术选型、数据库设计、前后端核心实现讲到部署联调全程按我实际开发时的思路来写不说虚的。1. 项目定位与业务需求拆解1.1 这个系统到底要解决什么问题很多刚接触这类项目的人一上来就纠结“功能堆得多不多”其实方向搞偏了。教学辅助平台的核心价值是把线下教学环节里重复、低效的部分搬到线上比如课程资料分发、作业收发、成绩统计、通知触达。这个项目在设计之初就确定了三个核心角色学生、教师、管理员三种身份各管一段权限边界非常清晰。学生端主要做这几件事浏览课程信息、下载课件资料、在线提交作业、查看批改结果和成绩。教师端的职责是创建课程、上传课件、布置作业、批改评分、维护学生名单。管理员则负责基础数据维护用户管理、课程审核、系统公告、数据统计。这个三角色模型几乎覆盖了高校教学场景里80%以上的常见需求而且角色之间没有功能交叉逻辑上不会打架。这里有一个关键点值得展开说权限控制必须基于角色而不是基于页面。我见过不少项目前端用路由守卫做了页面级权限后端接口却是全开放的任何人拿到接口地址就能调。这种做法的后果是稍微懂点网络请求的人就能绕过前端限制直接操作数据。这个项目的前后端都做了权限校验前端控制菜单和按钮显隐后端用拦截器校验每个需要登录的请求双重保险。1.2 业务闭环怎么设计才不会乱教学辅助系统最忌讳的是“功能孤岛”比如课程模块只管课程作业模块只管作业成绩模块只管成绩三个模块互相不关联。实际使用时作业一定属于某门课程成绩一定是某次作业的评分结果这些天然的关联关系需要一开始就在数据模型里体现出来。我设计业务闭环的时候走的是这条链路管理员创建教师账号教师创建课程学生通过课程号加入教师发布作业学生提交作业教师批改打分成绩汇总进入统计模块。每一步操作都在上一步的基础上进行数据和数据之间有明确的引用关系。这样做的好处是后期做数据统计的时候不用东拼西凑直接从关联查询里就能拿到结果。另外项目还保留了一个扩展点公告通知模块。这个模块看起来不起眼但在实际使用中频率非常高。教师发布课程通知、管理员发布系统公告都会进入这个模块按时间倒序展示。这个功能对“辅助教学”的定位非常重要信息传达本身也是教学管理的一部分。2. 技术选型为什么锁定这套组合2.1 后端 SpringBoot 的底气在哪里后端选择SpringBoot几乎是当前 Java 技术栈里最不需要犹豫的决定。它和 Spring MVC 一脉相承但通过自动配置把大量繁琐的 XML 配置直接干掉了。你新建一个项目引入依赖写几个注解一个能跑起来 Web 服务就成型了。对于教学辅助系统这种典型的 CRUD 业务场景SpringBoot 的成熟度和稳定性完全够用。具体到项目内部我用了 SpringBoot 2.7 版本Python 3.3 之后的那套标准的 starter 依赖管理非常清爽。spring-boot-starter-web 负责处理 HTTP 请求spring-boot-starter-security 做认证和权限控制spring-boot-starter-validation 做参数校验。这几个 starter 组合起来项目的骨架就立住了。还有一点SpringBoot 的生态是围绕 Maven 构建的依赖版本的冲突问题被极大减少这对维护一个长期项目的意义很大。2.2 前端 Vue 二选一Vue2 还是 Vue3这个项目用的是Vue2 Element UI的组合我承认在 2025 年看 Vue3 Element Plus 才是主流但选择 Vue2 有一个非常实际的原因生态稳定、组件库丰富、报错信息容易搜。对于教学辅助平台这类管理系统来说追求的是低风险交付而不是前沿特性。Vue2 的响应式机制、组件通信方式、路由和状态管理经过多年大量项目的检验资料和踩坑记录都非常全遇到问题几乎能秒搜到答案。不过我在项目里尽量把代码写得规范方便以后升级 Vue3。比如组件之间通信全部走 props 和 events不用全局事件总线状态管理统一用 Vuex 并做了模块划分路由懒加载全部配置到位。这样如果以后要迁移 Vue3改动成本是可控的。我的建议是如果你给这个项目做二次开发而且打算长期迭代可以直接切换到 Vue3 TS性能更好类型安全更强但如果目标是一个能稳定运行、能快速上手的系统Vue2 依然不落后。2.3 MyBatis 和 MySQLORM 与数据库的经典搭配ORM 框架可选的有 MyBatis、MyBatis-Plus、Spring Data JPA这个项目选择MyBatis的考虑很简单SQL 控制力最强。教学辅助系统的查询场景非常灵活比如按课程查作业列表、按学生查成绩汇总、按时间段查操作记录这类查询如果用 JPA 的自动生成 SQL经常要调半天才能产出性能可接受的语句但用 MyBatis 手写 SQL一眼就能看懂调优也方便。MySQL的选择没有悬念开源免费、社区庞大、运维资料多教学场景的并发量远达不到 MySQL 的上限所以从成本、学习曲线、稳定性三个维度看MySQL 都是最合适的选择。数据库版本我建议用 5.7 或 8.0两个版本都行8.0 在窗口函数、字符集排序上更强5.7 则在兼容性上更保守。这个项目的代码对两个版本都兼容没有使用任何版本特有语法。3. 数据库设计教学数据模型的拆解3.1 用户体系三张表还是四张表用户模块我设计了四张表用户表sys_user、角色表sys_role、用户角色关联表sys_user_role、菜单权限表sys_menu。没有用一张表加枚举字段区分角色的简单方案原因后面说。用户表存的是账号、密码、姓名、邮箱、电话、状态这些公共字段。密码用了 BCrypt 加密存储绝对不存明文。角色表只有三条记录对应学生、教师、管理员。用户和角色的关联表是多对多关系理论上一个用户可以有多个角色虽然实际使用中基本都是单角色但保留这个灵活性以后扩展更容易。菜单权限表是为了配合后端的接口权限校验设计的。管理员可以为不同角色分配不同的目录和按钮权限前端根据权限数据动态生成菜单。这一整套就是经典的 RBAC 权限模型。如果你用一张表加角色字段的方案功能上确实能跑但后续想加权限点、加角色就得改表结构非常被动。3.2 教学核心表课程、选课、作业、成绩课程表course的字段有课程编号、课程名称、课程简介、教师ID、创建时间、状态。这里有一个细节课程编号是唯一索引学生通过课程编号搜索并申请加入这比用课程ID更贴合现实场景因为ID是自增的学生根本不知道这个值。选课表course_student是课程和学生的关联表字段有ID、课程ID、学生ID、选课时间、状态。状态字段用来记录选课是否有效学生可以退选教师也可以移除学生。这张表会随着学生选课数量增长所以一定要加联合索引我的方案是(course_id, student_id)联合唯一索引避免同一个人重复选同一门课。作业表assignment的字段有作业标题、作业内容、截止时间、附件地址、所属课程ID、发布教师ID。成绩表assignment_submit则记录每次提交提交学生ID、作业ID、提交内容、附件地址、提交时间、批改状态、分数、教师评语。提交表按(assignment_id, student_id)做联合唯一索引保证一个学生只能提交一次重复提交走更新逻辑而不是插入新记录。3.3 辅助表公告、文件、操作日志公告表notice字段比较简单标题、内容、发布人、发布时间、置顶状态。文件表file_record是为了统一管理上传的文件我在项目里是把上传文件存到本地磁盘的指定目录数据库只记录文件的存储路径和文件类型不存二进制内容这样数据库体积不会快速膨胀。操作日志表operation_log记录敏感操作比如用户登录、发布作业、批改成绩。日志表的数据会越来越大我的做法是定期归档到单独的系统主库只保留最近三个月的数据。这个表对于纠纷排查和数据回溯很重要虽然平时用不上但真正需要的时候能救命。4. 后端核心功能与实现细节4.1 登录认证JWT 到底怎么用才稳登录认证采用的是JWTJSON Web Token方案。流程是用户提交账号密码后端校验通过后生成一个 token 返回给前端前端每次请求在请求头里带上Authorization: Bearer token后端通过拦截器解析 token确认用户身份。JWT 的实现我用的是 jjwt 库整体代码不复杂但有几个细节需要注意。首先token 要设置过期时间我设的是 24 小时太短影响体验太长不安全。其次token 的密钥要单独配置在配置文件里不能硬编码在代码里否则代码一泄露所有 token 都能被伪造。第三前后端要保持时钟同步如果服务器时间不对token 的iat签发时间和exp过期时间会校验失败。但是 JWT 有一个天然问题服务端无法主动让 token 失效。如果用户被禁用他手头的 token 在过期之前依然有效。我在项目里的解决方式是加了一个简单的在线状态表每次请求时除了校验 JWT还会查一下用户状态是否正常。这样管理员禁用某个用户后他的 token 立即无法使用。Spring Security 的集成在这个项目里做成了两段式核心的过滤器链处理登录接口放行、其他接口拦截同时自定义了一个AuthInterceptor具体做 token 解析和用户信息注入。这样比把所有逻辑都塞进 Spring Security 配置里要清晰得多。我第一次做这个项目的时候走了弯路把权限逻辑全写在 SecurityConfig 里头结果是配置类和业务逻辑耦合在一起每次改动都要小心翼翼。4.2 课程与选课模块的后端实现课程模块的核心接口有三个创建课程、查询课程列表、获取课程详情。创建课程的时候要带上教师 ID这个 ID 从 JWT 里解析出来不要让前端传否则用户可以伪造他人身份创建课程。课程列表的查询支持分页和关键词搜索搜索字段包括课程名称和课程编号用的是 MyBatis 动态 SQL 的if标签拼接条件。这里有一个比较隐蔽的坑分页查询一定要排序否则数据多的情况下翻页会出现重复数据。我统一用create_time DESC排序主键 ID 作次级排序保证顺序稳定。分页插件用的是 PageHelper它通过 AOP 拦截 SQL 实现自动分页但使用的时候要注意不要在循环里调用分页方法否则会 SQL 错乱这个坑我踩过排查了很久才发现是循环分页导致的。选课模块是学生加入课程的核心操作。接口逻辑是根据课程编号查询课程校验课程状态然后检查选课表是否已经存在记录不存在才插入。这个接口有并发风险——同一个学生同时发两次请求有可能两次都查到不存在然后都向选课表插入数据。虽然联合唯一索引兜底不会出现脏数据但会有一条请求直接抛异常返回体验不好。我的解决方式是先用select ... for update锁住课程表记录再去检查选课表后续请求会等锁释放后再次检查最终只插入一条记录。4.3 作业与成绩管理事务和状态机作业模块的创建接口接收的参数比较多标题、内容、截止时间、附件。其中截止时间的校验放在后端处理不能用前端的校验就完事防止有人绕过前端直接请求。截止时间必须在当前时间之后存储格式用datetime。学生提交作业的接口里我用了事务。为什么需要事务因为一次提交要做两件事插入提交记录、更新作业表的提交人数统计。如果插入记录成功但统计更新失败数据就对不上了。Spring 的事务注解Transactional放在方法上一旦方法中任何一步抛出 RuntimeException全部回滚。成绩批改是教师端的操作教师获取某次作业的所有提交记录逐条评分填写评语。评分接口做的是更新操作更新条件是提交记录的状态必须是待批改不然教师重复点击会把已批改的作业重新覆盖。状态字段我用的是tinyint0 代表待批改1 代表已批改逻辑清楚又省空间。这里给个建议状态的变更在代码里最好用常量类统一管理不要散落成魔法数字否则半年以后你自己看代码都要猜半天。4.4 MyBatis 的技巧和动态 SQL 实践MyBatis 在这个项目里的使用频率非常高几乎每个模块都有自定义 SQL。我最常用的是where、set、foreach这几个标签。where标签的好处是自动处理掉条件里的多余 AND不用每个条件前都手动判断是否需要拼 ANDSQL 看起来干净很多。批量插入用foreach是典型场景。比如批量导入学生名单前端传一个学生列表后端解析后一次性插入。MyBatis 的 batch 模式性能远高于循环单条插入。但也有注意点批量插入的 SQL 有长度限制千万级别的参数会直接报错所以代码里我是分批插入的每批200条。还有一个经常被忽略的问题MyBatis 中的#{}和${}。#{}会生成预编译的占位符?防止 SQL 注入${}是直接拼接字符串有注入风险。这个项目里凡是涉及外部传入的参数一律用#{}${}只在排序字段名这种不可能产生注入的地方使用而且要经过白名单校验。权限相关字段、表名这类绝对不能拼接用户输入。5. 前端页面与交互逻辑拆解5.1 前端项目的目录结构和路由规划前端用 Vue CLI 构建目录结构遵循标准的 Vue 工程规范src/api放接口请求src/router放路由配置src/store放 Vuex 状态管理src/views放页面组件src/components放公共组件。这样的分层清晰每增加一个功能模块就在对应目录下新建文件互不干扰。路由的设计做了两件重要的事。第一懒加载。每一个页面组件都通过() import(...)的方式引入这样首屏只加载必要组件不会把整个应用都打包成一个巨型文件。第二路由守卫。beforeEach里检查用户是否已登录没登录就重定向到登录页已登录的用户如果直接访问无权访问的地址会被重定向到404页。菜单的动态渲染是基于后端返回的权限数据在前端登录后获取存到 Vuex再根据权限生成侧边栏菜单项。5.2 学生端页面核心交互体验学生端的首页是课程卡片列表每张卡片展示课程名称、教师、简介。卡片点击进入课程详情页里面包含课程资料列表和作业列表两个 Tab。作业列表这里我刻意区分了三个状态待提交、已提交待批改、已批改。学生一眼能看出自己要做什么和当前进度。提交作业的对话框里有富文本编辑器允许粘贴格式化的文本还支持附件上传。上传组件用的是 Element UI 的el-upload设置action指向后端的文件上传接口on-success回调里把返回的文件地址填进表单。这里有一个前端细节文件上传期间按钮必须禁用否则学生可能连点多次生成多个重复附件。el-upload的before-upload钩子里可以控制提交期间加一个 loading 状态同时禁用确认按钮。5.3 教师端页面数据填写的交互约束教师端的核心页面是课程管理、作业管理、批改打分。课程创建的表单有课程编号、名称、简介这些字段其中课程编号我做了唯一性校验。校验逻辑分两层前端先调用接口检查是否已存在后端保存时再用唯一索引兜底。双保险以防前端绕过限制。作业管理页面有一个比较有趣的设计作业列表显示了提交率和批改率。提交率是提交人数除以选课总人数批改率是已批改数除以提交总数。这两个数字是教师最关心的直接决定接下来的工作节奏。实现方式是在查询作业列表的 SQL 里做聚合统计关联选课表和提交表一次查询全部算好。批改页面用卡片流的方式展示每个学生的提交记录包含学生姓名、提交时间、提交内容预览、附件下载按钮下方是分数输入框和评语输入框。这里我加了自动保存的功能教师输入分数后光标移开或点击下一位学生时自动触发保存请求不需要手动点保存按钮。这个细节在真实使用中非常受欢迎极大减少了教师的重复操作。5.4 管理员端页面用户和数据的兜底管理管理员端的功能聚焦在用户管理和数据查看。用户管理页支持用户的增删改查、重置密码、启用禁用。重置密码的逻辑需要小心管理员端只能重置密码不能查看密码因为密码是 BCrypt 加密的明文无法还原。重置后的默认密码是固定字符串首次登录时提示用户修改。数据统计页面用 ECharts 展示图表选课趋势折线图、作业提交率柱状图、成绩分布饼图。ECharts 的配置项有点繁琐我的经验是把图表封装成公共组件传入option对象即可不同的图表页面只需要构建不同的数据源不需要重复写初始化、销毁的代码。管理员还需要一个“系统公告列表”的维护入口。公告编辑用的是和作业富文本一样的编辑器保存后发布状态自动上线。置顶功能就是给公告表加一个is_top字段排序时置顶的排前面同级别按时间倒序。6. 环境搭建、部署与联调实录6.1 本地开发环境准备清单先列一下我整套环境的所有工具版本作为参考工具版本备注JDK1.8SpringBoot 2.7 兼容 Java 8不要用 17 以上Maven3.6构建工具Node.js14Vue 2 工程需要MySQL5.7 / 8.0两个版本均可IDEIdea VSCode后端用 Idea前端用 VSCodeJDK 版本这里要强调一下这个项目基于 SpringBoot 2.7如果 JDK 升到 17 或 21很多依赖会报不兼容的错处理起来麻烦。如果你一定想用新 JDK需要把 SpringBoot 升到 3.x但那样代码里会有一些 API 变动没必要为了新而新。MySQL 安装完成后记得设置字符集为utf8mb4。这个字符集不仅支持中文还支持生僻字和 emoji 符号否则学生名字里带个生僻字就写入失败。字符集的设置在 MySQL 的配置文件 my.ini 中[mysqld]段落里加character-set-serverutf8mb4。6.2 数据库初始化和配置项目里附带一个init.sql脚本包含所有表结构的创建语句和部分测试数据。执行方式很简单mysql -u root -p init.sql后端数据库连接配置在application.yml文件里spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/teaching_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai username: root password: your_password mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.example.teaching.entity configuration: map-underscore-to-camel-case: true注意map-underscore-to-camel-case这个配置它能把数据库的create_time字段自动映射到 Java 的createTime属性少写很多 resultMap。6.3 后端启动过程和常见启动问题后端启动步骤mvn clean install cd target java -jar teaching-system.jar如果启动失败80% 的原因是端口被占用。SpringBoot 默认端口是 8080如果你的电脑上已经跑着其他项目占用这个端口改一下application.yml里的server.port就好。另一个高发问题是数据库连接失败检查一下数据库服务是否启动、密码是否正确、用户是否有远程访问权限。还有一个坑如果你的 MySQL 版本是 8.0还需要在 pom.xml 里确认 MySQL 驱动版本要匹配。8.0 的数据库必须用mysql-connector-java8.x 版本用旧版本驱动会报Public Key Retrieval is not allowed的错误这时要在数据库连接 URL 里加参数allowPublicKeyRetrievaltrue。6.4 前端启动和前后端联调前端依赖安装用 npm 或 yarnnpm install npm run serve默认端口是 8080和后端的 8080 会冲突。解决方式是改 Vue 项目的vue.config.js把端口改成 3000同时配置代理把/api前缀的请求转发到http://localhost:8080module.exports { devServer: { port: 3000, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }有了代理前端请求就写/api/...的相对路径不需要拼接完整域名。这样联调时既解决了跨域问题也方便以后部署到线上时由 Nginx 统一转发。6.5 生产环境的简单部署方案生产环境我用的是经典的Nginx Jar 包方案。后端打包成 jar用systemd或nohup守护运行前端npm run build构建出静态文件放到 Nginx 的 web 目录Nginx 里配置静态资源直接由 Nginx 处理/api开头的请求反向代理到后端的 8080 端口server { listen 80; server_name your_domain; root /var/www/teaching-web; index index.html; location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }这种部署方式扛住一个学校级别的并发完全没有问题。如果想要更高的可用性可以在 Nginx 层配置负载均衡后端开多个 jar 实例但教学辅助平台的负载一般远达不到需要集群的程度单机部署加上每天备份数据库就够了。7. 踩坑记录与排查思路速查表在这里把开发这套系统过程中遇到的高频问题整理成一张排查表基本覆盖了你复现或二次开发时可能碰到的坑。问题现象可能原因解决方案前端请求接口报 401token 过期或请求头没带 token检查请求拦截器是否把 token 加到请求头检查 token 有效期接口报 403当前用户权限不足检查该接口是否需要管理员或教师角色查看后端拦截器放行路径配置中文数据乱码数据库表字符集不是 utf8mb4修改表字符集或建表时指定DEFAULT CHARSETutf8mb4时间字段相差8小时时区配置不一致数据库连接 URL 添加serverTimezoneAsia/Shanghai服务器时区也设为东八区分页数据重复查询没排序SQL 统一加ORDER BY id DESC作稳定排序上传文件后无法访问静态资源路径没配置配置 SpringBoot 静态映射或让 Nginx 直接指向文件目录批量导入学生时卡顿循环单条插入换 MyBatisforeach批量插入每批 200 条前端路由刷新后404前端用的是 history 模式服务器做 fallback把所有路由指向 index.html密码修改后旧 token 仍生效JWT 无法主动失效校验时查用户状态禁用用户后不允许访问受保护接口7.1 跨域问题不能只靠前端代理解决开发环境用了代理跨域是解决了但生产环境如果前端和后端不在同一域名下或者 API 网关配置不当跨域问题会再冒出来。我建议直接在后端配置跨域支持用 CorsFilter 统一处理允许指定的前端域名访问。这里说一个重要细节跨域配置中允许的请求头必须包含 Authorization。很多人只开放了allowedOrigins和allowedMethods漏掉了allowedHeaders结果前端带 token 的请求被拦截而且错误信息往往不直观排查起来非常容易让人蒙圈。7.2 前端状态管理的血泪教训Vuex 的用法上我一开始走得比较初级把涉及用户信息的数据全放在一个 state 里分散在多个页面组件中随意修改。后来用户信息被登录页更新后其他页面的数据没有同步刷新出现了用户明明绑定了课程却看不到课程列表的问题。解决方案是所有涉及用户状态变更的操作必须通过 Vuex 的 action 进行组件内不再直接修改 state。比如登录后调dispatch(user/login)退出登录调dispatch(user/logout)。这样状态更新的位置是集中且可预测的排查问题时几分钟就能定位到原因。另外页面刷新后 Vuex 数据会丢失需要从 localStorage 或后端重新拉取用户信息这个逻辑放在路由守卫里做。7.3 富文本编辑器选型的经验项目里的富文本编辑器一开始选的是较重的全功能编辑器组件体积大、初始化慢而且样式和 Element UI 不一致观感很差。后来换成了轻量方案只保留常用功能加粗、斜体、标题、列表、插入链接。这里我的体会是教学场景的文本输入大多是比较规整的不需要复杂排版选型要走轻量路线。附带一个安全点富文本内容在展示时如果直接插入 DOM有 XSS 风险。我做了简单的过滤器把script、onerror这类危险标签过滤掉。如果用户输入的内容包含异常脚本在提交接口时就拦截并返回提示信息从源头保障安全。8. 一些基于实战的扩展建议项目跑通之后如果想继续完善有几个值得做的方向。第一个是成绩可视化分析目前系统是展示单个学生的成绩但教师更想看到班级整体分布这个需求可以跟 ECharts 结合做进阶图表。第二个是消息通知目前公告是主动去系统里看的如果能对接邮件或微信通知触达效率会高很多。第三个是数据备份策略目前是手动备份可以加一个定时任务每天凌晨自动备份数据库并保留最近七天的备份避免误操作导致数据丢失。还有一个技术上值得尝试的方向把作业提交的存储改造成支持对象存储或云存储文件不挂在本地磁盘上。这样无论服务器迁移还是磁盘扩容都很方便但这个改动需要引入第三方依赖建议根据部署环境决定是否必要。我个人实际操作下来的体会是这套系统的定位和价值不在于某一项技术有多高深而在于把切实的教学管理需求用成熟的方案稳定落实。SpringBoot 和 Vue 的组合看起来是“老生常谈”但它的稳定性、查错成本、开发效率对中小型项目始终是无法忽视的优势。很多开发者追求极新技术栈但项目的成功往往取决于选型是否匹配真实场景。你把这套源代码的每一层理清楚比如数据库表关系为什么要这样设计、拦截器为什么在这里认证、路由守卫为什么在这里判断权限比单纯追求新框架的收益要大得多。最后分享一个小技巧。这个项目里所有接口的返回格式我都统一成了{ code, message, data }的结构前端有一个全局的 axios 响应拦截器code 为 200 时才正常返回数据否则弹出错误提示。这个约定十分简单但作用极大联调的时候你对每个接口的返回结构都有一致的预期省去了很多“这个接口到底返回什么”的沟通成本。如果你准备拿这套代码二次开发建议把返回格式这个约定贯彻下去后续每加一个模块都不需要为接口格式操心。如果你正在做教学辅助或者在线学习类的项目可以顺着这个思路动手复现一下。先把用户、课程、作业、成绩四个核心模块跑通再逐渐扩展公告、统计、消息等辅助功能迭代路径会非常顺。遇到问题的时候优先看数据库表关联再看后端日志最后排查前端请求链路大多数问题都能在十分钟内定位到根因。希望你少走一些我走过的弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑