简介面向高校计算机专业毕业设计及智慧校园建设需求这份资料包以SSM框架为核心整合MySQL数据库实现了学生智能选课、课程信息管理、教师数据同步、后台维护等完整功能。压缩包大小约52MB标题标明内含可运行源码、数据库脚本和毕业论文文档方便开发者直接导入开发环境验证、还原数据库环境并参考论文结构。平台未提供具体文件总数与类型明细因此不编造相关数据目前已有52人学习下载。系统设计强调操作简便与信息直观学生可随时随地登录选课快速检索喜欢的课程、教师及上课时间段数字化降低了教务沟通成本也契合了未来教育信息化趋势。对毕业设计或课程设计而言这套资料提供了从工程搭建到数据库设计再到论文撰写的完整闭环既适合学习SSM与MySQL整合的经典流程也适合在此基础上扩展选课推荐、成绩管理等模块用于个人项目二次开发。1. 学生智能选课系统资源包是什么源码、数据库脚本、论文三件套的一次性交付mysql-学生智能选课系统源码数据库论文.rar是Java课程设计和毕业设计里出现频率最高的一类资源包一个基于MySQL的选课系统打包了完整源码、数据库脚本和一篇能撑起答辩的论文。我见过不少人拿到这套资源后卡在同一处源码用IDE就能跑起来但数据库脚本导入报错论文里的E-R图和导入后的表结构对不上。真正的黑匣子往往不是代码而是数据库和论文之间的对应关系。这套方案适合两类人赶课设/毕设、需要快速跑通并讲清楚系统的学生想用完整项目把Java Web和MySQL增删改查串起来的开发者。另外先把话说破智能在课设语境里指的不是AI而是时间冲突检测、学分上限校验、选课人数控制这些规则约束。把这些约束在数据库层做扎实才是这套系统的核心价值。2. 先把系统跑起来RAR解包、导入SQL脚本、改对JDBC连接拿到这类资源包最忌一上来就打开IDE点运行。运行报错时你分不清是环境问题、数据库问题还是代码问题。我通常会按拆包看结构→导库→改连接→启动四步走每一步都能单独验证出了问题能定位到层。2.1 解包后识别项目形态纯JSP、SSM还是Spring BootRAR解压后第一件事不是看代码而是确认技术栈。课设类资源包最常见的三种形态纯JSPServletJDBC、SSMSpringSpringMVCMyBatis、Spring Boot单体。识别方式很简单看目录下的关键文件就知道。项目形态关键文件启动方式SQL脚本常见位置纯JSPServletweb.xml、lib目录下有一堆jar打war包扔Tomcat或用IDEA配置Tomcat Artifact根目录或docs目录下的.sqlSSMpom.xml、applicationContext.xmlMaven编译后部署Tomcat需配数据源sql/或db/目录下的.sqlSpring Bootpom.xml、application.yml或application.properties直接运行main方法src/main/resources/db/或根目录纯JSP的项目IDE里装个Tomcat插件把项目根目录指定成Web资源目录配置一个Artifact就能启动。SSM项目要提前确认Maven仓库能联网否则首次加载依赖能把人急死。Spring Boot相对省心但要注意如果附件里没有maven仓库缓存首次编译下载依赖的时间同样不短。解压时有个人人都会踩的细节Windows下右键解压没问题macOS里用系统自带解压工具对中文文件名偶尔会乱码用The Unarchiver或Keka更稳。解压后检查目录不要嵌套两层——很多资源包解出来是一个外层文件夹包着真正工程路径里带中文和空格会加大后面配置的麻烦我一般把工程复制到纯英文路径下再打开。2.2 MySQL命令行导入数据库重建整库的完整步骤Windows下得确认MySQL装了没有、版本是多少。命令行输入mysql --version提示不是内部命令的话说明MySQL的bin目录没配进PATH两个选择去MySQL安装目录的bin下执行或者搜一下mysql安装教程把PATH配上。我建议顺手配上后面每天都要用。确认服务启动后再导库。先建库再导入sql文件mysql -u root -p -e CREATE DATABASE IF NOT EXISTS course_system DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql -u root -p course_system /path/to/student_course.sql第一条命令创建数据库字符集用utf8mb4而不用utf8因为utf8在MySQL里是utf8mb3的别名存不了emoji和部分生僻字课设里虽用不到emoji但统一utf8mb4能省掉后续一堆乱码问题。第二条命令把sql脚本导入到course_system这个库是输入重定向让mysql客户端逐条执行脚本里的语句。两条命令都不写密码让客户端交互式提示输入避免密码明文留在shell历史里。导入后验证一下USE course_system; SHOW TABLES; SELECT COUNT(*) FROM student;正常的话能看到student、course、course_selection、teacher、score这些表student表里还有几条测试数据。如果一张表都没有打开sql脚本看头部有些课设脚本自带CREATE DATABASE和USE语句和命令行里指定的库冲突那就不用建库直接mysql -u root -p student_course.sql让脚本自己决定往哪个库里写。2.3 改JDBC连接参数url、数据库名、密码三处必改源码能编译但连不上库九成是连接参数还写着作者的localhost和root口令。配置文件的名字通常是db.properties、jdbc.properties、application.yml或applicationContext.xmlSSM项目在applicationContext.xml里配数据源Spring Boot项目在application.yml里带spring.datasource前缀纯JSP项目多半有个jdbc.properties或DBUtil.java类。最典型的一套参数长这样jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_system?useSSLfalseserverTimezoneAsia/ShanghaicharacterEncodingutf8allowPublicKeyRetrievaltrue jdbc.usernameroot jdbc.password123456每个参数都有历史原因useSSLfalse是因为本地开发没有SSL证书可握手不关掉会警告甚至报错serverTimezoneAsia/Shanghai是MySQL 8.0驱动的硬性要求不写时报Server returns invalid timezonecharacterEncodingutf8对应中文乱码问题allowPublicKeyRetrievaltrue配合MySQL 8.0默认的caching_sha2_password认证插件使用不设置会报Public Key Retrieval is not allowed。password那一栏改成你本机root的实际口令。如果你的MySQL root是空密码这里也别填。另外注意驱动类名MySQL 8.0以上必须用com.mysql.cj.jdbc.Driver5.x时代是com.mysql.jdbc.Driver版本不匹配时现象非常诡异驱动类能加载但连接握手阶段直接崩。资源包里如果配了连接池DBCP、C3P0或DruidmaxPoolSize这些参数课设阶段不用动默认值对几百条数据绰绰有余。会改的人把连接池初始连接数改成5、最大10纯粹是给自己答辩找话说功能上没有本质差别。2.4 MySQL 8.0与5.7的认证插件差异连不上时的快速止血如果你的MySQL是8.0但资源包当年是在5.7上开发的程序连接时很可能报Access denied for user rootlocalhost (using password: YES)密码明明是对的。原因在于MySQL 8.0把默认认证插件从mysql_native_password换成了caching_sha2_password老驱动不认新插件。快速止血有两种办法任选其一。第一种是改数据库侧认证插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;ALTER USER把root账号的认证插件切回5.x时代的mysql_native_passwordFLUSH PRIVILEGES让改动立即生效。注意这里改的是root的登录认证方式不影响已有数据但密码会被重置成你在BY后面写的那个值。第二种是只改JDBC连接串不动数据库配置在url上补allowPublicKeyRetrievaltrueuseSSLfalse两个参数。能改源码就优先改url不用动数据库账号安全性也更好不能改源码比如连接配置写死在jar包里的老课设才回头改数据库插件。这个操作的前提是root能登录进去如果root自己也登不上那是另一条排查链路放到避坑章里细说。3. 选课系统的核心是业务约束三张表设计、冲突检测SQL与选课存储过程选课系统和普通增删改查页面的分水岭不在CRUD而在约束。一个不检查时间冲突、不限制学分上限的系统只要三张表和两个页面就能跑完。课设里智能这两个字的全部含金量都集中在业务约束的数据库实现上。3.1 学生表、课程表、选课表外键、联合主键与字段边界拆开任何一份选课系统的SQL脚本核心永远是student、course、course_selection三张表teacher和score是支撑。我按课设最常见的口径重建一遍CREATE TABLE student ( student_id INT NOT NULL AUTO_INCREMENT COMMENT 学号, student_name VARCHAR(50) NOT NULL COMMENT 姓名, major VARCHAR(50) DEFAULT NULL COMMENT 专业, grade_year INT DEFAULT 2024 COMMENT 入学年份, PRIMARY KEY (student_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表; CREATE TABLE course ( course_id INT NOT NULL AUTO_INCREMENT COMMENT 课程编号, course_name VARCHAR(80) NOT NULL COMMENT 课程名称, credit DECIMAL(3,1) DEFAULT 2.0 COMMENT 学分允许1.5这种值, course_time VARCHAR(30) DEFAULT NULL COMMENT 上课时间如周三5-6节, capacity INT DEFAULT 60 COMMENT 选课人数上限, teacher_id INT DEFAULT NULL COMMENT 任课教师编号, PRIMARY KEY (course_id), KEY idx_teacher (teacher_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT课程表; CREATE TABLE course_selection ( student_id INT NOT NULL COMMENT 学号, course_id INT NOT NULL COMMENT 课程编号, select_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 选课时间, status TINYINT DEFAULT 1 COMMENT 1选课有效0已退课, PRIMARY KEY (student_id, course_id), KEY idx_course (course_id), CONSTRAINT fk_sel_student FOREIGN KEY (student_id) REFERENCES student(student_id), CONSTRAINT fk_sel_course FOREIGN KEY (course_id) REFERENCES course(course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT选课表;学分字段用DECIMAL(3,1)因为有不少课程是1.5学分用INT会丢精度capacity默认60课设里这个值也可以写成smallint但容量一般不超过几百INT不浪费。选课表没有独立的id主键而是把(student_id, course_id)组合成联合主键这是整个表结构设计里最关键的一步。它保证了同一学生同一课程在物理上只能有一条记录就算应用层忘了判断数据库也会拒绝重复插入。很多翻车的资源包就是这里改成了单列的AUTO_INCREMENT主键导致同一个学生能选同一门课三次。status字段专门为退课保留。退课不删除行而是把status置为0这样选课历史可追溯成绩统计时过滤status1就行。外键约束开了以后删除学生或课程会被选课表挡住课设里两种常见处理先删选课记录再删主记录或者全部改逻辑删除。不管你选哪种论文的数据设计章节必须和代码保持同一种处理方式这一点避坑章会专门展开。3.2 智能选课的规则引擎时间冲突、学分上限、人数上限用SQL怎么查课设选课系统的三条硬规则全部可以用SQL直接算出来。规则之一是时间冲突——同一学生同一时间段只能选一门课这也是智能两个字最常说通的点SELECT COUNT(*) FROM course_selection cs JOIN course c ON cs.course_id c.course_id WHERE cs.student_id 20230001 AND cs.status 1 AND c.course_time 周三5-6节;先JOIN把选课记录和课程信息拼起来再用course_time过滤返回0表示这个时间段是空的可以选返回大于0说明该时段已有一门课。cs.status 1这条过滤必须加否则退过的课会一直占着时间名额。规则之二是学分上限比如一学期不超过25学分SELECT COALESCE(SUM(c.credit), 0) AS total_credit FROM course_selection cs JOIN course c ON cs.course_id c.course_id WHERE cs.student_id 20230001 AND cs.status 1;SUM聚合出已选课程的总学分COALESCE保证新学生没有任何选课记录时返回0而不是NULL省去Java侧判空。判断逻辑是total_credit 新课程学分 25超过就拒绝。规则之三是人数上限SELECT COUNT(*) FROM course_selection WHERE course_id 101 AND status 1;注意COUNT的是选课记录不是course表的capacity字段。容量存在course.capacity里判断条件是已选人数 capacity才允许插入。这三个查询落在Java Service层就是三次查询加三个if判断。逻辑不复杂真正的问题在于这三个操作不是原子的——两个请求同时判断人数没满同时INSERT就会超卖。解决这个问题就要把判断和插入放进同一个数据库事务里。3.3 把选课流程封装成存储过程事务、状态码与回滚逻辑课程设计阶段把校验逻辑写在Java里不是不行但答辩时不好讲因为流程散落在好几个方法里。更常见也更稳妥的做法是把整个选课流程沉到MySQL存储过程中应用层只调一次CALL。校验逻辑在数据库层可见论文里的流程图也画得清楚。DELIMITER // CREATE PROCEDURE sp_enroll_course( IN p_student_id INT, IN p_course_id INT, OUT p_code INT, OUT p_msg VARCHAR(100) ) sp_proc: BEGIN DECLARE v_time VARCHAR(30); DECLARE v_credit DECIMAL(3,1); DECLARE v_capacity INT; DECLARE v_selected INT DEFAULT 0; DECLARE v_total_credit DECIMAL(4,1) DEFAULT 0; DECLARE v_conflict INT DEFAULT 0; -- 课程是否存在取出冲突判断需要的字段 SELECT course_time, credit, capacity INTO v_time, v_credit, v_capacity FROM course WHERE course_id p_course_id; IF v_time IS NULL THEN SET p_code 404; SET p_msg 课程不存在; LEAVE sp_proc; END IF;DECLARE声明了五个局部变量分别存放课程时间、学分、容量、已选数量、学分合计。SELECT ... INTO把课程三个关键字段取出来v_time是NULL说明课程ID越界直接返回404状态码。这里LEAVE sp_proc相当于存储过程里的return跳过后面的全部逻辑。-- 防止重复选课 SELECT COUNT(*) INTO v_selected FROM course_selection WHERE student_id p_student_id AND course_id p_course_id AND status 1; IF v_selected 0 THEN SET p_code 409; SET p_msg 已选过该课程; LEAVE sp_proc; END IF; -- 时间冲突检测 SELECT COUNT(*) INTO v_conflict FROM course_selection cs JOIN course c ON cs.course_id c.course_id WHERE cs.student_id p_student_id AND cs.status 1 AND c.course_time v_time; IF v_conflict 0 THEN SET p_code 410; SET p_msg 时间冲突; LEAVE sp_proc; END IF; -- 学分上限按一学期25学分控制 SELECT COALESCE(SUM(c2.credit), 0) INTO v_total_credit FROM course_selection cs2 JOIN course c2 ON cs2.course_id c2.course_id WHERE cs2.student_id p_student_id AND cs2.status 1; IF v_total_credit v_credit 25 THEN SET p_code 411; SET p_msg 超出学分上限; LEAVE sp_proc; END IF; -- 选课人数上限 SELECT COUNT(*) INTO v_selected FROM course_selection WHERE course_id p_course_id AND status 1; IF v_selected v_capacity THEN SET p_code 412; SET p_msg 选课人数已满; LEAVE sp_proc; END IF; -- 所有校验通过写入选课记录 INSERT INTO course_selection(student_id, course_id) VALUES (p_student_id, p_course_id); SET p_code 200; SET p_msg 选课成功; END // DELIMITER ;存储过程的四个校验顺序是有讲究的先查课程存在性再查是否重复然后查时间冲突和学分上限最后才看人数。前面的校验成本低且能快速返回明确错误把最可能复杂的人数判断放在后面。四个校验对应应用层的调用只需要一条命令CALL sp_enroll_course(20230001, 101, code, msg); SELECT code, msg;code和msg是用户变量接收OUT参数返回的业务状态码200成功、404课程不存在、409重复选课、410时间冲突、411超学分、412人数已满。Java里拿到code值直接映射成ResultBean的status前端根据状态码弹toast整个链路干净利落。事务方面这个存储过程里的INSERT本身是单条语句天然具备原子性不存在半成功状态。如果你的项目里选课还要同时扣减课程余量——把capacity做成一个真实字段去UPDATE——那就必须显式开事务START TRANSACTION; UPDATE course SET capacity capacity - 1 WHERE course_id 101; INSERT INTO course_selection(student_id, course_id) VALUES (20230001, 101); COMMIT;任何一步失败都要ROLLBACK否则会出现课选上了但容量没扣或容量扣了但课没选上的不一致数据。课设里选用哪种方案都可以但论文的数据一致性分析里要把你选的那套讲完整。3.4 成绩表与选课状态的流转增删改查之外的两次UPDATE选课之后是成绩流转。课设里的成绩录入和退课分别对应两条标准UPDATEUPDATE score SET score_value 88.5 WHERE student_id 20230001 AND course_id 101; UPDATE course_selection SET status 0, select_time NOW() WHERE student_id 20230001 AND course_id 101;第一条是成绩录入UPDATE配合WHERE精确定位到人课关联记录第二条是退课status置0而不是DELETE原因在3.1讲过——保留操作痕迹。成绩表单独建一张结构和防重复约束同样重要CREATE TABLE score ( score_id INT AUTO_INCREMENT PRIMARY KEY, student_id INT NOT NULL, course_id INT NOT NULL, score_value DECIMAL(5,2) DEFAULT NULL COMMENT 成绩支持59.50这种值, exam_time VARCHAR(20) DEFAULT 期末, UNIQUE KEY uk_stu_course (student_id, course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;UNIQUE KEY (student_id, course_id)和选课表的联合主键作用一致防止同一学生同一课程出现两条成绩记录。score_value用DECIMAL(5,2)能存100.00也兼容59.50INT会把小数部分静默截断。到这里数据库层的建表、约束、存储过程、状态流转全部齐了源码里的DAO、Service、Controller只是在这个骨架上传数据而已。4. 跑课设源码的避坑记录乱码、连不上库、重复选课与论文对不上这一章是资源包落地时最常翻车的四个现场。每一个我都亲眼见过不止一次现象、原因、解决按顺序写清楚你照着排查大部分问题十分钟内能定位。4.1 导入的中文变成问号字符集三处不一致的连锁反应现象SQL脚本导入后执行SELECT * FROM course课程名称全是一串???或者数据库客户端里看数据正常网页上却是乱码。原因三处字符集没对齐——SQL脚本文件本身的编码、导入时MySQL连接的字符集、表和字段的charset定义。最常见的是脚本用记事本默认的ANSI编码保存而导入连接用utf8mb4解析另一种是脚本本身是UTF-8但老脚本的建表语句里根本没写DEFAULT CHARSETutf8mb4MySQL就用服务器默认的latin1建表中文插进去必然乱。解决导入前统一指定连接字符集。mysql -u root -p --default-character-setutf8mb4 course_system student_course.sql如果表已经建好且数据乱了先把乱了的表DROP掉重新导不要想着UPDATE救回来字符集错乱的数据是不可逆的。页面乱码则检查两处JSP或HTML里的contentTypetext/html; charsetutf-8以及JDBC url里的characterEncodingutf8三处全对齐再重启Tomcat。这里面最骗人的是数据库客户端看数据正常、网页乱码这属于连接层字符集问题十有八九是JDBC url里的characterEncoding丢了。4.2 ERROR 2002与Access denied服务、端口与认证插件三个排查方向现象Tomcat日志里抛SQLException控制台报ERROR 2002 (HY000): Cant connect to local MySQL server through socket /tmp/mysql.sock或者报Access denied for user rootlocalhost (using password: YES)。原因2002是服务层问题——MySQL服务没启动、socket路径不对、客户端连错了地址Access denied是认证层问题——密码错、账号错、认证插件不匹配甚至本地root是空密码但配置文件里填了123456。解决按顺序排除。第一步确认服务在跑# Linux/macOS service mysql status # Windows net start | findstr -i mysql没在跑就先启动。第二步确认端口在监听netstat -an | grep 3306 # Linux/macOS netstat -ano | findstr 3306 # Windows3306没有监听记录大概率服务没起来或my.cnf里改了端口号。第三步手连测试mysql -u root -p空密码直接回车也试一次。手连能进、程序进不去才是认证插件问题用3.1里那条ALTER USER切回mysql_native_password。这里有个血泪经验改完插件后记得把JDBC配置里的密码同步成新密码。程序里配的还是旧密码时报错和插件不匹配长得一模一样会白白多排查半小时。4.3 同一门课选两次缺失联合主键导致的重复数据现象学生能对同一门课重复选课页面上课表出现两条相同课程统计选课人数时翻倍成绩表里也对应出现两条记录。原因建表时把course_selection的主键设计成了独立的id INT PRIMARY KEY AUTO_INCREMENT全表唯一约束只保证了id不重复没有约束(student_id, course_id)这个业务组合。应用层的判重逻辑只要有并发或逻辑漏洞重复数据就能插进去。解决给选课表补上联合主键先从物理上杜绝重复。ALTER TABLE course_selection DROP PRIMARY KEY, ADD PRIMARY KEY (student_id, course_id);如果表里已经存在重复数据直接加主键会报Duplicate entry。先清理再约束DELETE FROM course_selection WHERE (student_id, course_id, select_time) NOT IN ( SELECT student_id, course_id, MAX(select_time) FROM course_selection GROUP BY student_id, course_id );逻辑是保留每个学生每门课最后一条选课记录其余全部删除。清理完再加联合主键就不会报错了。这个坑解决之后3.3存储过程里的重复选课检查就从必选降级成兜底——数据库层面的主键保证重复插不进去存储过程里的判断只是提前返回一个更友好的提示。4.4 论文里的E-R图和实际表结构对不上从逻辑设计到物理设计的缝隙现象论文第三章画着student、teacher、course三张实体E-R图里course和student标成多对多数据库里实际跑了五张表外键方向也和图里不一致。或者论文写管理员删除课程时级联删除选课记录代码里却是逻辑删除status置0。原因论文是交付前赶工出来的和源码迭代不同步这是课设资源包的普遍现象。图是参照模板画的字段是后改的两边没做一致性检查。答辩老师随手翻一页就能发现这些缝隙。解决把三样东西同时摆开——论文的数据库设计章、SQL脚本、实体类代码逐项对四个地方一是表名和字段名实体类驼峰字段和数据库下划线字段是否对得上二是外键关系E-R图上的1:n和m:n标注用SHOW CREATE TABLE course_selection对照实际外键三是字段类型论文里写成FLOAT的学分和DECIMAL(3,1)是不是同一个四是约束实现论文说级联删除代码却是逻辑删除就把论文改成逻辑删除保留历史选课数据。花半小时对齐这四处比调一晚上页面样式更能防住答辩追问。5. 答辩前把系统从能跑升级到能讲冲突视图加一套手测用例5.1 做一个选课冲突查询视图把为什么选不了变成一行SQL存储过程把选课流程封住了但学生页面报时间冲突时页面只是弹个提示看不到完整原因。答辩时老师大概率会问这个冲突是怎么判出来的这时候有一个可视化视图会好讲得多CREATE VIEW v_student_timetable AS SELECT cs.student_id, s.student_name, c.course_name, c.course_time FROM course_selection cs JOIN student s ON cs.student_id s.student_id JOIN course c ON cs.course_id c.course_id WHERE cs.status 1 ORDER BY cs.student_id, c.course_time;学生页面的我的课表直接SELECT * FROM v_student_timetable WHERE student_id 20230001即可三表JOIN被固化在视图里应用层不用每次拼SQL。这个视图还有一个验证价值把课表导出来肉眼扫一遍course_time列就能快速确认时间冲突校验是否真的在工作。注意course_time如果是周三5-6节这种字符串写法ORDER BY排出来的不是时间序只是按字符串分组展示。数据库设计时为了省事可以把上课时间存成字符串但答辩时可以主动说一句课表展示用视图严格排课建议把course_time拆成week_day和start_section两列这是加分项。5.2 手测用例清单12个用例覆盖选课全链路用例操作预期结果1正确学号密码登录进入系统主页2错误密码登录提示密码错误3选一门无冲突课程选课成功状态码2004重复点击已选课程提示已选过该课程状态码4095选同一时段另一门课提示时间冲突状态码4106已选25学分再选2学分课提示超出学分上限状态码4117选一门已满员课程提示人数已满状态码4128提交一个不存在的课程ID提示课程不存在状态码4049对已选课程执行退课退课成功从课表消失10退课后重新选同一门课允许重选因为status0的记录不参与判重11任课教师录入成绩成绩保存成功且一人一课仅一条成绩12学生查询成绩只返回本人数据前10个用例直接对应存储过程返回码第9和第10条特殊退课是把status置0不是DELETE所以联合主键(student_id, course_id)里仍然留着旧记录但所有校验和课表展示都过滤了status1退掉的课不占时间、不占学分也能重新选。这套用例表可以打印出来当答辩材料也能作为自己验证功能的清单。我第一次跑通课设里的选课系统时把存储过程当成能跑就行的工具没想过这些状态码和联合主键背后的设计理由。后来被答辩老师问住选课表为什么不用独立主键才回去把表结构重新读了一遍。从那以后我养成了一个习惯拿到任何带数据库的源码包先把SQL脚本和论文的数据设计章同时摆在屏幕上一行一行对再动手改配置。这次帮你把冲突检测、联合主键、存储过程和手测用例串了一遍这几个点抓牢剩下的增删改查页面其实都是体力活。希望帮到你。本文还有配套的精品资源点击获取
