简介本资源为基于Qt与MySQL的多角色教务管理系统完整项目源码面向计算机相关专业学生、毕业设计开发者及Qt入门进阶学习者可用于课程设计、毕设参考或桌面端管理系统练手。系统围绕学生、教师、行政管理人员三类角色设计差异化界面与功能模块涵盖登录验证、学生选课与成绩查询、教师成绩录入与课程管理、管理员信息维护与教务报表等场景并通过权限分离、严谨的数据库表结构与事务处理机制保障数据一致性与安全性。压缩包共41个文件约102KB以cpp与h源码文件为核心配合ui界面文件、qrc资源文件、pro工程文件及education_system.sql数据库脚本另含少量备份文件与说明文档结构清晰便于按模块阅读。目前已有53人学习下载适合需要完整赛题方案、模块划分思路与数据库设计参考的读者对照研究。1. 从一张排课冲突表说起QtMySQL 教务系统到底解决什么问题每年开学前两周教务处的老师都会经历一次“排课地狱”。我见过最夸张的一次是三个学院共用一栋教学楼Excel 里排出来的课表有 47 处时间冲突人工核对到凌晨两点。更麻烦的是学生端、教师端、管理员端看到的数据还不一致——老师那边显示教室空闲学生那边却已经有人占了。这类问题的根子不在排课算法而在数据没有统一入口、角色没有权限隔离。基于 Qt 与 MySQL 的多角色教务管理系统要解决的就是这件事用 MySQL 做唯一数据源用 Qt 做跨平台桌面客户端把管理员、教师、学生三类角色的操作收进同一套权限模型里。管理员负责基础数据班级、课程、教室、用户教师负责成绩录入和教学任务查看学生负责选课和成绩查询。它适合有 C 基础、想做一个能写进简历或直接交付给学校使用的桌面端项目的开发者。热搜里常出现的 Qt 安装、MySQL 安装配置、Qt Designer 界面设计都是这个项目绕不开的前置环节后面会逐个落到命令和参数上。这个系统的技术选型并不复杂但“多角色”三个字会带来大量细节登录后如何动态加载菜单、不同角色看到的表字段是否一致、并发选课时如何防止超选。这些才是决定项目能不能真正跑起来的关键。下面按“先立住架构再动手复现最后排坑”的顺序展开。2. 架构与数据模型多角色权限怎么落到表结构上2.1 为什么选 Qt Widgets MySQL 而不是 Web 方案教务系统天然是“表单密集型”应用大量增删改查、表格展示、下拉筛选。Qt Widgets 的QTableView配合QSqlTableModel能极快地搭出可编辑表格信号槽机制也让“选课成功后刷新列表”这类联动变得直观。相比 Web 方案桌面端不需要额外部署浏览器兼容层局域网内直连 MySQL 的延迟也更低。MySQL 这边选它的理由更实际教务数据是典型的关系型数据班级、课程、学生、选课记录之间存在明确的外键关系MySQL 的 InnoDB 引擎支持事务选课这种“插入记录 更新余量”的操作必须放在一个事务里否则并发时会超选。热搜里提到的mysql的数据库连接池在桌面端其实不是必须的——Qt 的QSqlDatabase本身支持多连接但一个客户端进程通常只需要一个连接连接池更多是服务端场景。提示如果学校要求跨平台Windows 机房 Linux 服务器Qt 的同一套代码可以分别编译MySQL 驱动需要对应平台单独编译这是后面避坑章会重点讲的内容。2.2 五张核心表与角色权限字段设计多角色系统的表结构不需要花哨但必须把“谁能看到什么”提前设计进去。我一般会建五张核心表user账号与角色、student、teacher、course、enrollment选课记录。角色字段放在user表里用枚举值区分而不是给每个角色建独立登录表——后者会让登录逻辑分叉后期加角色时改动量大。-- 用户表role 字段决定登录后加载哪个界面 CREATE TABLE user ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(50) NOT NULL UNIQUE, password_hash CHAR(64) NOT NULL, -- SHA-256不存明文 role ENUM(admin,teacher,student) NOT NULL, ref_id INT DEFAULT 0, -- 关联 student.id 或 teacher.id status TINYINT DEFAULT 1 -- 1 正常0 禁用 ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 选课表加唯一索引防止同一学生重复选同一门课 CREATE TABLE enrollment ( id INT PRIMARY KEY AUTO_INCREMENT, student_id INT NOT NULL, course_id INT NOT NULL, score DECIMAL(5,2) DEFAULT NULL, enroll_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_stu_course (student_id,course_id), FOREIGN KEY (student_id) REFERENCES student(id), FOREIGN KEY (course_id) REFERENCES course(id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;role用 ENUM 而不是字符串是为了在数据库层面就限制取值范围避免应用层写错角色名导致登录后菜单空白。ref_id是连接账号与业务实体的桥梁学生登录后系统用ref_id去student表取姓名、班级教师同理。enrollment表的唯一索引uk_stu_course是防重复选课的最后一道防线应用层也要判断但数据库约束不能省。score字段允许为 NULL表示“已选课但未出成绩”这和默认值 0 有本质区别——热搜里有人问mysql设置默认值为0在成绩场景下如果默认 0会把“未考试”和“考了 0 分”混为一谈这是教务系统里典型的语义坑。2.3 登录后动态加载界面的实现思路Qt 端不需要为每个角色编译不同版本。主窗口用一个QStackedWidget登录成功后根据role字段决定加载哪个页面组合。管理员加载用户管理、课程管理、排课面板教师加载成绩录入、我的课程学生加载选课、成绩查询。菜单栏用QAction动态添加权限判断集中在登录响应里做一次后续页面不再重复校验角色。// 登录成功后根据角色构建菜单 void MainWindow::buildMenuByRole(const QString role) { menuBar()-clear(); if (role admin) { menuBar()-addMenu(tr(用户管理)); menuBar()-addMenu(tr(课程管理)); menuBar()-addMenu(tr(排课管理)); } else if (role teacher) { menuBar()-addMenu(tr(我的课程)); menuBar()-addMenu(tr(成绩录入)); } else if (role student) { menuBar()-addMenu(tr(选课中心)); menuBar()-addMenu(tr(成绩查询)); } // 状态栏显示当前角色方便调试 statusBar()-showMessage(tr(当前角色%1).arg(role)); }这段代码的关键点是“清空再重建”。如果用户注销后换账号登录旧菜单必须清掉否则会出现学生账号看到管理员菜单的权限泄漏。statusBar显示角色是调试期的习惯上线前可以去掉但保留也不影响功能。权限校验不能只靠界面隐藏。比如学生端没有“成绩录入”菜单但如果有人直接用 SQL 工具连数据库依然能改成绩。所以教师录入成绩的接口里必须再查一次当前登录用户的role和ref_id确认这门课确实由该教师授课。界面隐藏是体验后端校验是安全两者都要有。3. 环境搭建与数据库落地从安装到跑通第一条查询3.1 MySQL 安装配置与建库建表的最小命令集Windows 上装 MySQL 最省事的方式是下载官方 installer安装时勾选 “MySQL Server” 和 “MySQL Workbench”。Linux 上我一般用包管理器Ubuntu 下就是apt install mysql-server。安装完成后第一件事是设置 root 密码并创建专用账号不要让应用直接用 root 连库。# Ubuntu 下初始化并启动 MySQL sudo apt update sudo apt install mysql-server -y sudo systemctl start mysql sudo systemctl enable mysql # 安全初始化设置 root 密码、移除匿名用户 sudo mysql_secure_installation # 登录后创建教务专用库和账号 sudo mysql -u root -pCREATE DATABASE edu_system DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER edu_applocalhost IDENTIFIED BY StrongPass_2024; GRANT SELECT, INSERT, UPDATE, DELETE ON edu_system.* TO edu_applocalhost; FLUSH PRIVILEGES;utf8mb4而不是utf8是因为 MySQL 的utf8实际只支持 3 字节存中文姓名没问题但存某些生僻字或 emoji 会报错。utf8mb4_unicode_ci排序规则对中文更友好。专用账号只给增删改查权限不给DROP和GRANT这样即使应用被注入损失也可控。热搜里error 2002 (hy000): cant connect to local mysql server through socket /tmp...是 Linux 下最常见的报错原因通常是 MySQL 服务没启动或者 socket 文件路径不对。先systemctl status mysql看服务状态再用mysqladmin -u root -p status确认能连上。如果 socket 路径确实变了在连接命令里加--socket/var/run/mysqld/mysqld.sock显式指定。3.2 Qt 连接 MySQL 的驱动编译与连接代码Qt 默认不带 MySQL 驱动需要自己编译qsqlmysql插件。Windows 下用 Qt Maintenance Tool 通常能直接勾选安装Linux 下如果报QMYSQL driver not loaded就得手动编译。编译前确认已安装libmysqlclient-dev然后在 Qt 源码的sqldrivers/mysql目录下执行qmake和make。# Linux 下编译 Qt MySQL 驱动以 Qt 5.15 为例 sudo apt install libmysqlclient-dev -y cd /path/to/Qt/5.15.2/Src/qtbase/src/plugins/sqldrivers qmake -- MYSQL_INCDIR/usr/include/mysql MYSQL_LIBDIR/usr/lib/x86_64-linux-gnu make -j4 sudo make install编译完成后把生成的libqsqlmysql.so放到 Qt 的plugins/sqldrivers目录。验证方法是写一段最小连接代码看QSqlDatabase::drivers()里有没有QMYSQL。#include QSqlDatabase #include QSqlQuery #include QSqlError #include QDebug bool connectDb() { QSqlDatabase db QSqlDatabase::addDatabase(QMYSQL); db.setHostName(127.0.0.1); db.setPort(3306); db.setDatabaseName(edu_system); db.setUserName(edu_app); db.setPassword(StrongPass_2024); // 连接超时设 5 秒避免界面卡死 db.setConnectOptions(MYSQL_OPT_CONNECT_TIMEOUT5); if (!db.open()) { qDebug() 连接失败 db.lastError().text(); return false; } qDebug() 驱动列表 QSqlDatabase::drivers(); return true; }setConnectOptions里的超时参数很关键。默认情况下如果 MySQL 服务没启动db.open()会阻塞很久界面直接假死。设 5 秒后失败会快速返回配合QMessageBox提示用户检查数据库服务。lastError().text()会给出具体原因比如密码错误、库不存在、驱动未加载比笼统的“连接失败”有用得多。3.3 用 QSqlTableModel 快速搭出可编辑表格Qt 的QSqlTableModel是教务系统里最省力的工具。它把数据库表直接映射成模型配合QTableView就能实现增删改查不需要手写每一列的读取和写入。管理员维护课程信息时用这个组合十分钟就能出一个可用界面。// 课程管理表格管理员可编辑学生只读 QSqlTableModel *model new QSqlTableModel(this, db); model-setTable(course); model-setEditStrategy(QSqlTableModel::OnManualSubmit); // 手动提交避免误改 model-select(); QTableView *view new QTableView; view-setModel(model); view-setSelectionMode(QAbstractItemView::SingleSelection); view-horizontalHeader()-setStretchLastSection(true); // 如果是学生角色隐藏编辑按钮并设为只读 if (currentRole student) { view-setEditTriggers(QAbstractItemView::NoEditTriggers); }OnManualSubmit策略意味着用户改完单元格后不会立即写库需要点“保存”按钮才提交。这在教务场景下很重要老师录入一个班的成绩时中途可能改错立即提交会导致频繁写库手动提交可以一次性model-submitAll()。如果提交失败model-lastError()会给出哪一行哪一列违反约束比如学号重复、外键不存在。学生角色设为NoEditTriggers只是界面层限制真正的安全还是靠数据库账号权限——edu_app账号有 UPDATE 权限所以如果学生端代码有漏洞依然可能改数据。更严格的做法是给学生端单独一个只读账号但那样连接管理会复杂一些。中小规模部署下界面限制加后端校验通常够用。4. 多角色核心功能实现选课、成绩与排课冲突检测4.1 选课事务如何防止并发超选选课是教务系统里并发最高的操作。假设一门课容量 50 人在开放选课的瞬间可能有上百个请求同时到达。如果代码写成“先查余量再插入”两个请求可能都查到余量 1然后都插入结果 51 人。解决办法是把“查余量”和“插入”放进一个事务并用SELECT ... FOR UPDATE锁住课程行。-- 选课事务锁行 检查余量 插入 更新余量 START TRANSACTION; SELECT capacity, enrolled FROM course WHERE id ? FOR UPDATE; -- 应用层判断 enrolled capacity否则 ROLLBACK INSERT INTO enrollment (student_id, course_id) VALUES (?, ?); UPDATE course SET enrolled enrolled 1 WHERE id ?; COMMIT;FOR UPDATE会在事务提交前锁住这一行其他事务的SELECT ... FOR UPDATE会等待。这样余量检查就是串行的不会超选。代价是并发性能下降但选课场景下每门课的竞争窗口很短实际影响可接受。如果课程量很大可以考虑用 Redis 预减库存但那是另一个量级的架构桌面端教务系统用不上。Qt 端执行事务时注意QSqlDatabase::transaction()和commit()要成对出现中间任何一步失败都要rollback()。我习惯把选课逻辑封装成一个函数返回枚举值表示成功、已满、重复选课、数据库错误界面根据返回值弹不同提示。enum EnrollResult { Success, Full, Duplicate, DbError }; EnrollResult enrollCourse(int studentId, int courseId) { QSqlDatabase::database().transaction(); QSqlQuery q; q.prepare(SELECT capacity, enrolled FROM course WHERE id? FOR UPDATE); q.addBindValue(courseId); if (!q.exec() || !q.next()) { QSqlDatabase::database().rollback(); return DbError; } int cap q.value(0).toInt(), enr q.value(1).toInt(); if (enr cap) { QSqlDatabase::database().rollback(); return Full; } q.prepare(INSERT INTO enrollment (student_id, course_id) VALUES (?,?)); q.addBindValue(studentId); q.addBindValue(courseId); if (!q.exec()) { QSqlDatabase::database().rollback(); // 唯一索引冲突返回 Duplicate return q.lastError().nativeErrorCode() 1062 ? Duplicate : DbError; } q.prepare(UPDATE course SET enrolledenrolled1 WHERE id?); q.addBindValue(courseId); if (!q.exec()) { QSqlDatabase::database().rollback(); return DbError; } QSqlDatabase::database().commit(); return Success; }nativeErrorCode() 1062是 MySQL 唯一索引冲突的错误码。捕获它并返回Duplicate比在插入前先查一遍“是否已选”更可靠——查一遍再插入之间仍有并发窗口而唯一索引是数据库层面的硬约束。4.2 成绩录入的批量提交与校验教师录入成绩时界面通常是一个表格列出选了这门课的所有学生教师在“成绩”列填分数。这里有两个坑一是成绩范围校验0-100二是批量提交时部分失败的处理。我一般用QSqlTableModel的OnManualSubmit教师填完后点“提交”逐行校验全部通过才submitAll()。bool submitScores(QSqlTableModel *model) { for (int row 0; row model-rowCount(); row) { QVariant scoreVar model-data(model-index(row, 3)); // 成绩列 if (scoreVar.isNull()) continue; // 未录入的跳过 bool ok; double score scoreVar.toDouble(ok); if (!ok || score 0 || score 100) { QMessageBox::warning(nullptr, 校验失败, QString(第 %1 行成绩无效%2).arg(row 1).arg(scoreVar.toString())); return false; } } if (!model-submitAll()) { QMessageBox::critical(nullptr, 提交失败, model-lastError().text()); model-revertAll(); return false; } return true; }revertAll()在提交失败时把模型恢复到上次提交的状态避免界面显示的数据和数据库不一致。lastError().text()通常会指出哪一行违反了约束比如成绩字段类型不匹配。如果教师中途关闭窗口未提交的修改会丢失所以关闭前要检查model-isDirty()并提示保存。4.3 排课冲突检测时间与教室的双重约束排课冲突检测的核心是判断“同一时间段内同一教室或同一教师是否被占用”。数据库层面schedule表存course_id、teacher_id、classroom_id、day_of_week、start_section、end_section。冲突检测就是查是否存在一条记录满足教室相同或教师相同且节次区间有重叠。-- 检测排课冲突返回冲突记录数 SELECT COUNT(*) FROM schedule WHERE day_of_week ? AND (classroom_id ? OR teacher_id ?) AND start_section ? -- 新排课的结束节次 AND end_section ?; -- 新排课的开始节次节次重叠的判断条件是start_section new_end AND end_section new_start这是区间重叠的标准写法。如果返回大于 0说明有冲突界面要提示具体是哪门课、哪位教师冲突。Qt 端可以在排课对话框里实时调用这个查询用户选择教室和时间后立即反馈而不是等到保存时才报错。热搜里mysql存储过程和mysql声明存储过程在排课场景下可以用但我不推荐把冲突检测写成存储过程。原因是业务规则可能频繁调整比如增加“连排课不能跨午休”存储过程修改和调试都比应用层代码麻烦。把逻辑放在 Qt 端用 SQL 查询做数据支撑更灵活。5. 避坑与排查QtMySQL 教务系统最常见的五类翻车5.1 驱动加载失败QMYSQL driver not loaded现象程序启动后连接数据库db.open()返回 falselastError().text()显示 “QMYSQL driver not loaded”。QSqlDatabase::drivers()列表里没有QMYSQL。原因Qt 安装时没有勾选 MySQL 驱动或者 Linux 下编译的驱动版本与当前 Qt 版本不匹配。热搜里qt.qpa.plugin: could not find the qt platform plugin linuxfb是同类问题只是插件类型不同。解决先确认plugins/sqldrivers目录下有没有libqsqlmysql.soLinux或qsqlmysql.dllWindows。没有就按 3.2 节编译。有但加载失败用ldd libqsqlmysql.so检查依赖的libmysqlclient是否找到。如果报cannot mix incompatible qt library说明驱动是用另一个 Qt 版本编译的必须用当前 Qt 的 qmake 重新编译。5.2 中文乱码数据库、连接、界面三处编码不一致现象学生姓名在数据库里正常Qt 表格里显示问号或方块。原因MySQL 库或表的字符集不是utf8mb4或者 Qt 连接时没有指定编码。Qt 5 默认用 UTF-8但 MySQL 驱动可能按 Latin1 解释。解决建库时用DEFAULT CHARSET utf8mb4。连接后立即执行SET NAMES utf8mb4;。Qt 端源码文件保存为 UTF-8QString内部是 UTF-16交给驱动时会转成 UTF-8。三处一致后乱码消失。如果历史数据已经乱码用ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4;修复但修复前备份。5.3 界面卡死主线程执行长查询现象点击“查询成绩”后界面无响应几秒后才恢复。原因QSqlQuery::exec()是阻塞调用在主线程执行大表查询或复杂 JOIN 时事件循环被卡住界面无法重绘。解决把查询放到QThread或QtConcurrent::run里查询完成后通过信号槽把结果传回主线程更新界面。注意数据库连接不能跨线程共享每个线程要单独addDatabase并指定不同的连接名。如果查询确实很快小于 100ms可以接受主线程执行但要在查询前把光标设为Qt::WaitCursor给用户反馈。5.4 选课超选事务没加锁或隔离级别不对现象课程容量 50实际选了 52 人。原因选课逻辑没有用FOR UPDATE或者用了但事务隔离级别是READ COMMITTED以下导致两个事务都读到旧余量。解决确认SELECT ... FOR UPDATE在事务内执行且 MySQL 隔离级别为REPEATABLE READ默认值。如果用了连接池确保同一个事务用的是同一个连接。Qt 的QSqlDatabase::transaction()作用于当前连接跨连接的事务不生效。测试方法开两个客户端同时选最后一门课只有一个成功。5.5 发布后连不上客户端没有 MySQL 运行库现象开发机运行正常拷贝到机房电脑后提示驱动加载失败。原因目标机器没有安装 MySQL 客户端库libmysql.dll或libmysqlclient.so缺失。解决Windows 下把libmysql.dll和libssl相关 DLL 一起放到 exe 同目录。Linux 下用ldd检查依赖缺失的库要么打包进 AppImage要么在目标机器安装。Qt 官方部署工具windeployqt不会自动拷贝 MySQL 驱动需要手动把sqldrivers/qsqlmysql.dll复制到发布目录的sqldrivers子目录。6. 进阶技巧用 QChart 做成绩分布图与一个我常犯的错成绩录入完成后教师往往想看班级的分数分布。Qt 的QChart模块可以画柱状图或饼图配合QChartView嵌入界面。数据来源就是enrollment表按分数段GROUP BY的查询结果。// 按分数段统计人数0-59, 60-69, 70-79, 80-89, 90-100 QSqlQuery q(SELECT SUM(score60), SUM(score60 AND score70), SUM(score70 AND score80), SUM(score80 AND score90), SUM(score90) FROM enrollment WHERE course_id? AND score IS NOT NULL); q.addBindValue(courseId); q.exec(); q.next(); QBarSet *set new QBarSet(人数); *set q.value(0).toInt() q.value(1).toInt() q.value(2).toInt() q.value(3).toInt() q.value(4).toInt(); QBarSeries *series new QBarSeries(); series-append(set); QChart *chart new QChart(); chart-addSeries(series); chart-setTitle(成绩分布); chart-createDefaultAxes(); QChartView *chartView new QChartView(chart); chartView-setRenderHint(QPainter::Antialiasing);SUM(score60)在 MySQL 里会返回满足条件的行数因为布尔表达式在数值上下文里是 1 或 0。这个写法比COUNT(CASE WHEN ...)简洁但要注意score IS NOT NULL必须加否则 NULL 会被当成 0 计入不及格段。热搜里qchart实现图片缩放qt提到的缩放可以通过QChartView::setRubberBand(QChartView::RectangleRubberBand)开启框选放大再配合右键菜单重置。我常犯的一个错是在QChart里直接绑定QSqlTableModel的数据而不是用聚合查询。结果每次刷新图表都要把整张enrollment表拉到内存几百个学生还行几千个就明显卡顿。后来改成在 SQL 里做聚合只返回五个数字图表刷新瞬间完成。这个习惯也适用于其他统计场景——能在数据库里算的不要拉到客户端算。另一个教训是关于密码存储。早期版本我用 MD5 存密码后来发现 MD5 已经不安全改成 SHA-256 加盐。但加盐后登录查询不能再用WHERE password_hash SHA2(?)必须先把用户输入的密码加盐哈希再和数据库里的值比对。这个改动涉及注册、登录、改密三个接口漏一个就会导致部分用户无法登录。改密码逻辑时我习惯把哈希函数单独封装所有地方调用同一个函数避免不一致。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
Acrobat Pro动作向导:PDF批量处理与JavaScript自动化实战指南 1. 这不是“点一下就完事”的魔法,而是 Acrobat Pro 里最被低估的生产力核弹 你有没有过这种经历:手头堆着 87 份合同扫描件,每份都要加水印、转黑白、压缩到 2MB 以内、再重命名成“客户名_签约日期_版本号”;或者刚收完 200 份学… · 2026/9/26 18:58:00
DeepSeek桌面版实操指南:本地部署、量化推理与GUI集成 1. 这不是“一键安装”,而是真正能跑起来的 DeepSeek 桌面版实操指南你搜到的标题里写着“一键安装”,但现实是:DeepSeek 官方从未发布过任何 Windows/macOS/Linux 原生桌面客户端。所谓“DeepSeek 桌面版”,本质是开发者或社区基… · 2026/9/26 18:58:00
AI编程提效实测:Trae核心功能解析,把代码交给AI的正确姿势 最近大半年,AI编程工具几乎是换代一样地涌出来,Cursor、Windsurf、Copilot各有各的热闹。我平时写代码,也改代码,自然跟着换了好几轮工具,直到认真用上Trae,才第一次体会到“把活整个交给AI”不是一句口号。… · 2026/9/26 18:58:00
AIUEBridge 实战:用自研 UE 插件 + MCP 服务打通虚幻编辑器 AI 协同开发 /* 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 19:37:33
MiniMax M2.1 首发评测:祖传屎山代码重构实战,这种爽感谁用谁懂 /* 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 19:37:27
开启新纪元:让牛马(NB的AI工具)——Aipy帮你干活,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 19:37:27
LLM 工程实践:从 LLM 到 RAG、Agent、MCP 的一体化配置与验证 /* 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 19:37:21
用Cursor / Trae AI 开发Go项目时,记得先做这些 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 19:37:21
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第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