简介面向正在完成数据库课程设计的高校学生这份学生选课信息管理系统以 Java MySQL 实现采用 C/S 架构覆盖学生、教师、管理员三类角色。学生端可完成个人信息维护、课程查询、选课退课、成绩查询与打印、奖惩信息查看教师端支持课程信息查看、选课名单查询与成绩录入管理员端则统一管理学生、教师、课程、选课、成绩、院系及奖惩信息业务模块完整适合作为课设项目参考或二次开发基础。压缩包约 1.99MB核心内容为 Java 源代码、MySQL 建表脚本与配套设计报告建表设计合理规范可帮助读者快速理解表结构关系、业务流转与系统实现思路。资源已有 6063 人浏览学习尤其适合需要从零搭建选课系统、撰写设计文档或完善数据库建模的读者。1. 学生选课信息管理系统是什么最常见的课程设计题目到底考什么学生选课信息管理系统是数据库课程设计里出现频率最高的题目。它不是简单的增删改查而是把ER模型设计、MySQL表结构、Java通过JDBC读写数据库、并发控制这些考点串在一起最后还要交一份撑得住答辩的设计报告。很多同学把“能跑起来”当目标答辩时一句“为什么选课表用联合主键”就卡住。这个项目其实是完整的数据库入门闭环建表、登录、选课、退课代码和表结构互相咬合适合正在做课程设计或想拿完整案例练手的人。我见过不少提交上来的源码脚本和Java风格割裂字段对不上事务没做中文乱码。下面按实际做过的方案讲建表脚本、JDBC代码、设计报告写法最后是避坑清单让你交出去的东西能演示、能讲、能答辩。2. 从需求到表结构选课系统的ER模型与MySQL建表脚本选课系统业务不复杂但表结构设计决定了后面Java代码好不好写。先把实体和关系画清楚再建表别一上来就写CREATE TABLE。设计报告里这一部分对应“需求分析”和“概念结构设计”表结构定错后面全盘返工。2.1 需求拆解学生、课程、教师、选课四类实体怎么划边界常见的需求描述是学生登录后可查看课程列表、选课、退课、查看已选课程教师可查看自己课程的学生名单管理员维护课程信息。抽实体时注意学生和课程之间是多对多关系必须拆出选课表教师和课程是一对多教师工号放在课程表里做外键即可不需要单独建关联表。四个实体的属性划分t_student学号、姓名、性别、专业、班级、登录密码t_teacher工号、姓名、职称、学院t_course课程号、课程名、学分、上课时间、上课地点、容量、已选人数、授课教师工号t_sc选课记录学号、课程号、选课时间、成绩两个关键判断成绩字段放选课表而不是课程表因为“成绩”是某学生选某门课这个行为产生的结果不是课程的属性selected_count 这个冗余字段建议保留每次选课都COUNT(*)扫全表在数据量上来后会很慢但冗余字段必须在事务里维护否则会出错这个坑在第5章单独说。提示设计报告里的实体属性表必须和你后面的CREATE TABLE完全一致答辩老师经常逐项对照检查。2.2 建表SQL与主外键约束一份能直接跑的脚本以下脚本在MySQL 5.7和8.0都能运行字符集用utf8mb4避免生僻字和特殊符号写入报错。建库时把字符集定死后面少很多麻烦。-- 建库字符集一定用 utf8mb4 DROP DATABASE IF EXISTS course_db; CREATE DATABASE course_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE course_db; -- 学生表 CREATE TABLE t_student ( student_id CHAR(10) NOT NULL COMMENT 学号, student_name VARCHAR(20) NOT NULL COMMENT 姓名, gender CHAR(1) DEFAULT 男 COMMENT 性别, major VARCHAR(40) DEFAULT NULL COMMENT 专业, class_name VARCHAR(30) DEFAULT NULL COMMENT 班级, password VARCHAR(64) NOT NULL DEFAULT 123456 COMMENT 登录密码, PRIMARY KEY (student_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT学生表; -- 教师表 CREATE TABLE t_teacher ( teacher_id CHAR(8) NOT NULL COMMENT 教师工号, teacher_name VARCHAR(20) NOT NULL COMMENT 姓名, title VARCHAR(20) DEFAULT NULL COMMENT 职称, department VARCHAR(40) DEFAULT NULL COMMENT 学院, PRIMARY KEY (teacher_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT教师表; -- 课程表 CREATE TABLE t_course ( course_id CHAR(8) NOT NULL COMMENT 课程号, course_name VARCHAR(50) NOT NULL COMMENT 课程名, credit DECIMAL(3,1) NOT NULL DEFAULT 2.0 COMMENT 学分, course_time VARCHAR(50) DEFAULT NULL COMMENT 上课时间如 周一3-4节, course_place VARCHAR(50) DEFAULT NULL COMMENT 上课地点, capacity INT NOT NULL DEFAULT 60 COMMENT 容量, selected_count INT NOT NULL DEFAULT 0 COMMENT 已选人数, teacher_id CHAR(8) DEFAULT NULL COMMENT 授课教师工号, PRIMARY KEY (course_id), KEY idx_teacher (teacher_id), CONSTRAINT fk_course_teacher FOREIGN KEY (teacher_id) REFERENCES t_teacher (teacher_id) ON DELETE SET NULL ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT课程表; -- 选课表 CREATE TABLE t_sc ( student_id CHAR(10) NOT NULL COMMENT 学号, course_id CHAR(8) NOT NULL COMMENT 课程号, select_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 选课时间, score DECIMAL(5,2) DEFAULT NULL COMMENT 成绩未录入前为NULL, PRIMARY KEY (student_id, course_id), KEY idx_course (course_id), CONSTRAINT fk_sc_student FOREIGN KEY (student_id) REFERENCES t_student (student_id) ON DELETE CASCADE, CONSTRAINT fk_sc_course FOREIGN KEY (course_id) REFERENCES t_course (course_id) ON DELETE CASCADE ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT选课表;参数说明t_course 里 teacher_id 用外键关联 t_teacherON DELETE SET NULL 表示教师离职后课程保留、教师字段置空t_sc 里两个外键都用 ON DELETE CASCADE学生毕业删除时选课记录自动清掉省得在Java里手动处理。DECIMAL(3,1) 用来存学分DECIMAL(5,2) 存成绩比FLOAT精确不会被浮点误差坑。ENGINEInnoDB 必须写外键和事务都依赖它MyISAM 不支持行级锁和事务这是设计报告里“物理结构设计”要写清楚的理由。2.3 选课表为什么要联合主键三个容易犯的设计错误第一个错误给 t_sc 加一个自增id做主键然后不限制 (student_id, course_id) 唯一。这样同一个学生可以选同一门课两遍业务上说不通。用联合主键天然去重插入重复数据时数据库直接报主键冲突。第二个错误联合主键字段顺序写反。(student_id, course_id) 作为主键最左前缀是 student_id适合“查某学生选了哪些课”如果系统里更常查“某门课有哪些学生选”主键可以换成 (course_id, student_id)。教学系统里一般前者更常见但你要能说清这个选择答辩时这就是一个送分题。第三个错误外键列没加独立索引。InnoDB 里外键列需要索引否则删除课程时外键检查会做全表扫描。上面脚本里手动加了 KEY idx_course (course_id)就是为了让 ON DELETE CASCADE 走索引同时保证按课程查选课名单时不回表扫主键。这个细节写进设计报告的索引设计部分老师会觉得你是真做过而不是照抄模板。3. 用Java连接MySQLJDBC封装与登录、选课、退课的完整代码表结构定了Java侧就是围绕数据库增删改查做业务。这里不推荐一上来就用MyBatis这种框架课程设计用原生JDBC更能讲清楚连接、事务这些基础答辩也少被追问框架底层原理。下面代码基于Java 8和MySQL Connector/J 8.0换5.7数据库时驱动写法不同第5章会单独说明。3.1 驱动加载与连接配置URL、账号密码放进配置文件常见做法是把驱动和连接参数放在classpath下的db.properties而不是硬编码在类里。这样换数据库只需要改配置文件源代码里不出现任何环境相关的信息。# db.properties放在 src 根目录 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/course_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456参数说明driver 用 com.mysql.cj.jdbc.Driver 是 Connector/J 8.0 的类名如果你用的还是 5.1.x 老驱动这里要写成 com.mysql.jdbc.Driver混用会直接报 ClassNotFoundException。URL 里的 characterEncodingutf8 解决中文乱码serverTimezoneAsia/Shanghai 解决MySQL 8.0 驱动要求显式指定时区的报错。注意 MySQL 8.0 的驱动类在旧包名下不存在这是第5章第一个坑的根源。import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.Properties; public class JdbcUtil { private static String url; private static String username; private static String password; static { try (InputStream in JdbcUtil.class.getClassLoader() .getResourceAsStream(db.properties)) { Properties props new Properties(); props.load(in); url props.getProperty(jdbc.url); username props.getProperty(jdbc.username); password props.getProperty(jdbc.password); Class.forName(props.getProperty(jdbc.driver)); } catch (Exception e) { throw new ExceptionInInitializerError(加载数据库配置失败: e.getMessage()); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } }逻辑说明静态代码块在类加载时执行一次把配置读进内存并注册驱动之后所有方法共用。getConnection() 每次返回新连接课程设计规模完全够用。注意处理 JDBC 的 Connection、Statement、ResultSet 都要关闭这里用 try-with-resources 自动关避免连接泄漏。如果你加连接池只需要改这一个方法业务代码不用动。3.2 登录模块用PreparedStatement防注入同时省去引号拼接登录是每个选课系统都有的功能写法最能看出基本功。错误写法是用 Statement 拼字符串SELECT ... WHERE student_id studentId 这样的SQL注入漏洞输入 or 11 直接绕过密码。正确写法是用 PreparedStatementpublic Student login(String studentId, String password) { String sql SELECT student_id, student_name, major FROM t_student WHERE student_id ? AND password ?; try (Connection conn JdbcUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, studentId); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { Student s new Student(); s.setStudentId(rs.getString(student_id)); s.setStudentName(rs.getString(student_name)); s.setMajor(rs.getString(major)); return s; } } } catch (SQLException e) { e.printStackTrace(); } return null; }参数说明PreparedStatement 的 ? 占位符由 setString 填充MySQL驱动会对值做转义单引号和反斜杠都不会破坏SQL结构这就是PreparedStatement防注入的原理。课程列表查询就是另一条 SQLSELECT * FROM t_course ORDER BY credit DESC, course_id排序写在SQL里而不是拿到Java里排序这是数据库使用的基本习惯。另外密码明文存表只够教学演示设计报告里要补一句“正式系统应存MD5加盐或bcrypt哈希”答辩时这是明显加分项。3.3 选课退课的事务边界先查余量再写入的正确顺序选课涉及三个动作判断余量、插入选课记录、更新已选人数。这三步必须在同一个事务里否则中间任何一步失败数据就对不上。比如先插入记录再更新人数插入成功而更新失败余量就虚了。下面是选课核心代码public void selectCourse(Connection conn, String studentId, String courseId) throws Exception { // 调用方先执行 conn.setAutoCommit(false) 开启事务 String checkSql SELECT capacity, selected_count FROM t_course WHERE course_id ? FOR UPDATE; String insertSql INSERT INTO t_sc (student_id, course_id, select_time) VALUES (?, ?, NOW()); String updateSql UPDATE t_course SET selected_count selected_count 1 WHERE course_id ?; try (PreparedStatement psCheck conn.prepareStatement(checkSql); PreparedStatement psInsert conn.prepareStatement(insertSql); PreparedStatement psUpdate conn.prepareStatement(updateSql)) { psCheck.setString(1, courseId); try (ResultSet rs psCheck.executeQuery()) { if (!rs.next()) { throw new RuntimeException(课程不存在); } int capacity rs.getInt(capacity); int selected rs.getInt(selected_count); if (selected capacity) { throw new RuntimeException(该课程容量已满); } } psInsert.setString(1, studentId); psInsert.setString(2, courseId); psInsert.executeUpdate(); psUpdate.setString(1, courseId); psUpdate.executeUpdate(); conn.commit(); } catch (Exception e) { conn.rollback(); throw e; } }逻辑说明SELECT ... FOR UPDATE 是行级锁把这条课程记录锁住防止两个学生同时读到余量1然后都通过判断这是解决超选的正确姿势。setAutoCommit(false) 关闭自动提交后commit() 之前的所有操作要么全部生效要么 rollback() 全部撤销。退课就是反方向先确认存在选课记录再 DELETE 选课记录再把 selected_count 减一同样用事务包裹。代码里事务的开启和关闭建议放在 Service 层而不是 DAO 层否则两个DAO方法之间没法共享同一个事务。4. 设计报告怎么写得像样结构、图表和测试用例的套路源代码能跑只是及格设计报告才是课程设计的大头。报告不用写得华丽但结构要完整图表要和代码自洽。很多人的报告是网上模板改的ER图里实体和实际建的表对不上这种一眼就能看出来答辩必被追问。4.1 设计报告的章节骨架从需求分析到数据库物理设计一份标准的课程设计报告章节骨架是固定的按下面这张表组织每个章节写什么、常见扣分点是什么一次看清楚章节必写内容常见扣分点需求分析功能需求、性能需求、可行性分析功能列表和实际代码对不上概念结构设计ER图、实体属性表多对多关系漏拆实体画错逻辑结构设计关系模式、函数依赖、范式分析没写范式或写了和表结构矛盾物理结构设计建表语句、索引设计、存储引擎选择只贴SQL不讲为什么选InnoDB系统实现模块划分、关键代码、运行截图截图模糊或日期是旧时间测试测试用例表、测试结果用例只有正常路径没有边界值范式分析是报告的省钱项t_student 里学号决定所有属性满足BCNFt_sc 是 (student_id, course_id) 联合决定 score无部分函数依赖满足第二范式以上。写一段“本设计所有表均满足BCNF”就能堵住一半提问。逻辑结构设计里要把每个关系模式写出来格式是“学生学号姓名性别专业班级密码”主键加下划线外键标FK这样老师一眼看出你理解了关系模式转表的规则。4.2 数据流图与用例图画到几层才不会被答辩老师挑刺数据流图DFD画两层足够。顶层图画一个“选课系统”圆圈外部实体是学生、教师、管理员数据流标注“登录信息”“选课请求”“课程信息”。一层图画分解成“登录验证”“课程查询”“选课处理”“退课处理”“成绩录入”五个加工每个加工旁边标注输入输出和涉及的数据存储。不用画到二层加工问就说“二层加工与一层一致按模块实现细节见系统实现部分”。用例图画四个核心用例学生登录、学生选课、学生退课、管理员维护课程。每个用例要有基本流和备选流比如“选课用例备选流容量已满提示错误并终止选课”。“备选流”这三个字写进报告答辩老师基本就不会再追用例设计因为多数人只会画一个椭圆加几条线。4.3 测试用例表这样写边界值进去报告立刻有分量测试用例表是多数人敷衍的地方写几个“登录成功”“选课成功”就交差。光有正常路径测试那章毫无说服力。把边界值用例补进去报告立刻不一样用例编号测试项输入预期结果实际结果TC001登录-密码正确学号2023010101密码123456登录成功跳转主页通过TC002登录-密码错误密码000000提示密码错误通过TC003选课-余量充足容量60已选59选课成功已选变60通过TC004选课-容量已满容量60已选60提示已满不插入记录通过TC005退课-未选课程未选过该课提示未选不执行删除通过TC006选课-重复选课已选过该课主键冲突提示不可重复通过说明TC004、TC005、TC006 这三条边界用例分别对应容量边界、业务前置条件、数据库主键约束。报告里注明“TC006 与 t_sc 表联合主键对应”体现的是你理解表设计和业务规则一致。测试结果里如果 TC004 第一次失败不要删掉保留“失败后修复记录”这比全篇“通过”更真实老师反而认可。5. 避坑排查实录MySQLJava选课系统最常见的5个翻车现场下面5个问题是我在课程设计作业里看到重复率最高的每条按“现象 → 原因 → 解决”写清楚对应你自己的项目排查时按这个路径走就能定位。5.1 中文乱码连接串少了characterEncoding导致全表问号现象Java里插入学生姓名后MySQL里看到“???”控制台打印正常但库里全是问号。原因连接串没指定字符集MySQL服务端和客户端连接用了不同编码另一种可能是建表时没指定字符集表默认建成了latin1。解决表统一用utf8mb4连接串加 characterEncodingutf8插入前执行 SET NAMES utf8mb4。排查时用 SHOW CREATE TABLE 看表定义用 SHOW VARIABLES LIKE character_set% 看服务端设置先确认库和连接别一开始就怀疑Java代码。乱码问题里连接串参数漏写占了七成表字符集错了占三成代码本身基本没错。5.2 ClassNotFoundException驱动版本和MySQL版本不对付现象运行时报 java.lang.ClassNotFoundException: com.mysql.jdbc.Driver。原因MySQL 8.0 用的 Connector/J 8.0 里驱动类改名了com.mysql.jdbc.Driver 这个老类名只存在于 5.1.x 及之前的驱动包。解决要么用 com.mysql.cj.jdbc.Driver 配 8.0 驱动包要么把驱动 jar 换回 5.1.49 配合 MySQL 5.7。另外 jar 没放进项目的库路径、没加到构建路径也会报这个错先用 jar tf 命令查看包里的类名确认版本再检查依赖有没有真的引入。这个报错的本质是版本不匹配不是代码逻辑问题所以改驱动版本而不是改代码。5.3 并发选课余量变负数没有事务和锁时的经典事故现象课程容量60两个学生同时选课最后已选人数变成62极端情况变成负数。原因无锁时两个连接同时读到余量59都判断可以通过然后各自执行更新 1后写覆盖先写产生丢失更新。解决用第3章的 SELECT ... FOR UPDATE 锁行加事务这是 MySQL InnoDB 处理并发更新的标准做法。如果用了 MyISAM 引擎FOR UPDATE 不生效因为 MyISAM 不支持行锁这也是建表时指定 ENGINEInnoDB 的原因。答辩被问“怎么解决超选”把这条背下来再补一句“生产环境还可以用乐观锁版本号”就完全够用了。5.4 时间字段比较出错DATETIME和String的隐式转换现象查询“周一3-4节”的课程冲突时用字符串比较 course_time 得到错误结果或者把 String 转 Date 再比较结果全对不上。原因course_time 存的是“周一3-4节”这种文本设计上就不能用时间区间比较如果存了 DATETIME 字段Java 侧应该用 java.sql.Timestamp 或 LocalDateTime 而不是 java.util.Date否则驱动做隐式转换时会有时区差。解决教学系统里上课时间用规范化文本周几节次存储冲突判断交给 Java 逻辑规则如果真要存时间查询用 JDBC 4.2 的 setObject 传 LocalDateTime不要用字符串拼日期。这个坑的根源是字段类型选错而不是代码写错。5.5 设计报告插图模糊Visio导出的图片被缩放现象Word里插入的ER图放大后糊成一片答辩时老师根本看不清实体名和联系。原因从微信或截图工具里拿的低分辨率图Word缩放后像素不够。解决Visio 导出 PNG 时把分辨率设到 300dpi或者导出 SVG 再转高清图Word 里图片宽度控制在 14cm 以内不要拉伸变形。代码截图也一样IDE 里把字号调大一些再截图保证答辩投影时能看清。这个坑不涉及技术但每年都有项目因为图看不清被扣分属于白送的失分点。6. 答辩前必做的三件事从能运行到能讲清楚代码能跑只是起点答辩看的是能不能讲明白、扛得住追问。我一般答辩前固定做三件事。第一件把 JDBC 裸连接换成连接池。用 HikariCP 或 Druid 都行核心是让老师知道你清楚“连接不能裸用”。配置里写清 maximumPoolSize10、minimumIdle2解释“每次 getConnection 从池里取用完归还避免频繁建连”。只改 JdbcUtil.getConnection() 一个方法业务代码不动面试和答辩都能聊。第二件加一个批量导入选课入口用 PreparedStatement 批处理提升插入效率String sql INSERT INTO t_sc(student_id, course_id) VALUES(?, ?); try (Connection conn JdbcUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { conn.setAutoCommit(false); for (String[] row : rows) { // rows: 待导入的学号、课程号列表 ps.setString(1, row[0]); ps.setString(2, row[1]); ps.addBatch(); } ps.executeBatch(); conn.commit(); }addBatch 攒一批再 executeBatch 提交比逐条 executeUpdate 快一个量级事务包裹保证中间某条主键冲突时整体回滚。老师追问“冲突怎么办”答“用 INSERT IGNORE 或 ON DUPLICATE KEY UPDATE 跳过已选”顺手把 MySQL 的 upsert 语法也覆盖了这题就能站起来聊。第三件讲清楚索引。在选课表上演示 EXPLAIN SELECT * FROM t_sc WHERE student_id2023010101主键是 (student_id, course_id)这条查询走主键索引type 是 ref 而不是 ALL换成分号查 course_id走的是 idx_course。把 EXPLAIN 结果截图放进报告附录再准备一句话“索引设计遵循最左前缀原则选课表两个查询方向分别建了索引”。最后说个我的习惯哪怕演示代码里密码存明文报告里也要写一句“生产环境不能存明文应存哈希加盐”。老师问得深就聊哈希和盐值问得浅就一句话带过这道题答出来整个项目的可信度就上来了。希望这些踩过的坑和收尾动线对你有用希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
桌面型CRM不只是一层壳:DeskcommCRM如何整合全渠道沟通与数据链路 桌面型CRM喊了很多年,但大多数产品其实只是把网页端塞进了一个桌面壳里。直到我真正把DeskcommCRM部署进客户的销售和售后团队,才发现这个产品对“桌面工作台”和“通讯集成”的理解确实不太一样。它不是一个单纯记录客户信息的数据库,而是把… · 2026/9/26 9:00:54
NEU-DET钢材缺陷数据集:工业视觉落地的标定基准与实战指南 1. 这不是普通数据集,而是一把打开工业视觉落地大门的钥匙“NEU-DET钢材表面缺陷数据集”——这行字在钢铁厂质检工程师的电脑收藏夹里、在高校实验室的论文参考文献中、在AI算法工程师调试模型时的终端日志里反复出现。它不是一份冷冰冰的压缩包,而是国… · 2026/9/26 9:00:54
Atlas 300V 24G上部署YOLO:推理加速卡实战与避坑指南 上周有个做安防项目的朋友突然问我:Atlas 300V 24G 是不是运算加速卡?他准备拿它跑YOLO做人员检测,结果被卖家客服一句话整懵了——客服说这张卡“不是显卡,是加速卡”。这话听起来像废话,但确实戳中了很多刚接触昇腾生… · 2026/9/26 9:00:54
【值得收藏】AI架构选型指南:单Agent vs 多Agent,用TaoToken统一Key跑通思维链配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:49:52
Laya Core ML ANE 可行性研究:等价图变换与可测量的 10× 能耗目标 【免费下载链接】laya-coreml Local Laya typed decisions on Apple Core ML and Neural Engine. Validated ports, ~5 ms short decisions on M3 Max, reproducible speed and energy benchmarks. 项目地址: https://gitcode.com/gh_mirrors/la/laya-coreml 点击查… · 2026/9/26 10:49:45
Cursor 指令工具配 TaoToken:settings.json 骨架与报错排查 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:49:38
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46