ARTICLE DETAIL

资讯详情

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

基于JavaEE的网上评教系统开发详解:JSP+MySQL从设计到部署

基于JavaEE的网上评教系统开发详解:JSP+MySQL从设计到部署 简介面向Java Web学习者的基于JavaEE的网上评教系统完整项目采用JSP动态网页与MySQL数据库设计实现学生在线评教、教师管理、课程管理及评价结果统计等核心功能适合作为毕业设计、课程设计或SSM/MVC框架入门参考。压缩包内共651个文件包含101个JSP页面、35个CSS样式、21个JS脚本、6个数据库文件和SQL脚本并配有大量的GIF/JPG/PNG图片展示界面效果整体大小11.71MB。项目中体现Servlet处理请求、JSP页面渲染、JDBC操作MySQL的完整流程附带数据库表结构设计用户表、课程表、教师表、评教表及关系说明可帮助读者理解JavaEE三层架构与MVC分层思想。已有110人学习下载内容覆盖需求分析、设计、编码、测试、部署等环节适合需要完整源码与数据库脚本进行二次开发或学习实战的开发者。1. 网上评教系统不是功能堆叠先想清楚谁能评、评什么、结果给谁期末评教这个场景几乎每个搞过 JavaEE 的人都被问过一遍教务处要组织学生对任课教师打分线下问卷回收慢、统计更慢于是想做一个网上评教系统把录入、打分、汇总、查询搬到浏览器里。这类业务边界非常清楚学生登录后给指定教师按指标打分教师查看自己的平均分和评语管理员管批次和汇总技术上完全用得上 JavaEE 那一套 Servlet JSP MySQL 的经典组合。标题里这个“基于JavaEE的网上评教系统_JSP网站设计_MySQL数据库设计.rar”就是最常见的那种课程设计产物本质上跟“基于JSP的毕业论文管理过程系统”是同一个路数。它适合三种人要交课设的学生、想把院系评教数字化的老师、以及第一次写 JavaWeb 完整案例的初学者。下面这套方案把结构、建表 SQL、Servlet 与 JSP 实现、部署顺序和坑一次讲透。2. 模块与页面规划把评教流程拆成学生、教师、管理员三条线评教系统最容易翻车的地方不是代码写不出来而是把“给老师打分”当成一个页面来做。实际上一次完整的网上评教要经历四个状态批次未开始、进行中、已结束以及学生侧随时都要用的“待评/已评”切换。如果动手前不把三类角色和状态机画清楚后期写 DAO 和 JSP 时必然要反复改表结构那才是真正的黑匣子。2.1 角色权限模型与评教状态机先定角色。常见做法是把用户统一放进一张 user 表用 role 字段区分 student、teacher、admin而不是建三张平行的用户表。原因是评教系统登录入口只有一个三类账号要共用同一个登录流程分开建表会让登录校验变成三份重复代码。课设阶段的项目能用一张表搞定的事绝不用三张表这既是省事答辩时数据库设计也能加分。权限边界上学生只能看到自己选修课程对应的授课教师教师只能看到自己被评的结果管理员能看全部。这个边界不是靠 JSP 页面里 if 判断“你是什么角色显示什么按钮”来实现的而是每一层查询都带上角色条件。比如学生查“待评列表”的 SQL 必须带 student_id 当前登录人 ID而不是查出全部教师再在页面上过滤。我见过不少系统在页面上用 role 隐藏按钮结果被人改一下 URL 参数就能访问管理功能这属于安全设计问题不是功能问题。状态机也建议在数据库里落下来批次表加一个 status 字段0 未开始、1 进行中、2 已结束。学生端查询待评数据时SQL 同时过滤 batch.status 1。这样系统天然防止“还没开始就能评”“结束后还在评”两类逻辑漏洞。事务处理和状态判断都放在 SQL 里做比在 Servlet 里写一堆 if 判断可靠因为数据库过滤是最后一道硬边界。这里还要补一个设计判断评教指标不能写死在 JSP 的静态 HTML 里。指标内容每个学期都可能调整比如“教学态度”“课堂互动”“作业批改及时性”它们应该存进 indicator 表由管理员在后台维护。JSP 页面从数据库读指标列表用循环渲染表单。这个设计决定了后面第 3 章表结构和第 4 章表单代码的形态现在想清楚后面少改一轮。2.2 页面流设计从登录到评教提交的全链路页面不需要多但要全。常见的最小集是七个比堆二十个页面要实用得多页面路径用途登录页login.jsp三类角色统一入口学生主页student_index.jsp展示批次与待评课程列表评教页evaluate.jsp加载指标表单并打分提交回执页result.jsp提示提交结果教师主页teacher_index.jsp查看被评均分与文字评价管理后台admin_index.jsp批次管理、数据统计入口批次与统计管理页admin_batch.jsp / admin_stat.jsp开批次、导出与汇总访问链路是这样设计的学生访问登录页 → 输入账号密码 → LoginServlet 校验通过后把 user 对象放进 session → 跳转学生主页JSP 从 session 取出当前用户去数据库查待评列表含每门课对应的任课教师和状态→ 点击某门课“开始评教”进入 evaluate.jspURL 带上 course_teacher_id 和 batch_id → 提交打分表单到 EvaluationServlet → Servlet 做重复提交校验后写库重定向回学生主页。这里故意用重定向而不是转发是为了避免学生按 F5 刷新时表单被重复提交。这套链路里有个隐蔽的设计点评教表单的 action 不要直接传 student_id 和 teacher_id而是传课程与教师的关联 ID服务端再从 session 里取学生身份。否则懂点 HTML 的人都能把表单里的 student_id 改成别人造成“替评”。这也呼应了 2.1 说的信任边界问题。课设答辩时把这个理由讲清楚比堆一堆页面截图更有说服力。2.3 评教指标与打分配置先定维度再定页面指标的粒度直接决定后续统计工作量。我一般建议每个批次配 5 到 8 个指标每项满分 5 分总分用百分制折算。课程设计阶段不要做二级指标和加权因子那个复杂度对评分功能本身没有增量价值。indicator 表设计成批次内独立的指标集每个指标有 content 和 max_score 字段页面渲染时用c:forEach循环输出下拉框后续想调整任意一个指标分数只需要改数据库不用改 JSP。还要考虑的是学生端“无评价权限”的展示。当批次状态为“未开始”或“已结束”时列表页不应显示评教按钮而应显示灰色文字说明状态当该学生对某门课已经评过按钮要变成“已评教”。这两个判断都要在查询 SQL 里完成而不是页面加载后用 JavaScript 去隐藏按钮。SQL 查出结果集里多给一个 is_evaluated 字段JSP 依据它决定按钮状态逻辑集中且不容易漏判。3. MySQL 数据库设计先定表结构再写业务代码我习惯先把 MySQL 表完全建好再回头写 Java 代码。原因很实际JSP 页面要显示哪些值取决于查询能查出什么查询能查出什么取决于表结构冗余得够不够。评教系统规模不大但早期省下的表设计时间后面会全部变成改 Java 代码的时间。3.1 核心表结构与设计依据最小可用跑通的核心表是六张user用户、teacher教师扩展信息、course课程、batch评教批次、indicator评价指标、record评教记录再加一张 course_teacher课程与教师关联表。很多课设会漏掉 course_teacher直接把 teacher_id 写在 course 表里看起来省了一张关联表但“一门课由多个教师合上”的情况一旦在学期中出现改表结构和改已有数据的成本远大于现在多建一张关联表。record 表是整个系统的核心设计上要回答三个问题谁评的、评的哪个教师、打了多少分。常见列是 id、student_id、batch_id、course_teacher_id、total_score、comment_text、create_time。要特别注意的是 total_score 不要拆成 score1、score2 这种十几个字段——教学指标一变你就得改表。正确做法是把单项分放进 record_item 子表record 只保存总分和评语单项分按 record_id 去子表查询。课设阶段用两张表换以后的灵活性划算。另外一个设计依据是索引record 表业务上永远只有两种访问路径按学生查是否已评、按教师统计均分。所以联合唯一索引student_id, batch_id, course_teacher_id一定要建它同时起两个作用查重时用索引快速命中写入时重复数据被数据库直接拒绝这是防重复评教的第一道闸门。3.2 建表 SQL 脚本与关键字段参数说明以下是我常用的 MySQL 建表脚本节选MySQL 5.7 和 8.0 都能直接跑存储引擎统一 InnoDBCREATE DATABASE IF NOT EXISTS evaluation_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE evaluation_db; -- 用户表学生、教师、管理员统一存放 CREATE TABLE user ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, username VARCHAR(20) NOT NULL UNIQUE, password VARCHAR(64) NOT NULL, role TINYINT NOT NULL DEFAULT 0 COMMENT 0学生,1教师,2管理员, real_name VARCHAR(20) NOT NULL, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINEInnoDB; -- 课程表 CREATE TABLE course ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, course_name VARCHAR(50) NOT NULL, credit DECIMAL(3,1) NOT NULL DEFAULT 2.0 ) ENGINEInnoDB; -- 评教批次表支撑一个学期一次评教 CREATE TABLE batch ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, batch_name VARCHAR(50) NOT NULL, status TINYINT NOT NULL DEFAULT 0 COMMENT 0未开始,1进行中,2已结束, start_time DATETIME NULL, end_time DATETIME NULL ) ENGINEInnoDB;几个字段参数是经验值而不是随手写的。password 用 VARCHAR(64)为将来升级为 SHA-256 哈希做准备用 TINYINT 存角色和状态是因为可选值就两三个INT(11) 白白占 4 字节。DECIMAL(3,1) 存学分而不是 FLOAT因为 FLOAT 是近似值统计汇总时看到 2.999999 就晚了。username 加 UNIQUE 索引配合代码里捕获 DuplicateKeyException就能做成“同名学生不能重复注册”。接下来是最关键的 record 与 record_item 表。评教记录表-- 课程与教师关联表 CREATE TABLE course_teacher ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, course_id INT UNSIGNED NOT NULL, teacher_id INT UNSIGNED NOT NULL, UNIQUE KEY uk_course_teacher (course_id, teacher_id) ) ENGINEInnoDB; -- 评教记录表 CREATE TABLE record ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, student_id INT UNSIGNED NOT NULL, batch_id INT UNSIGNED NOT NULL, course_teacher_id INT UNSIGNED NOT NULL, total_score DECIMAL(5,1) NOT NULL DEFAULT 0.0, comment_text VARCHAR(500) NULL, create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_stu_batch_ct (student_id, batch_id, course_teacher_id) ) ENGINEInnoDB; -- 评教指标表 CREATE TABLE indicator ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, batch_id INT UNSIGNED NOT NULL, content VARCHAR(100) NOT NULL, max_score INT NOT NULL DEFAULT 5 ) ENGINEInnoDB; -- 指标打分明细表 CREATE TABLE record_item ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, record_id INT UNSIGNED NOT NULL, indicator_id INT UNSIGNED NOT NULL, score DECIMAL(4,1) NOT NULL DEFAULT 0.0 ) ENGINEInnoDB;这段 SQL 里最关键的就是 record 表上的联合唯一索引它让“同一个人在同一批次对同一门课只能有一条评教记录”变成数据库级约束。应用层就算漏写判断这里也会直接报 Duplicate entry 异常等于留了一道后悔药。record_item 不建唯一索引是因为同一指标在一次评教里只会有一个分靠 record_id 外键约束即可。3.3 常用查询防止重复评教与排行统计学生提交时先做一次轻量查询校验是成本低又友好的做法-- 校验是否已评教 SELECT COUNT(*) FROM record WHERE student_id ? AND batch_id ? AND course_teacher_id ?;这条查询走联合唯一索引的左前缀student_id 和 batch_id 一命中执行计划就是索引覆盖扫描。在 MySQL 命令行执行 EXPLAIN看到 type 为 ref 或 index 而不是 all 即可这也是课设能讲的性能优化点。统计教师得分时用 MySQL 的排序与聚合SELECT ct.teacher_id, AVG(r.total_score) AS avg_score, COUNT(r.id) AS evaluate_count FROM record r JOIN course_teacher ct ON r.course_teacher_id ct.id WHERE r.batch_id ? GROUP BY ct.teacher_id ORDER BY avg_score DESC;ORDER BY avg_score DESC 就是最常用的“mysql 排序”写法。注意 GROUP BY 用教师 ID 而不是姓名姓名可能重复最后在 JSP 里再用 teacher_id 关联查询真实姓名。统计逻辑放 SQL 而不是 Java 循环里累计是因为数据库聚合走内存临时表和索引比 JDBC 拉全量数据再算快一个数量级。评教数据量小看不出差别但这是职业习惯。这里还要回应标题里的“MySQL 数据库设计”到底设计什么相比存储过程我更推荐把业务规则放在应用层存储过程只做简单查询和事务。MySQL 存储过程在 5.7 里调试困难、版本迁移容易出问题课设项目用它只会增加答辩风险。建表脚本、初始化数据、常用统计 SQL 三个文件放在项目根目录就已经是合格的数据库交付物。4. JavaEE JSP 落地Servlet 控制层与页面数据绑定数据库定完JavaEE 端就顺着表结构写代码。很多初学者把 JSP 当成 HTML 用把 Java 代码直接写进%%这在 JavaEE 课程里能跑但页面结构一调整就要动 Java 代码维护成本极高。我一般按经典 MVC 分层JSP 只负责展示Servlet 负责控制和转发DAO 负责 JDBC 数据访问。这样给 JSP 做样式调整时完全不用碰 Java。4.1 Web 项目分层与目录布局一个能导入 Tomcat 直接跑的 JavaEE Web 项目目录结构常见如下src/main/java com.example.servlet com.example.dao com.example.entity com.example.util src/main/webapp WEB-INF/web.xml login.jsp student_index.jsp evaluate.jsp result.jsp分层道理很简单entity 是表映射的 JavaBeanDAO 只做增删改查并返回 ListServlet 调用 DAO 再把数据放入 request 或 sessionJSP 用 JSTL 标签把数据渲染成 HTML。JDBC 连接串、驱动类名这类配置集中在 util 包里的 JdbcUtil 静态类是所有 JavaEE 项目的通用做法。用 Eclipse 也好用 VSCode 配好 JavaEE 语言环境也好只要项目按这个目录结构组织都不会出大问题。需要注意的是 JDBC URL 不是随便写的常见格式是jdbc:mysql://localhost:3306/evaluation_db?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneAsia/ShanghaiuseUnicode 和 characterEncoding 决定中文能否正确写入 MySQLuseSSLfalse 省去本地环境 SSL 握手失败serverTimezone 解决 MySQL 8 驱动要求指定时区的问题。三个参数缺一个后面都会以“中文乱码”或“连接超时”的形式坑你一次。4.2 Servlet 处理评教提交与事务控制评教提交涉及 record 和 record_item 两张表的插入必须放在同一事务里否则会出现“总分记录落库、指标明细丢失”这类不一致。常见做法是用 Connection 手动开启事务而不是依赖 JDBC 自动提交WebServlet(/submitEvaluation) public class EvaluationSubmitServlet extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding(UTF-8); HttpSession session req.getSession(); User student (User) session.getAttribute(loginUser); if (student null) { resp.sendRedirect(login.jsp); return; } int courseTeacherId Integer.parseInt(req.getParameter(courseTeacherId)); int batchId Integer.parseInt(req.getParameter(batchId)); String comment req.getParameter(commentText); String[] indicatorIds req.getParameterValues(indicatorIds); String[] scores req.getParameterValues(scores); Connection conn null; try { conn JdbcUtil.getConnection(); conn.setAutoCommit(false); double totalScore computeTotalScore(scores); long recordId saveRecord(conn, student.getId(), batchId, courseTeacherId, totalScore, comment); saveItems(conn, recordId, indicatorIds, scores); conn.commit(); resp.sendRedirect(result.jsp); } catch (Exception e) { if (conn ! null) { conn.rollback(); } throw new ServletException(评教提交失败, e); } finally { JdbcUtil.close(conn); } } }代码的逻辑是先关掉自动提交让 saveRecord 和 saveItems 共用同一个 Connection两者都成功才 commit任何一个抛异常就 rollback。事务控制在 Servlet 层而不是 DAO 层是因为每个 DAO 方法只完成单一写操作跨表完整性是上层调用者的责任。注意这个 Servlet 实现里 computeTotalScore 和 saveItems 要把单项分累加并循环插入代码不长但标志着事务边界清晰。另一个关键是 doPost 最开头要调用 setCharacterEncoding否则中文数据会在进入 Servlet 时就已经乱掉。4.3 JSP 页面输出与表单回显评教页的 JSP 是系统里最讲究的页面它要把后台传来的待评信息和指标列表渲染成动态表单表单控件的 name 要和服务端取值规则一致form actionsubmitEvaluation methodpost input typehidden namecourseTeacherId value${courseTeacher.id} input typehidden namebatchId value${batch.id} c:forEach varind items${indicatorList} varStatusvs div classindicator-row span${ind.content}/span select namescores c:forEach vari begin1 end${ind.maxScore} option value${i}${i}分/option /c:forEach /select input typehidden nameindicatorIds value${ind.id} /div /c:forEach textarea namecommentText/textarea button typesubmit提交评教/button /form这里最要紧的是三个 namescores、indicatorIds、commentText。一次评教可能给十几项指标打分所有下拉框都叫 scores 也没关系Servlet 用 getParameterValues(scores) 一次拿到整组值顺序与 indicatorIds 一一对应。这种数组式表单提交是 JSP 做动态打分的关键。页面顶部记得加上 pageEncoding 和 JSTL 标签库声明否则c:forEach在 JSP 里直接报错。JSP 个人信息展示页也是同一个套路教师主页要显示头像、姓名、职称、平均分头像区域可以用 CSS 的 background-position 做坐标定位不必在 JSP 里硬切图片。展示平均分时要保留一位小数用fmt:formatNumber标签而不是在 Servlet 里拼字符串。提交失败的回显同样不能漏把用户填过的 comment 放回 request 作用域JSP 用${param.commentText}填回旧值。虽然课设不强制回显但演示时一旦失败学生填的 100 字评语全部消失体验会很差。5. 避坑与排查从环境搭建到并发提交的 5 个血泪经验下面是这套系统最常见的翻车现场每一条都足以卡住半天按“现象→原因→解决”整理。环境搭建阶段的问题占了一半业务逻辑问题反而相对集中。5.1 中文乱码到底在哪一层丢的现象登录页输入中文用户名数据库里存成了“???”JSP 展示评语时也是一串乱码。原因乱码往往不是一层造成的而是 JSP 页面编码、request 编码、JDBC URL 编码三处没有统一成 UTF-8。最常见的是只给 JSP 页面加了 contentType却忘了在 Servlet 的 doPost 里调用request.setCharacterEncoding(UTF-8)。解决三处一起落地。JSP 顶部统一 pageEncodingUTF-8Servlet 在处理前 setCharacterEncodingJDBC URL 带上 useUnicodetruecharacterEncodingUTF-8。另外 MySQL 建库时用 utf8mb4 而不是 utf8因为 MySQL 的 utf8 不是真正的全量 Unicode。排查时按“输入到 Servlet → Servlet 到 MySQL → MySQL 回到 JSP”三段打断点看哪一段开始出现问号就修哪一段。5.2 同一学生重复评教事务边界与唯一约束现象快速双击“提交”按钮数据库出现两条相同学生、相同教师、相同批次的记录统计均分被算了两遍。原因先 SELECT 校验后 INSERT 的方式存在并发窗口。两个请求同时通过校验又同时插入如果数据库没有唯一约束兜底两条都会成功。解决三层措施一起上。第一层是 record 表上建立联合唯一索引student_id, batch_id, course_teacher_id第二层是事务开启后插入时捕获 Duplicate 异常并回滚第三层在前端把提交按钮在第一次点击后禁用防止正常用户手滑双击。注意第三层只是体验优化真正的底线是数据库索引这个优先级要在答辩时讲清楚。5.3 JSP 页面缓存导致的数据刷新失败现象学生提交评教后回到主页列表里那门课还显示“待评教”按 F5 也不变教师端查均分看到的也是旧数据。原因浏览器对 JSP 响应做了缓存返回的是本地旧页面另一个常见原因是浏览器后退按钮复用了缓存看起来像没提交成功。解决在 Servlet 里写resp.setHeader(Cache-Control, no-cache, no-store, must-revalidate)JSP 顶部也声明不缓存。更彻底的办法是表单提交后使用 response.sendRedirect 重定向让浏览器请求新地址而不是刷新旧的 POST 页面。遇到这类问题先按 CtrlShiftR 强刷一次确认不是缓存后再往下排查数据库里有没有新记录。5.4 MySQL 连接不上的环境问题现象Navicat 能正常连接 MySQLJava 程序却报 Communications link failure 或 Access denied有时直接报驱动类找不到。原因主要是三件套版本错位。MySQL 5.7 时代驱动类名是 com.mysql.jdbc.Driver8.0 之后改成 com.mysql.cj.jdbc.Driver且连接 5.7 还要指定 serverTimezone。如果照着旧教程写驱动类名驱动类会直接找不到。另一个坑是 MySQL 8 默认认证插件是 caching_sha2_password老版本连接驱动不认这个插件报 Access denied。解决连接串统一按 4.1 节那串来写驱动 jar 使用 mysql-connector-java 8.x若是自己装了 MySQL 8 而项目驱动是 5.x就换驱动。Windows 上安装 MySQL 5.7.44 或 8.0 时安装器会让选端口默认 3306 被残留服务占用时优先停掉旧服务而不是改成 3307 迁就因为后续所有 JDBC URL 和连接池配置都得跟着改。还有人用 Docker 起 MySQL容器里的 3306 没映射到宿主机Java 程序自然连不上docker ps 看端口映射即可。5.5 浏览器显示 500 错误但从日志看不到异常现象点击提交后页面直接报 500Eclipse 控制台和 Tomcat 日志里都没有异常堆栈让人无从下手。原因Tomcat 的日志默认输出到 logs 目录而不是 IDE 控制台如果异常被 JSP 的 try-catch 吞掉或 Servlet 包装后未 rethrow日志里确实干净。还有一种情况是 WEB-INF/lib 下缺 JDBC 驱动报 NoClassDefFoundError 但输出位置不在控制台。解决去 Tomcat 安装目录的 logs/localhost.当前日期.log 里找完整堆栈这是最有用的排查入口。同时在 Servlet 的 catch 块里先 e.printStackTrace() 再 rethrow保证堆栈一定输出到控制台。确认是驱动缺失就把 mysql-connector 的 jar 放进 WEB-INF/lib 并重新发布项目。这类问题不是玄学只是日志位置没找对按这个顺序排查通常十分钟内能定位。6. 部署验证与进阶用最小成本把系统交付给学生用把项目跑起来只是第一步真正要交给教务用还得走完一轮完整验收。我习惯用这个清单新学生注册 → 登录 → 进入进行中批次 → 给一门课提交评教 → 回主页确认状态已变 → 数据库查 record 与 record_item 记录数一致 → 教师登录看均分 → 管理员结束批次 → 学生端再查不到待评课程。走完这套流程系统基本可以放心用。部署把项目打成 WAR 包放进 Tomcat 的 webapps 目录即可注意 Tomcat 版本要和 JDK 匹配否则启动直接 UnsupportedClassVersionError。三个进阶方向里最值得投入的一是管理端导出 Excel 报表用 Apache POI 生成.xls把每个教师的均分、参评人数、文字评语导出这比页面看表格更贴近教务工作二是成绩汇总按课程维度看跨班合上课程里教师的表现才是评教结果的核心价值三是在评教页引入图表展示教师均分分布前端用 ECharts 或 Chart.js 接 JSON 接口JavaEE 端只需新增一个返回 JSON 的 Servlet。这三个方向分别作用于导出、统计和可视化按精力和时间选一个最贴近实际需求的做。最后说一个我自己的习惯每次改完表结构都会重新导出一份 SQL 脚本放在项目根目录并在脚本头部写明“此脚本会重建全部表慎用”。网上评教系统这种课设项目数据量不大重建成本低但要是没有这份脚本换一台电脑部署就等于从零开始回忆表结构。配合这份文档读代码一天内完整复现这套系统是可以做到的。希望帮到你。本文还有配套的精品资源点击获取
返回列表