简介一套面向高校数据库课程设计的学生选课信息管理系统完整方案采用 Java MySQL 实现 C/S 架构适合计算机相关专业学生作为课程设计、毕业设计或期末项目参考。系统划分学生、教师、管理员三类角色覆盖个人信息维护、课程查询与选退课、成绩录入与查询、学生/教师/课程管理、院系与奖惩信息管理等完整业务模块。资源共 112 个文件压缩包约 1.99MB其中 21 个 Java 源文件与 66 个编译类构成可运行程序SQL 脚本提供规范建表语句doc 报告及文档可辅助理解设计思路与答辩准备。资料附带设计报告目录结构清晰可直接对照学习。截至目前已有 16470 人学习下载适合需要快速搭建数据库应用系统、梳理数据表关系并完成课程设计报告的读者。1. 学生选课信息管理系统先想清楚“做完能答辩”再动手学生选课信息管理系统这类题目几乎每个学数据库的人都要碰一次。你拿到的这份资源是典型的 Java MySQL 的 CS 架构课设三类角色——学生、教师、管理员——各管一摊选课退课、成绩录入、学生教师课程管理都齐了还附带一份建表规范的设计报告。换句话说它不是那种只有几个页面、连外键都没有的演示壳子而是能真正跑起来、能讲出设计逻辑的完整课设。先说适合谁正在做数据库课程设计、需要参考完整源码和报告结构的学生以及想借一个熟悉的三层业务练 JDBC、Swing、事务和 MySQL 约束的入门者。这份资源能解决的是“从零到能答辩”的全过程——你要的不是再读一遍理论而是一份可以直接复现、能逐行解释的设计。下面我按“库怎么建、功能怎么落、界面怎么分、坑在哪、怎么验收”的顺序拆透。2. 系统架构与数据库建模三类角色和八张核心表的落地打开源码包你会看到一组编译好的 class 文件和一个设计报告推荐的做法是先把报告里的建表 SQL 还原出来自己跑一遍。这一章讲清楚为什么这么建表、JDBC 怎么封装以及每张表在你的选课业务里承担什么。2.1 为什么选 Java Swing MySQLCS 架构在课程设计里的优势课程设计场景下选型的第一原则是“老师能看懂、你能讲明白”。Java Swing 做客户端界面MySQL 做数据存储这是一个标准的两层 CS 架构客户端直接通过 JDBC 连数据库。比起 Web 方向要额外搭 Tomcat、写 JSP/HTMLSwing 把界面代码和业务代码放在同一个工程里调试链路短也容易在答辩时现场改代码演示。这套架构的边界也很明显客户端直连数据库安全性基本靠数据库账号权限兜底不适合生产环境。但在课设场景里这正是优点——你可以在 Tools 类里清楚地看到连接串、账号密码、驱动加载老师一问“数据库怎么连的”你就能从工具类讲到连接参数不黑匣子。2.2 表结构设计从用户表到选课表的约束拆解好的课设库表不需要多但要“规范”。设计报告里体现出来的建表逻辑我建议还原成下面这样的核心结构。常见做法是拆出 user 表专门做登录把学生、教师、管理员的业务信息分表存放避免密码字段混在业务表里。CREATE DATABASE IF NOT EXISTS course_select DEFAULT CHARACTER SET utf8mb4; USE course_select; CREATE TABLE college ( college_id VARCHAR(10) PRIMARY KEY, college_name VARCHAR(50) NOT NULL UNIQUE ); CREATE TABLE student ( student_id VARCHAR(12) PRIMARY KEY, student_name VARCHAR(20) NOT NULL, sex CHAR(1) DEFAULT 男, major VARCHAR(50), class_name VARCHAR(30), college_id VARCHAR(10), FOREIGN KEY (college_id) REFERENCES college(college_id) );这段 SQL 先把院系抽成独立表学生在边上只存一个外键。这样做的直接收益是如果学校改名只要 UPDATE college 一行不用批量改几千个学生记录。字段都用 VARCHAR 而不全用 INT是因为学号、课程号往往带前缀比如 2023010801、CS101这在课设答辩时能解释成“符合学校编码规范”。接下来是选课表这是整个系统里约束最密集的一张表CREATE TABLE course ( course_id VARCHAR(10) PRIMARY KEY, course_name VARCHAR(50) NOT NULL, teacher_id VARCHAR(10), credit DECIMAL(3,1), capacity INT DEFAULT 60, selected_count INT DEFAULT 0, FOREIGN KEY (teacher_id) REFERENCES teacher(teacher_id) ); CREATE TABLE sc ( id INT AUTO_INCREMENT PRIMARY KEY, student_id VARCHAR(12), course_id VARCHAR(10), semester VARCHAR(20), score DECIMAL(5,2), UNIQUE KEY uk_stu_course (student_id, course_id), FOREIGN KEY (student_id) REFERENCES student(student_id), FOREIGN KEY (course_id) REFERENCES course(course_id) );核心是UNIQUE KEY uk_stu_course (student_id, course_id)这一行。学生在同一学期不能重复选同一门课这个约束如果只靠 Java 代码判断并发时必然出问题。把联合唯一约束放到数据库层等于上了第一道保险——哪怕两个窗口同时提交选课数据库也会拒绝第二条重复记录。课程表里我习惯把capacity和selected_count分开capacity 是容量selected_count 是当前已选人数每次成功选课就把 selected_count 加一。这个设计叫“冗余计数”虽然违反一点点范式但换来的是查课程列表时不用每次 COUNT(*) 选课表符合课设里“合理冗余”的答辩点。2.3 JDBC 工具类驱动加载、连接参数与资源关闭源码里的 Tools.class 就是干这个的它把所有连接细节收敛到一个类里。下面是标准写法import java.sql.*; public class Tools { private static final String URL jdbc:mysql://localhost:3306/course_select ?useUnicodetruecharacterEncodingutf8 serverTimezoneAsia/ShanghaiuseSSLfalse; private static final String USER root; private static final String PASSWORD 123456; static { try { Class.forName(com.mysql.cj.jdbc.Driver); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } public static void close(ResultSet rs, Statement st, Connection conn) { if (rs ! null) { try { rs.close(); } catch (SQLException e) { } } if (st ! null) { try { st.close(); } catch (SQLException e) { } } if (conn ! null) { try { conn.close(); } catch (SQLException e) { } } } }静态块里Class.forName只做一次驱动加载把“加载驱动”和“拿连接”分开。URL 里的serverTimezoneAsia/Shanghai是 MySQL 8.x 必须加的不加会直接报时区异常useSSLfalse是关掉 SSL 握手本地开发能省掉一堆告警。注意Tools.close()的关闭顺序先关 ResultSet再关 Statement最后关 Connection。实际很多翻车现场是连接没关导致 MySQL 报 “Too many connections”。我一般会把 close 方法重载成两个版本一个接收全部三个资源一个只接收两个界面代码里用起来更顺手。拿到源码后建议把 PASSWORD 改成你自己的 MySQL 密码这是这份资源跑起来之前第一个要动的参数。3. 核心功能实现登录鉴权、选课事务与成绩录入数据库表建好了接下来是把三类用户的功能落到代码上。这一章挑三个最关键的业务点讲登录怎么鉴权、选课怎么做事务、成绩录入怎么校验。这三个点也是答辩时老师最可能追问的。3.1 登录鉴权PreparedStatement 防注入与角色路由登录逻辑不能拼字符串否则输入 OR 11就能绕过密码。源码里应该用参数绑定常见做法是查 user 表拿到角色类型再按角色跳转到不同的界面类public int login(String username, String password) { String sql SELECT user_type FROM user WHERE username? AND password?; try (Connection conn Tools.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); try (ResultSet rs ps.executeQuery()) { if (rs.next()) { return rs.getInt(user_type); // 1学生 2教师 3管理员 } } } catch (SQLException e) { e.printStackTrace(); } return -1; }PreparedStatement的?占位符会把传入值当纯数据而不是拼进 SQL 语法这是防注入的最基本手段。返回值里约定 1、2、3 对应三类角色主窗体拿到这个值后用 switch 决定 new StudentGUI() 还是 TeacherGUI() 还是 AdministerGUI()。这种“单点登录、按角色路由”的结构答辩时很好讲权限控制集中在登录入口。密码明文存储是课设的常见妥协但你要知道这是一个可以改进的点。如果老师问“密码安全吗”你可以回答正式系统会用 MD5 加盐或 BCrypt 哈希课设为了演示流程所以简化了——这么一说反而加分。3.2 选课与退课事务边界和 FOR UPDATE 行锁选课是检验你是否真懂事务的经典场景。一个完整的选课操作要干三件事判断容量、插入选课记录、把课程表已选人数加一。这三件事必须要么全成功要么全失败否则会出现“选课记录插进去了但人数没加”的脏数据。public boolean selectCourse(String studentId, String courseId, String semester) { Connection conn null; PreparedStatement psCheck null; PreparedStatement psInsert null; PreparedStatement psUpdate null; try { conn Tools.getConnection(); conn.setAutoCommit(false); String sqlCheck SELECT capacity, selected_count FROM course WHERE course_id? FOR UPDATE; psCheck conn.prepareStatement(sqlCheck); psCheck.setString(1, courseId); ResultSet rs psCheck.executeQuery(); if (rs.next()) { int capacity rs.getInt(capacity); int selected rs.getInt(selected_count); if (selected capacity) { return false; } } String sqlInsert INSERT INTO sc(student_id, course_id, semester) VALUES(?,?,?); psInsert conn.prepareStatement(sqlInsert); psInsert.setString(1, studentId); psInsert.setString(2, courseId); psInsert.setString(3, semester); psInsert.executeUpdate(); String sqlUpdate UPDATE course SET selected_countselected_count1 WHERE course_id?; psUpdate conn.prepareStatement(sqlUpdate); psUpdate.setString(1, courseId); psUpdate.executeUpdate(); conn.commit(); return true; } catch (SQLException e) { try { if (conn ! null) conn.rollback(); } catch (SQLException ex) { } e.printStackTrace(); return false; } finally { try { conn.setAutoCommit(true); } catch (SQLException e) { } Tools.close(null, psCheck, conn); } }这段代码藏着三个关键点。第一setAutoCommit(false)把事务边界手动打开直到commit()才算真正落库。第二SELECT ... FOR UPDATE是行级锁第一个选这门课的人锁住课程行其他人只能等他提交或回滚从根上避免“两人同时看到 capacity1 然后都选成功”。第三finally里把 autoCommit 恢复成 true否则这个连接还给连接池后下个使用者会莫名陷入事务状态。退课逻辑是选课的逆操作但有一个经常被忽略的细节退课要同时做 DELETE sc 记录和UPDATE course SET selected_count selected_count - 1。我记得曾见过一份代码只删了 sc 记录没减人数结果课程列表里显示“已选 58/60”实际上库里只剩 57 条记录。这种对不上的数据在答辩演示时特别容易被老师抓包。3.3 成绩录入UPDATE 语法与分数范围校验教师端录成绩本质就是一次 UPDATE但边界条件要处理干净。源码里的 TeacherGUI 相关监听器最终会执行这样的语句public boolean updateScore(String studentId, String courseId, double score) { if (score 0 || score 100) { return false; } String sql UPDATE sc SET score? WHERE student_id? AND course_id?; try (Connection conn Tools.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setDouble(1, score); ps.setString(2, studentId); ps.setString(3, courseId); return ps.executeUpdate() 1; } catch (SQLException e) { e.printStackTrace(); return false; } }executeUpdate()的返回值是受影响行数等于 1 说明确实更新到一条记录如果返回 0说明这张表里根本没有这个学生的选课记录。校验分数范围放在 Java 层就叫“业务校验”数据库层还可以再加CHECK (score BETWEEN 0 AND 100)作为第二道防线。MySQL 8.0.16 之后 CHECK 约束才真正生效设计报告里如果写了建议跟上你的 MySQL 版本。成绩录入还有一个交互细节教师端通常先输入课程号查询选课学生列表再逐条录入。这个列表查询要用到 JOIN从 sc 表 JOIN student 表拿学生姓名JOIN course 表拿课程名而不是在 sc 表里只显示一堆看不懂的 ID。这算是一个能在答辩时展示 SQL 功底的点。4. 界面层与文件组织MyFrame、Tools、Course 与三个 GUI 的分工源码包里的 class 文件其实已经给了你一张架构图MyFrame 是登录主窗体Tools 是 JDBC 工具类Course 是课程实体类StudentGUI、TeacherGUI、AdministerGUI 分别是三类用户的主界面。这章的落点是让你拿到源码后能快速定位“哪个功能在哪个类里改”。4.1 类职责划分从 class 文件名读出项目结构先看命名StudentGUI$2.class、TeacherGUI$7.class、StudentGUI$3.class这样的带 $ 符号的文件是 Java 编译匿名内部类产生的。$2 和 $3 通常是按钮的 ActionListener 实现——也就是说界面代码把事件监听直接写在 GUI 类里。这种写法的优点是改起来直观缺点是类会越写越长一个 StudentGUI 可能包含查询、选课、退课、成绩、奖惩好几个面板的代码。我的建议是维持它原本的结构但你在阅读时心里要有数MyFrame 里做登录并判断角色StudentGUI 负责学生端所有操作TeacherGUI 管课程查看和成绩录入AdministerGUI 是最重的类学生教师课程选课成绩院系奖惩管理都在里面。Course 类对应 course 表是典型的数据实体属性包括课程号、课程名、学分、容量、教师 IDGUI 里的 JTable 数据模型会直接用它。4.2 学生端界面JTable 数据模型与选课按钮联动学生端界面最常见的形态是上方是查询条件按课程名模糊查中间是 JTable 显示课程列表下方是“选课”“退课”“成绩单”按钮。JTable 要显示数据库数据标准做法是拿到 ResultSet 后转成DefaultTableModelpublic void refreshCourseTable(JTable table, String keyword) { String sql SELECT course_id, course_name, credit, capacity, selected_count FROM course WHERE course_name LIKE ?; try (Connection conn Tools.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { ps.setString(1, % keyword %); try (ResultSet rs ps.executeQuery(); ResultSetMetaData meta rs.getMetaData()) { DefaultTableModel model new DefaultTableModel(); for (int i 1; i meta.getColumnCount(); i) { model.addColumn(meta.getColumnName(i)); } while (rs.next()) { model.addRow(new Object[]{ rs.getString(course_id), rs.getString(course_name), rs.getDouble(credit), rs.getInt(capacity), rs.getInt(selected_count) }); } table.setModel(model); } } catch (SQLException e) { e.printStackTrace(); } }用ResultSetMetaData动态取列名比手写列名数组少一处维护成本。LIKE匹配时手动拼接%通配符同时仍用 PreparedStatement 的参数绑定关键词里带单引号也不会破坏 SQL。注意表格里selected_count和capacity要一起显示学生能直观看到“这门课还剩几个名额”。选课按钮的监听器会读取 JTable 当前选中行取出 course_id然后调用第 3 章那个事务方法。界面代码和业务逻辑分离的好处在这里体现无论你点按钮还是用键盘回车触发最后都走同一条selectCourse()路径。4.3 教师端与管理端监听器写法与数据增删改查的通用模式TeacherGUI$2.class这类匿名内部类写法上等价于下面这段代码。教师端录入成绩时先点“查询课程”按钮刷出选课学生列表再在表格里或文本框里填分数点“保存”触发 UPDATEJButton btnSave new JButton(保存成绩); btnSave.addActionListener(new ActionListener() { Override public void actionPerformed(ActionEvent e) { int row studentTable.getSelectedRow(); if (row 0) { JOptionPane.showMessageDialog(TeacherGUI.this, 请先选择学生); return; } String studentId studentTable.getValueAt(row, 0).toString(); String courseId currentCourseId; String scoreText scoreField.getText().trim(); try { double score Double.parseDouble(scoreText); boolean ok updateScore(studentId, courseId, score); if (ok) { JOptionPane.showMessageDialog(TeacherGUI.this, 成绩保存成功); refreshStudentTable(courseId); } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(TeacherGUI.this, 分数必须是数字); } } });这里有个值得注意的细节JOptionPane.showMessageDialog(TeacherGUI.this, ...)的第一个参数是父窗口不是 this。如果你在匿名内部类里写 this指向的是 ActionListener 对象弹窗定位会出问题。这是很多 Swing 新手翻车的点。管理员端的增删改查就是同一个模板反复用学生管理、教师管理、课程管理本质上是四个按钮增、删、改、查 一个 JTable 刷新方法。真正要上心的是删除顺序——先删子表再删父表这一点下一章的避坑部分会专门讲。5. 避坑指南从 MySQL 连接失败到选课并发超选的五个翻车现场这份资源你拿到的第一眼可能已经带着源码作者自己调好的环境。但换一台电脑、换一个 MySQL 版本问题就来了。以下五条是我在复现这类 JDBC 课设时最常见的踩坑记录每一条都按“现象 → 原因 → 解决”给你。5.1 MySQL 连接失败时区报错和驱动类名现象运行程序后控制台抛出java.sql.SQLException: The server time zone value йʱ is unrecognized或者Communications link failure程序卡在登录界面进不去。原因分两类一是 MySQL 8.x 默认时区是SYSTEM跟中国本地时区对不上JDBC 驱动需要显式指定二是com.mysql.jdbc.Driver这个老驱动类名在 MySQL 8.x 的驱动包里已经被移除或产生过兼容问题。还有一个隐蔽原因MySQL 服务根本没启动3306 端口没监听。解决先把 MySQL 服务启动Windows 在服务管理器里启动 mysqlmac/Linux 用systemctl start mysqld或mysql.server start。然后确认连接串长这样jdbc:mysql://localhost:3306/course_select?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse驱动类名用com.mysql.cj.jdbc.Driver。检查完这两处95% 的连接失败都解决了。5.2 选课重复提交两条一模一样的选课记录现象同一学生同一课程在 sc 表里出现两条记录或者教师录成绩时明明只录了一次列表里出现两行。原因业务代码只用“先 SELECT 判断是否已选再 INSERT”的逻辑但两个窗口同时操作时判断和插入之间没有锁两个请求都认为“我没选过”然后都插入成功。解决数据库层加联合唯一约束UNIQUE KEY uk_stu_course (student_id, course_id)这样第二个 INSERT 会被数据库直接拒绝抛Duplicate entry异常。配合第 3 章事务里的FOR UPDATE行锁从应用层和数据库层双重兜底。如果你拿到的源码没有唯一约束第一件事就是给 sc 表补上否则并发演示时必翻车。5.3 中文乱码界面和数据库之间隔着三道编码现象JTable 里中文显示成???或者 MySQL 命令行里查出来是乱码但 MySQL Workbench 里看是正常的。原因连接串没带characterEncodingutf8建表时字符集不是utf8mb4以及 Java 源码文件本身的编码和编译编码不一致。三个环节只要有一个是 GBK、另外两个是 UTF-8显示就乱。解决统一三层——建库用DEFAULT CHARACTER SET utf8mb4连接串加useUnicodetruecharacterEncodingutf8IDE 里把项目编码设为 UTF-8。这里要单独说一句MySQL 的utf8不是真正的全 Unicodeutf8mb4才是能存 emoji 和特殊符号课设报告里写字符集选型时提这一点是加分项。5.4 外键约束挡路删不掉课程也删不掉院系现象管理员在界面上删除一个课程程序不报错界面上该课程也确实消失了但刷新后课程又回来了。或者删除一个院系直接抛Cannot delete or update a parent row: a foreign key constraint fails。原因这个坑最容易出现在“界面删了但数据库没删成”的场景。去看 MySQL 终端真实错误是被外键约束拦下——sc 表里还有选课记录引用着这门课的 course_idcourse 表里还有学生引用着这个学院的 college_id。解决删除顺序必须是“先子后父”。删课程先执行DELETE FROM sc WHERE course_id?再删 course 记录删院系要先把该院系的学生迁走或者一并删除再删 college。你也可以在建外键时用ON DELETE CASCADE但课设里我不建议这样做——级联删除会把数据无声无息地删掉答辩时老师问“删学生会不会连带删成绩”你解释不清楚。5.5 MySQL 8 认证插件与旧驱动不匹配现象ClassNotFoundException: com.mysql.jdbc.Driver或者Unable to load authentication plugin caching_sha2_password。原因MySQL 5.x 的认证插件是mysql_native_passwordMySQL 8.x 默认是caching_sha2_password。如果你项目里挂的是 mysql-connector-java 5.1.x 的 jar连 MySQL 8 就会在握手阶段失败反过来代码里写旧驱动类名新版驱动包也会报找不到类。解决把连接器 jar 换成mysql-connector-java-8.0.x价签在 POM 或项目 lib 目录里看一眼就清楚。如果想保留老驱动可以改 MySQL 用户的认证插件但不推荐——为课设改数据库全局配置纯属给自己找后续麻烦。这个错误还经常跟 Java 环境变量配置搅在一起CLASSPATH 里同时挂着多个版本的驱动 jar 时优先加载到哪个全看运气。建议把 lib 目录里所有 mysql 相关 jar 删掉只留一个。6. 验收自查与进阶改造答辩前先跑一遍这三个验证离答辩只剩一天时别再翻源码了。按下面这张自查表过一遍比重新读一遍报告有用得多。检查项验证方法通过标准库表约束执行SHOW CREATE TABLE sc\G能看到 FOREIGN KEY 和 UNIQUE KEY事务边界同时开两个客户端选同一门只剩 1 个名额的课一个成功另一个必须失败字符集插入一条中文奖惩记录再查回界面、命令行、表里都无乱码外键删除先删学生再删除其成绩按子表到父表的顺序能删成功驱动版本查看 lib 目录 jar 文件名mysql-connector-java 版本与 MySQL 大版本匹配再补一个动手测试用例学生 A 登录 → 查“数据库”关键词 → 选课成功教师 B 登录 → 查课程 → 给 A 录 95 分管理员登录 → 查 A 的成绩单 → 看到 95 分且选课状态正常。这条链路完整跑通就说明登录鉴权、选课事务、成绩 UPDATE、跨角色数据可见性都没问题。往深走一步这份资源的 Java 分层已经具备迁移到 Web 的骨架。Course 是实体类Tools 是数据库访问层GUI 里的每个按钮监听器本质上是 Service 方法调用。如果改成 Spring Boot你要做的不是重写业务而是把 Tools 换成 MyBatis 或 Spring JDBC把 StudentGUI 换成 Controller Vue 页面事务部分用Transactional注解替代手写setAutoCommit(false)。迁移顺序我建议是先把所有 DAO 方法整理成接口再逐个替换实现最后动界面——这样每一步都可以单独测试。我从那次接手一份删不掉课程的源码之后养成了一个习惯拿到任何课设先跑建表脚本、再写一个最小连接测试、最后才打开 GUI——库不通后面全是伪装。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
CNN与Transformer特征融合:原理、PyTorch实现与论文创新指南 做深度学习研究的人,大概率都经历过这种纠结:既想追热点,又怕被审稿人扣上“公式化排列组合”的帽子;不追热点,又很难在有限时间里从零做出一个全新的方向。这几年被讨论最多的组合里,CNN Transformer 特… · 2026/9/26 11:31:34
AST反混淆JS还原工具2.2:让OB混淆代码可读可运行 简介:面向JS逆向与前端安全分析人员的AST反混淆还原工具2.2,基于丁仔大佬的开源还原方案二次开发,旨在保证原始JS文件可执行性的前提下,将ob混淆等代码还原为更接近源码的可读形式,适合有一定逆向基础、需要批量处理混… · 2026/9/26 11:31:22
PyTorch实战:MNIST手写数字识别从训练到部署全流程 简介:这是一份面向Python初学者与深度学习入门者的手写数字识别实战资源,围绕卷积神经网络(CNN)识别手写数字这一经典计算机视觉任务展开,帮助读者理解图像特征提取与分类的完整流程。压缩包共13个文件,约6… · 2026/9/26 11:31:22
Claude Code 安装与使用指南:从 Node.js 环境到 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 12:06:17
开源二手平台小程序源码:交易社交管理一体化实战 做二手交易项目这些年,我最常被问到的就是:有没有一套能直接用、能改成自己品牌、还能接商用的二手平台小程序方案?市面上要么是SaaS按月收费,数据握在别人手里;要么是几万块定制开发,周期长、成本高。今天… · 2026/9/26 12:06:17
SSM员工管理系统开发实战:从骨架搭建到CRUD联调部署 简介:这是一套基于SSM架构的员工管理系统完整项目,适合Java Web初学者、毕业设计或课程实训参考。系统覆盖员工管理、薪酬管理、用户管理、通知管理、文件管理等核心模块,并区分超级管理员、普通管理员、临时管理员三类权限,可用于… · 2026/9/26 12:06:16
破解‘千年完整代码’压缩包:归档抢救与可复现交付指南 简介:本资源是一份面向Delphi开发者的历史项目源码合集,聚焦于“千年”这一长期演进的软件系统,适用于代码考古、旧系统维护、Delphi组件学习及跨版本兼容性研究。压缩包共含数十个关键文件与目录,涵盖FastNet网络通信库ÿ… · 2026/9/26 12:06:16
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第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