拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Java+SpringBoot+Vue教务管理系统毕设实战:选课冲突与权限控制

简介教务管理系统是高校信息化建设中的基础应用也是Java方向毕业设计的热门选题。围绕这一场景SpringBoot与Vue的前后端分离架构、MySQL数据库建模、JWT权限校验等核心技术构成了完整的技术栈。选课冲突检测通过节次区间重叠判断保证课表合理性唯一索引与原子更新则从数据库层面防止重复选课和超选问题三角色的权限控制有效隔离了管理员、教师与学生的操作边界。该系统不仅适用于真实教务管理场景更能全面锻炼工程实践能力。从需求分析到数据库设计从选课逻辑到答辩预判深入拆解系统实现的关键细节为开发者和毕业生提供可落地的参考思路。 说句实话“教务管理系统”在Java毕设里已经算不上什么新鲜选题了。但如果你去问那些带过毕业设计的导师他们大概率还是会告诉你这个选题靠谱。原因很简单——需求不绕弯、角色边界清楚、前后端技术栈覆盖面均衡而且“选课冲突检测”“权限控制”“成绩录入”这些功能点天然就是答辩时能拿得出手的技术展示。如果你手里正好拿到一套“基于JavaSpringBootVueMySQL的教务管理系统”的项目源码、数据库脚本和论文或者正打算往这类选题方向走这篇文章就是帮你把整套项目从头到尾吃透的实操笔记技术栈为什么这样选、数据库表怎么建模、核心功能怎么实现、项目怎么跑起来、论文和答辩怎么配合一步都给你说清楚。1. 为什么“教务管理系统”能成为Java毕设的常青树1.1 需求边界清晰学生理解成本极低很多人低估了“需求好理解”对毕设的隐形加成。像“智慧农业平台”“电商秒杀系统”这类选题光理解行业背景就要花掉两周还要看大量行业资料最后画出来的用例图可能自己都讲不顺。教务管理系统不一样每一个进过大学的人都知道教务系统长什么样学生要选课、查成绩、看课表老师录入成绩、查看授课名单管理员维护课程、专业、班级和用户信息。需求的边界天然清晰做系统分析的时候不需要费劲向导师解释业务背景评委审阅时也能很快跟上你的思路答辩被追问业务细节的概率也大大降低。1.2 技术覆盖“广而稳”正好命中毕设评分维度毕设评分通常不是看你用了多新潮的技术而是看你在一个完整业务流程里能否把学过的知识系统地组织起来。教务管理系统恰好提供了一个非常均匀的技术展示场景前端Vue组件化、路由、状态管理、前后端HTTP交互后端Spring Boot分层架构、RESTful API、参数校验、鉴权、事务数据库多表关联、唯一约束、索引设计、事务隔离工程能力Maven依赖管理、application.yml多环境配置、统一返回结果、全局异常处理也就是说一套需求量中等的教务系统做完你在简历上能写的“技术点”几乎不用额外堆砌全部来自项目本身。对毕设导师来说这是一个“面面俱到但没有过度设计”的预期范围。1.3 三种角色天然适合做权限演示管理员、教师、学生三种身份权限差异一眼就能看出来。学生只能选课和查成绩教师只能给本人课程录成绩管理员拥有全部菜单。演示的时候只要现场切换账号登录菜单和数据范围的变化是肉眼可见的这比单纯用语言描述“我做了权限功能”有说服力得多。这也是“教务管理系统”项目在答辩时普遍占便宜的原因之一——权限控制这个大加分项不需要额外构造演示场景系统本身的业务流程就帮你演出来了。1.4 工作量可控还能分层做扩展一套完成度不错的教务管理系统核心代码量大约在5000到8000行之间一个熟悉Spring Boot开发流程的同学全职投入一个月左右可以搞定。它的功能之间有清晰的依赖边界选课模块依赖课程模块成绩模块依赖选课模块但每个模块又可以独立扩展。哪怕你做到一半想加功能比如加一个数据可视化大屏也不会影响原有代码结构。这种“可伸缩”的特性意味着你完全可以根据自己的实际能力和剩余时间来裁剪功能而不用担心项目半途崩盘。2. 拆解功能模块三角色边界与核心业务链路2.1 需求落地的第一件事不是写代码而是画角色边界拿到源码后不要急着打开IDE。先弄清楚这套系统做了什么、每个角色能干什么。常见的教务管理系统一般拆成三个端管理员端、教师端、学生端。管理员端的功能集中在“基础数据维护”和“系统配置”两类用户管理为教师、学生创建账号、重置密码、禁用账号院系、专业、班级管理维护学校组织架构课程管理新增课程、设置课程的学分、学时、上课时间、地点、上课教师、选课容量教学班/排课管理把课程按学期组织成可供学生选择的教学班公告管理发布学生端、教师端可看到的通知基础统计查看选课人数、课程热度等简单统计结果教师端相对精简但逻辑更贴近线下教学场景查看本人名下的授课课程查看每门课程的选课学生名单录入成绩、修改成绩通常只能修改一次或需提交后由管理员解锁查看个人课表学生端是交互量最大的部分查看和修改个人基础信息选课浏览可选课程提交选课退课在规定时间内退选课程查看个人课表课表需要按“星期几 第几节课”的维度组织成绩查询查看单科成绩、已修学分和加权平均分2.2 一条核心链路从建课到出成绩把三个角色串起来看整个系统归根到底只有一条主链路管理员维护基础数据院系、专业、班级、教师账号 → 管理员创建课程并指定授课教师、上课时间、选课容量 → 学生在可选列表中选课系统做容量校验和时间冲突校验 → 教师进入课程名单给学生打成绩 → 学生查询成绩和学分。这条链路在论文的“需求分析”章节里几乎可以直接转成文字加用例图。建议你拿到项目后第一件事就把这条链路在代码里走通一遍前端操作、后端接口、数据库记录三个层面都对应上。这样后面无论改代码还是写论文心里都有一张地图。2.3 不要忽略的隐性功能登录鉴权与操作日志很多同学关注业务功能忽略了两类“辅助功能”恰恰是这两类辅助功能对毕设评分影响很大。第一是登录鉴权系统必须区分三端角色并校验登录状态这通常通过JWT或Session实现第二是操作留痕比如成绩修改这类敏感操作是否记录了操作人和时间。源码里如果带了这些答辩时一定要主动展示如果没带强烈建议自己补上工作量不大但观感提升非常明显。3. 技术选型复盘Spring Boot Vue MySQL为什么是“安全牌”3.1 Spring Boot版本别贪新2.7.x是毕设最优解最近在“springboot版本太高”这个话题上有不少同学踩坑我自己也见过几回项目直接选了Spring Boot 3.x结果JDK版本要求变成17以上以前的教程代码跑不通某些依赖库的坐标也变了最典型的是javax.*全部迁移为jakarta.*连import javax.servlet.http.HttpServletRequest都要改。对毕设来说除非你已经很熟悉Spring生态的版本迁移否则用Spring Boot 2.7.x是最稳的。2.7.x是2.x这个分支的最后一个版本社区资料最丰富网上搜到的问题答案基本都能直接用对JDK 8的兼容也最好不折腾。3.2 ORM选型MyBatis-Plus几乎是默认答案Spring Boot生态里做数据访问层主要有两条路Spring Data JPA和MyBatis/MyBatis-Plus。毕设场景我更推荐MyBatis-Plus理由有三个单表CRUD不需要写SQLBaseMapper直接提供selectById、insert、updateById内置分页插件、逻辑删除、字段自动填充省去大量样板代码有代码生成器数据库表建好之后可以一键生成实体类和Mapper写论文的“系统实现”章节时尤其省力JPA当然也不错但它的SQL自动生成逻辑对初学者来说往往是一个黑盒答辩时被问到“这条SQL具体是怎么查出来的”容易卡壳。MyBatis-Plus至少还有MQ的日志打印你可以直接看到底层SQL。3.3 权限方案JWT 拦截器比Spring Security更“讲得清”登录鉴权的实现方案很多教程会推荐Spring Security但我不建议毕设一上来就上这个。Spring Security本身是一个功能强大的安全框架但它的过滤器链和配置方式对新手非常不友好稍微配错一个地方登录就神秘地跳转失败或者403而且调错日志不明显。毕设推荐自己实现JWT 拦截器方案用户登录成功后端生成一个带过期时间的JWT字符串返回前端前端把Token存到localStorage或请求头里后端写一个拦截器拦截需要登录的接口从请求头解析Token并验证根据Token里的角色字段判断接口是否有访问权限这套方案胜在逻辑完全透明每一行代码都能讲清楚而且从零写一遍也就两三百行。对于答辩来说一个能逐步口述的鉴权流程远比一个配置了5分钟但说不明白的Spring Security更有说服力。如果你确实想用Spring Security来增加项目分量也可以但一定要确保自己能说清楚过滤器链的顺序逻辑。3.4 前端Vue 2 Element UI是稳妥选择Vue 3也没问题前端选Vue 2还是Vue 3我的建议很直接如果你对Vue不熟选Vue 2 Element UI因为教程最多遇到问题随便一搜就是现成答案如果你打算在简历上强调Vue 3技能那就在项目里上Vue 3 Element Plus但要做好踩坑的心理准备比如某些第三方插件可能还没适配。无论选哪个有四个点是必须掌握的vue-router的路由配置和路由守卫、axios的封装和拦截器、组件之间的props和$emit通信、以及Vue的响应式原理基本概念。这几个点答辩必问。3.5 MySQL版本与字符集8.0是标配utf8mb4是底线MySQL数据库版本方面5.7在老教程里常出现但新机器上直接装MySQL 8.0更省事。8.0的默认认证插件是caching_sha2_password如果你用的是老版本的驱动连接会报错所以记得把mysql-connector版本升到8.x或者用com.mysql.cj.jdbc.Driver驱动类。数据库字符集一定要用utf8mb4不要用utf8否则学生姓名里万一有生僻字或表情符号插入数据库会乱码或报错。3.6 版本推荐表组件推荐版本说明JDK1.8 或 11Spring Boot 2.7.x完全兼容运行时内存占用小Spring Boot2.7.x资料多、兼容JDK8、避坑3.x迁移问题MyBatis-Plus3.5.x单表CRUD免写SQL支持代码生成器MySQL8.0性能好、官方支持周期长注意升级驱动Vue2.x 或 3.x新手选2.x想写简历亮点选3.xNode.js14以上对应前端Vue2/Vue3构建工具要求4. 数据库建模与核心表设计冲突检测和权限落地的关键4.1 核心表清单不是越多越好而是够用不冗余教务管理系统的表结构在各项目里大同小异。我在校验代码时习惯先看表结构因为表设计直接决定功能实现的上限。下面这套核心表结构覆盖了大多数“源码数据库”版本会提供的范围表单关键字段用途说明sys_userid, username, password, role, status统一登录账号表角色区分管理员/教师/学生collegeid, name院系表majorid, name, college_id专业表挂靠院系clazzid, name, major_id, grade班级表挂靠专业teacherid, user_id, teacher_no, name, title教师信息表与登录账号关联studentid, user_id, student_no, name, gender, clazz_id学生信息表与登录账号关联courseid, course_no, name, credit, hours, teacher_id, day_of_week, start_section, end_section, classroom, capacity, selected_count, term课程表含上课时间与容量scid, student_id, course_id, selected_time, score选课表兼作成绩记录表noticeid, title, content, publish_time公告表第4.2节 先说两个关键设计第一student和teacher表都通过user_id关联sys_user这比在每个业务表里直接存用户名更规范。登录验证走sys_user业务数据展示再关联查询学生或教师详情权限逻辑和数据逻辑分离。第二course表中直接包含teacher_id、day_of_week、start_section、end_section、capacity、selected_count这是很多项目常用的简化思路——课程表兼任排课表和教学班表。虽然严格的数据库设计可能把排课信息单独拆表但毕设场景下这样的冗余设计减少了关联查询、代码更直观而且完全满足教务管理系统的典型需求。4.2 选课表唯一索引防止重复选课选课表sc是整个系统里高并发和数据一致性要求最高的一张表。建表时一定要对(student_id, course_id)加唯一索引防止同一学生重复选择同一门课程。别觉得前端把按钮禁用了就万事大吉——多个请求并发到达时前端限制是挡不住的只有数据库层面的唯一约束才可靠。选课记录里的selected_time字段也很有用将来如果想做“先到先得、达到容量即关闭”的逻辑它就是排序依据。4.3 时间冲突检测从字段设计到代码实现的一次讲解“选课不冲突”是教务系统里最有技术含量的需求之一也是答辩时老师非常喜欢追问的点。时间冲突的核心是课程表中那三个字段day_of_week星期几、start_section起始节次、end_section结束节次。判断两门课是否冲突的逻辑是星期几相同且两个节次区间有交集。区间重叠的条件是newCourse.getStartSection() oldCourse.getEndSection() oldCourse.getStartSection() newCourse.getEndSection()比如已选课程是周一第1到第2节新选课程是周一第2到第3节由于起始节次2小于等于已有结束节次2并且已有起始节次1小于等于新课程结束节次3两个区间重叠判定为冲突。这是一个标准的闭合区间重叠判断面试和答辩都可以画线段图来讲。选课Service的完整判断逻辑一般长这样public void selectCourse(Integer studentId, Integer courseId) { Course newCourse courseMapper.selectById(courseId); if (newCourse null) { throw new ServiceException(课程不存在); } if (newCourse.getSelectedCount() newCourse.getCapacity()) { throw new ServiceException(该课程选课人数已满); } ListCourse selectedCourses scMapper.selectCoursesByStudentId(studentId); for (Course oldCourse : selectedCourses) { if (oldCourse.getDayOfWeek().equals(newCourse.getDayOfWeek()) newCourse.getStartSection() oldCourse.getEndSection() oldCourse.getStartSection() newCourse.getEndSection()) { throw new ServiceException(与已选课程《 oldCourse.getName() 》上课时间冲突); } } // 插入选课记录 // 更新课程已选人数推荐用行锁或乐观锁 }这里还有一个容易忽略的点选课人数扣减。先查再更新会带来超选风险正确做法是用一条原子更新的SQL把已选人数小于容量作为更新条件int rows courseMapper.increaseSelectedCount(courseId); if (rows 0) { throw new ServiceException(选课人数已满); }或者用乐观锁更新时比对selected_count的旧值。这个细节在答辩时提出来说服力会直接上一个台阶。4.4 成绩表与“只记录最终成绩”的处理策略成绩管理听起来简单但有两个隐蔽问题值得提前思考。第一个是成绩对应哪条记录。选课表sc里直接加score字段是最省事的做法因为一门课程一个学生只会有一条选课记录成绩就挂在选课记录上。如果你单独建一张成绩表反而要额外维护“选课记录ID”或“课程学生”的双重外键增加复杂度。第二个是成绩的“一次录入、多次修改”。教师录入成绩后如果想修改系统的权限控制应该有点说法。常见的做法是教师可修改自己课程的成绩但必须记录修改日志。如果你希望更严谨可以在选课表上加score_status字段比如“未录入”“已提交”“已审核”教师提交后由管理员审核审核过后不可修改。这个设计可大可小但很能体现你的工程思维。4.5 初始数据脚本让项目“开箱即用”的隐藏环节数据库脚本里总有一些初始数据有些是演示数据有些是系统运行的硬依赖。最容易被忽略的是管理员账号。如果脚本里没有默认管理员账号项目启动后你连后台都进不去。一般默认管理员账号会有两种情况账号admin密码admin或123456初始化脚本中直接插入哈希值通过一个DataInitializer组件在应用启动时检查并创建管理员账号无论哪种方式都要在“项目说明”或论文的“运行环境”一节中写清楚否则导师拿到项目连登录都摸不着头脑体验很差。同理演示用的课程数据最好也塞几条进脚本至少保证学生端选课页面打开时有内容、有冲突效果可以演示。5. 从源码到跑通环境准备、启动流程与常见报错排查5.1 环境准备JDK、Maven、Node.js、MySQL这四件套把项目跑起来首先要有一台能编译Java项目并运行前端的环境。最基本的四件套如下JDKSpring Boot 2.7.x建议用JDK 1.8或11安装完成后配置环境变量JAVA_HOME和PATH命令行执行java -version验证Maven建议3.6以上执行mvn -v验证Node.js版本建议14以上Vue 2项目一般12以上能用Vue 3项目建议16以上执行node -v和npm -v验证MySQL8.0安装时把字符集设为utf8mb4记好root密码环境变量配置是新人容易卡住的地方尤其是Windows系统。配置完环境变量后一定要重新打开命令行窗口再验证旧窗口读不到新配置。5.2 数据库导入编码、时区和账号权限拿到项目的xxx.sql文件后用命令行或Navicat/MySQL Workbench导入。导入时注意三件事。第一确认数据库字符集为utf8mb4避免生僻字和表情符号乱码。命令行导入时可以指定mysql -u root -p --default-character-setutf8mb4 edu_admin.sql第二确认连接串里的时区。MySQL 8.0默认时区设置经常导致连接报错Java后端连接串推荐带serverTimezoneAsia/Shanghaispring: datasource: url: jdbc:mysql://localhost:3306/edu_admin?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue username: root password: 你的密码 driver-class-name: com.mysql.cj.jdbc.Driver第三确认root账号允许从Java程序连接。一般本地开发都用root如果报Access denied检查密码是否正确以及是否使用了mysql_native_password认证插件。MySQL 8.0默认的caching_sha2_password在部分低版本驱动下会连接失败所以驱动要用com.mysql.cj.jdbc.Driver。5.3 后端启动mvn spring-boot:run 还是打包后运行后端起项目有两种方式二选一。教程里最常见的是IDEIDEA里直接运行主类但如果你更习惯命令行先编译再打包更“生产化”cd 后端项目目录 mvn clean package -DskipTests java -jar target/edu-admin-0.0.1-SNAPSHOT.jar启动成功后控制台出现Tomcat started on port(s): 8080就说明后端就绪。这里多说几句常见启动报错我已经踩过不止一次APPLICATION FAILED TO START提示端口占用8080端口被占用在application.yml里改server.port或者杀掉占用端口的进程java.lang.OutOfMemoryError: insufficient memoryMaven或JVM分配内存不足检查mvn -v看到的运行环境或给IDEA的VM options调大-XmxClassNotFoundException: javax.servlet.Filter项目错用了Spring Boot 3.x的依赖或JDK版本不对回到3.1节的版本建议Failed to configure a DataSource:url属性没配置或数据库没启动检查application.yml和MySQL运行状态另外提醒一句如果你在热搜里见过“java环境变量配置”的问题这里强调验证三步java -version、javac -version、mvn -v。JDK和Maven任何一个环境变量错乱都会直接导致后端启动失败。5.4 前端启动npm install卡住是常态进到前端目录一般是frontend或vue-admin执行npm install npm run serve如果npm install因为网络原因卡住或特别慢可以用淘宝镜像源npm config set registry https://registry.npmmirror.comnpm install成功后会生成node_modules目录这是正常的。npm run serve启动成功后控制台会打印本地访问地址比如http://localhost:8081。这里还有一个关键的跨域问题前端跑在8081后端跑在8080前端直接请求后端接口会被浏览器拦截。解决方法有CORS后端配置和前端proxy代理两种推荐用前端代理典型的vue.config.js配置如下module.exports { devServer: { port: 8081, proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } } }这样前端把请求发到/api开头代理自动转发到后端浏览器无跨域问题。前端的调试建议装一下Vue Devtools浏览器插件查看组件状态、路由参数、接口请求都非常方便排查问题时能省一半时间。5.5 跑通后的功能自测清单项目能启动不等于项目没问题。拿到源码后建议按下面的清单完整自测一遍任何一步卡住都能知道是代码问题还是数据问题用管理员账号登录进入后台创建一门新课程指定上课时间为“周一 1-2节”容量写2创建2个学生账号并分配班级切换学生账号查看可选课程列表学生A选占容量学生B再选同一门课验证容量满后无法再选学生A再选一门“周一 3-4节”的课程验证编排成功然后尝试选一门“周一 2-3节”的课程验证冲突报错切换教师账号查看课程名单给学生A录入成绩切换学生账号查询成绩核对分数和学分管理员修改学生密码学生使用新密码登录这8步走完核心功能基本没有大问题了。如果其中某一步不对优先从前端控制台的报错、后端日志、数据库记录三个层面定位。6. 从“跑通”到“高分”论文结构、答辩预判与二次扩展6.1 论文目录这么搭导师看着省心毕设论文的核心作用不是展示你写了多少行代码而是让导师看到你能把“需求-设计-实现-测试”这一条工程链路讲完整。参考目录结构这样安排摘要、关键词第一章 绪论研究背景与意义、国内外研究现状、论文主要工作第二章 相关技术介绍Spring Boot、Vue、MySQL、MyBatis-Plus、JWT第三章 系统分析可行性分析、用户角色分析、功能需求分析、非功能需求分析第四章 系统设计系统总体架构、功能模块设计、数据库设计ER图表结构第五章 系统实现分角色展示关键页面截图和核心代码片段第六章 系统测试测试环境、功能测试用例表、测试结果分析第七章 总结与展望参考文献、致谢这个结构最大的优点是“稳”每个章节都有明确写作素材而且每章之间逻辑递进清晰。你不需要在论文里炫技把每个功能模块的设计思路和实现结果匹配上分数自然不低。6.2 图表语言用例图、ER图、时序图、页面截图一个都别少论文评审老师看论文的速度远比你想的快图表是让他们快速理解你项目的最有效工具。一套教务管理系统的论文至少要有这几类图系统用例图管理员、教师、学生三个角色的用例都要画清楚数据库ER图核心实体及关系用PowerDesigner或draw.io画核心流程时序图选课流程、登录鉴权流程各一张系统功能结构图按角色列出全部功能模块页面原型截图登录页、选课页、成绩录入页、课程管理页等关键页面图不等于截图图是带标注的设计图截图是系统实现效果。两者配合论文的“系统设计”和“系统实现”章节就饱满起来了。我见过太多论文全是文字描述一张图都没有导师看一页就失去耐心了。6.3 答辩前最值得准备的10个问题答辩不是看你把项目演示完而是通过提问判断你真实参与度。以下10个问题是我从多场Java毕设答辩里总结下来的高频提问建议提前准备好口述答案密码为什么用BCrypt加密而不是MD5JWT Token过期了怎么办前端怎么处理选课时间冲突的具体判断逻辑是什么数据库有哪些唯一索引和普通索引为什么这样设计选课时并发量很大怎么防止超选前后端分离之后跨域是怎么解决的前端路由守卫是怎么实现未登录跳转的成绩录错了如何修改有没有权限和日志记录项目里哪里用到了事务为什么需要事务这个系统能不能部署到Linux服务器怎么部署每个问题背后都对应一个真实的设计与实现细节。建议你把对应的代码位置和流程在源码里找出来用自己的话讲一遍而不是背答案背出来的答案和讲出来的答案评委一听就能分辨。如果在搜索引擎里看到类似的面试题也别小瞧毕设答辩问法其实和初级Java面试高度重合。6.4 想拿更高分可以再加三个扩展功能如果核心功能已经做完还有余力可以考虑在原有架构上加下面三个方向中的一个。每个方向的工作量都不大但能明显提升项目的完整度和答辩的“新鲜感”数据可视化统计在前端加一个管理端首页用ECharts展示各院系选课人数、课程容量利用率等图表技术难度低视觉效果好Excel批量导入导出用EasyExcel实现“学生名单导入”和“成绩导出”管理员操作效率提升直观可见公告与邮件通知在管理员发布公告后向相关角色发送邮件引入简单的消息通知机制这三个方向任何一个都需要一句“为什么加”的理由。比如“Excel导入是为了方便管理员批量处理学生名单信息”在论文中单独开一小节说明功能和实现就显得有主见、有思考量。最后分享一点个人体会我带过不少做这类项目的同学最想提醒你的一件事是不要贪多求全。当核心链路已经跑通数据库表合理权限和冲突检测逻辑能讲清楚这套项目的完成度已经超过很多同龄人了。分数拔高不是靠多堆两个模块而是靠把已有功能讲透。论文里不要写你自己都说不清楚的功能答辩时每一个展示都必须是你亲手验证过、能顶住追问的。还有个小技巧拿到一套源码先别急着改功能先把账号密码、数据库连接、启动顺序跑通然后用我的那张功能自测清单从头到尾走一遍。磨刀不误砍柴工这套流程走完你对项目的理解深度已经足够应付90%的答辩问题。等你把选课、成绩、课表这几条链路都摸透了再回头加功能或者改前端样式才有真正可控的底气。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门