简介这是一套基于JavaWeb的学生成绩管理系统完整项目源码面向计算机相关专业正在做毕设的学生以及需要项目实战练习的Java学习者可直接作为毕业设计使用。系统采用B/S结构后台基于JSP、Servlet与JDBC技术以MySQL作为数据库开发环境涉及JDK、Eclipse和Tomcat。功能覆盖学生基本信息管理、教师基本信息管理、班级信息管理、课程信息管理、成绩信息管理、系统设置以及考勤管理七大模块并区分学生、教师、管理员三种角色支持按不同条件查询、成绩导入统计汇总与考勤统计展示。资源包共3个文件包含项目源码压缩包、数据库脚本sql文件及项目说明txt文档整体约6.38MB结构清晰、便于快速部署运行。项目经过严格调试确保可以运行界面美观、操作简单、功能齐全具有较高的实际应用价值。目前已有7845人学习下载适合需要完整毕设方案与实战参考的读者。1. 从一份能跑通的 JavaWeb 学生成绩管理系统说起如果你正在翻毕设选题看到「基于JavaWeb的学生成绩管理系统」这个标题大概率心里有两层疑问一是这东西到底能不能在两周内跑起来二是答辩时老师问「你这系统有什么技术含量」该怎么接。我带过几届学生的课程设计也帮人改过不少 JavaWeb 项目说句实在话成绩管理系统本身业务不复杂真正卡人的从来不是增删改查而是环境配置、数据库脚本导入、以及 JSP 和 Servlet 之间那套请求转发链路。很多人拿到一份项目源码IDEA 一打开满屏红Tomcat 一启动就报 404最后只能放弃。这篇笔记就围绕「项目源码 数据库脚本」这个组合把一套典型 JavaWeb 成绩管理系统从环境搭建、脚本导入、核心模块实现到排错完整走一遍。适合两类人零基础想照着复现的以及已经有一份源码但跑不起来的。我不会假设你手上是某个特定仓库的代码而是按这个方向最常见的实现方式来写你对照自己的项目改路径和包名即可。核心词 JavaWeb、学生成绩管理系统、数据库脚本会反复出现在关键步骤里因为这三样就是整个毕设的骨架。2. 环境与数据库脚本把项目跑起来的第一道关2.1 为什么 JavaWeb 项目总在环境这一步翻车JavaWeb 和纯 Java 控制台程序最大的区别是它依赖一个 Servlet 容器通常是 Tomcat。你的代码不是自己main方法启动的而是被 Tomcat 加载、由容器调用 Servlet。这就带来三个连锁依赖JDK 版本、Tomcat 版本、Servlet API 版本必须互相兼容。常见做法是 JDK 8 或 JDK 11 配 Tomcat 8.5 或 9Servlet 用 3.1 或 4.0。如果你用 JDK 17 去配 Tomcat 8启动时可能直接抛UnsupportedClassVersionError这就是版本不匹配的典型翻车现场。第二个坑是项目结构。IDEA 里创建 JavaWeb 项目很多人分不清src和web目录的关系。src放 Java 代码编译后进WEB-INF/classesweb目录放 JSP、HTML、CSS以及WEB-INF/web.xml。如果你把 JSP 放错位置或者web.xml里 Servlet 映射写错访问就是 404。我一般会先确认三件事web.xml的url-pattern、Servlet 类的WebServlet注解如果用了注解、以及 Tomcat 部署时Application context路径。这三者对不上页面就出不来。第三个坑是数据库脚本。标题里专门写了「数据库脚本」说明它是项目的一部分。脚本通常包含建库、建表、插入初始数据三部分。很多人直接复制粘贴到 Navicat 或 MySQL 命令行结果因为字符集、外键顺序、字段类型报错。下面我给出一套典型的学生成绩管理系统表结构脚本你可以对照自己的改。2.2 数据库脚本长什么样建表与初始数据一份能直接跑的成绩管理系统脚本核心表一般四张学生表、课程表、成绩表、用户表管理员/教师登录用。下面这段 SQL 是常见写法字段名和类型你可以按自己项目调整。-- 创建数据库字符集用 utf8mb4避免中文乱码 CREATE DATABASE IF NOT EXISTS score_manager DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; USE score_manager; -- 学生表学号做主键姓名、班级、专业 CREATE TABLE student ( stu_id VARCHAR(20) NOT NULL COMMENT 学号, stu_name VARCHAR(50) NOT NULL COMMENT 姓名, class_name VARCHAR(50) DEFAULT NULL COMMENT 班级, major VARCHAR(50) DEFAULT NULL COMMENT 专业, PRIMARY KEY (stu_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 课程表课程号做主键课程名、学分、授课教师 CREATE TABLE course ( course_id VARCHAR(20) NOT NULL COMMENT 课程号, course_name VARCHAR(50) NOT NULL COMMENT 课程名, credit DECIMAL(3,1) DEFAULT NULL COMMENT 学分, teacher VARCHAR(50) DEFAULT NULL COMMENT 授课教师, PRIMARY KEY (course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 成绩表联合主键学生课程唯一 CREATE TABLE score ( stu_id VARCHAR(20) NOT NULL, course_id VARCHAR(20) NOT NULL, score DECIMAL(5,1) DEFAULT NULL COMMENT 成绩, exam_time DATE DEFAULT NULL COMMENT 考试时间, PRIMARY KEY (stu_id, course_id), CONSTRAINT fk_score_stu FOREIGN KEY (stu_id) REFERENCES student(stu_id), CONSTRAINT fk_score_course FOREIGN KEY (course_id) REFERENCES course(course_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 用户表登录用role 区分管理员和教师 CREATE TABLE sys_user ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, role VARCHAR(20) DEFAULT teacher COMMENT admin/teacher ) ENGINEInnoDB DEFAULT CHARSETutf8mb4; -- 初始数据至少插一个管理员否则登录不进去 INSERT INTO sys_user (username, password, role) VALUES (admin, 123456, admin); INSERT INTO student (stu_id, stu_name, class_name, major) VALUES (2024001, 张三, 计科2401, 计算机科学与技术), (2024002, 李四, 计科2401, 计算机科学与技术); INSERT INTO course (course_id, course_name, credit, teacher) VALUES (C001, Java程序设计, 4.0, 王老师), (C002, 数据库原理, 3.0, 刘老师); INSERT INTO score (stu_id, course_id, score, exam_time) VALUES (2024001, C001, 88.5, 2024-06-20), (2024002, C001, 76.0, 2024-06-20);这段脚本的逻辑说明先建库再建表建表顺序必须是student、course在前score在后因为score有外键指向它们。如果你先建score会报Cannot add foreign key constraint。参数上utf8mb4是为了支持中文和特殊字符DECIMAL(5,1)表示成绩最多 5 位、保留 1 位小数够用且不会出现浮点误差。初始数据里必须有一条sys_user记录否则你登录页面输什么都没用。提示导入脚本时如果用的是 MySQL 命令行先source或直接粘贴如果用 Navicat注意「运行 SQL 文件」和「运行 SQL 语句」的区别前者适合整份脚本后者适合单条调试。2.3 在 IDEA 里把项目跑起来的最小步骤环境配好、脚本导入后接下来是让 Tomcat 认识你的项目。下面这套步骤是我自己常用的按顺序做基本不会出大问题。第一步IDEA 里File - Project Structure - Modules确认src被标记为 Sourcesweb被标记为 Web Resource Directory并且web.xml路径指向web/WEB-INF/web.xml。第二步Artifacts里新建一个Web Application: Exploded把Available Elements里的库和模块都加到WEB-INF/lib和classes下。第三步Run - Edit Configurations新增 Tomcat LocalDeployment里加上刚才的 ArtifactApplication context设成/score或/。第四步启动 Tomcat浏览器访问http://localhost:8080/score/login.jsp。如果你访问 404先看 Tomcat 日志里项目有没有部署成功如果 500看异常栈多半是数据库连接失败或 Servlet 类找不到。数据库连接配置一般在src下的db.properties或工具类里常见写法是jdbc:mysql://localhost:3306/score_manager?useSSLfalseserverTimezoneAsia/Shanghai用户名密码填你本地的。这里serverTimezone不写MySQL 8 会报时区错误这是血泪经验。3. 核心模块登录、成绩录入与查询的 Servlet JSP 链路3.1 登录模块从表单到 Session 的完整请求流成绩管理系统的入口是登录。典型流程是login.jsp提交表单到LoginServletServlet 拿username和password去sys_user表查查到了把用户信息放进HttpSession然后重定向到主页面查不到就转发回登录页并带错误提示。这条链路里最容易错的是中文乱码和doGet/doPost混用。下面是一个常见的LoginServlet写法用 JDBC 直连不引框架符合大多数 JavaWeb 毕设的形态。WebServlet(/login) public class LoginServlet extends HttpServlet { Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 设置请求和响应编码防止中文乱码 req.setCharacterEncoding(UTF-8); resp.setContentType(text/html;charsetUTF-8); String username req.getParameter(username); String password req.getParameter(password); try (Connection conn DBUtil.getConnection()) { String sql SELECT user_id, username, role FROM sys_user WHERE username? AND password?; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, username); ps.setString(2, password); ResultSet rs ps.executeQuery(); if (rs.next()) { // 登录成功写入 Session HttpSession session req.getSession(); session.setAttribute(userId, rs.getInt(user_id)); session.setAttribute(username, rs.getString(username)); session.setAttribute(role, rs.getString(role)); resp.sendRedirect(req.getContextPath() /index.jsp); } else { // 登录失败带回错误信息转发 req.setAttribute(msg, 用户名或密码错误); req.getRequestDispatcher(/login.jsp).forward(req, resp); } } catch (SQLException e) { throw new ServletException(数据库查询失败, e); } } }逻辑说明doPost里先设编码再取参数然后用PreparedStatement防 SQL 注入。查到记录后把userId、username、role放进 Session后续页面用session.getAttribute(username)显示当前用户。参数上req.getContextPath()返回项目上下文路径比如/score这样重定向不会丢路径。失败时用forward而不是redirect因为要保留req里的错误消息。注意如果你在login.jsp里用 GET 提交而 Servlet 只写了doPost就会报 405。检查form methodpost和 Servlet 方法是否对应。3.2 成绩录入与查询JSP 展示 Servlet 处理的分工成绩模块一般分两块教师录入成绩学生或管理员查询成绩。录入页面score_add.jsp提供学生学号、课程号、成绩三个输入框提交到ScoreAddServletServlet 先校验学号和课程号是否存在再插入score表。查询页面score_list.jsp则通过ScoreListServlet从数据库拉全部成绩用 JSTL 或脚本片段遍历展示。下面这段是查询 Servlet 的核心返回ListMapString,Object给 JSP。WebServlet(/scoreList) public class ScoreListServlet extends HttpServlet { Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ListMapString, Object list new ArrayList(); String sql SELECT s.stu_id, st.stu_name, s.course_id, c.course_name, s.score FROM score s JOIN student st ON s.stu_id st.stu_id JOIN course c ON s.course_id c.course_id ORDER BY s.stu_id, s.course_id; try (Connection conn DBUtil.getConnection(); PreparedStatement ps conn.prepareStatement(sql); ResultSet rs ps.executeQuery()) { while (rs.next()) { MapString, Object row new HashMap(); row.put(stuId, rs.getString(stu_id)); row.put(stuName, rs.getString(stu_name)); row.put(courseId, rs.getString(course_id)); row.put(courseName, rs.getString(course_name)); row.put(score, rs.getBigDecimal(score)); list.add(row); } } catch (SQLException e) { throw new ServletException(查询成绩失败, e); } req.setAttribute(scoreList, list); req.getRequestDispatcher(/score_list.jsp).forward(req, resp); } }逻辑说明这里用JOIN把三张表连起来一次查出学号、姓名、课程名、成绩避免 JSP 里再查数据库。参数上getBigDecimal对应DECIMAL类型比getDouble更精确。forward把scoreList放进请求域JSP 里用c:forEach遍历即可。如果你项目里用的是Statement拼接 SQL建议改成PreparedStatement这是答辩时老师常问的点。JSP 侧展示时常见写法是引入 JSTL 标签库然后循环输出表格行。如果你项目里没有 JSTL 依赖需要在WEB-INF/lib下放jstl.jar和standard.jar否则c:forEach不生效页面会直接报错。3.3 数据库连接工具类别把连接写死在每个 Servlet 里上面两个 Servlet 都用了DBUtil.getConnection()这是一个工具类负责加载驱动、拿连接。很多毕设项目把 JDBC 代码复制到每个 Servlet改数据库密码时要改十几处这是典型的可维护性差。正确做法是抽一个DBUtil用静态代码块加载驱动配置文件放db.properties。public class DBUtil { private static String url; private static String user; private static String password; static { try (InputStream in DBUtil.class.getClassLoader() .getResourceAsStream(db.properties)) { Properties props new Properties(); props.load(in); url props.getProperty(jdbc.url); user props.getProperty(jdbc.user); 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, user, password); } }逻辑说明静态代码块只执行一次加载db.properties并注册驱动。db.properties放在src根目录编译后进classesgetResourceAsStream能直接读到。参数上jdbc.url里带上useUnicodetruecharacterEncodingutf8可以进一步防乱码。这个工具类虽然简单但它是整个系统数据库访问的入口答辩时能说清楚「为什么用配置文件而不是硬编码」是个加分项。4. 避坑与排查那些让毕设卡三天的具体问题4.1 启动报 ClassNotFoundException: com.mysql.cj.jdbc.Driver现象Tomcat 启动或第一次访问数据库时控制台抛ClassNotFoundException提示找不到 MySQL 驱动。原因MySQL 8 的驱动类名是com.mysql.cj.jdbc.Driver而很多老教程写的是com.mysql.jdbc.Driver另外驱动 jar 没放进WEB-INF/libTomcat 找不到。解决确认db.properties里jdbc.drivercom.mysql.cj.jdbc.Driver并把mysql-connector-java-8.x.jar复制到web/WEB-INF/lib下同时在 IDEA 的 Artifact 里确认该 jar 被包含。4.2 页面中文变成问号或乱码现象JSP 页面显示的中文全是???或者表单提交后数据库里存的是乱码。原因三个环节都可能出问题——JSP 文件本身的编码、请求/响应编码、数据库和表的字符集。解决JSP 顶部加% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %Servlet 里req.setCharacterEncoding(UTF-8)和resp.setContentType(text/html;charsetUTF-8)数据库和表用utf8mb4。三处都对齐乱码基本消失。4.3 外键约束导致插入成绩失败现象录入成绩时抛Cannot add or update a child row: a foreign key constraint fails。原因score表的外键要求stu_id和course_id必须在student和course表里存在你输入的学号或课程号是数据库里没有的。解决录入前先查一下学生表和课程表或者在前端用下拉框从数据库加载学号和课程号而不是让用户手输。这也是答辩时能体现「业务校验」的点。4.4 Tomcat 启动后访问 404日志却显示部署成功现象Tomcat 控制台没有报错但浏览器访问http://localhost:8080/score/login.jsp返回 404。原因Application context配错或者 JSP 实际不在web根目录下或者web.xml里welcome-file-list指向的文件不存在。解决在 IDEA 的 Tomcat 配置里看Deployment的Application context确认访问路径在项目结构里确认login.jsp位于web目录下检查web.xml的url-pattern和实际 Servlet 映射是否一致。4.5 修改代码后页面没变化现象改了 JSP 或 Servlet重启 Tomcat 后页面还是旧的。原因IDEA 的 Artifact 没有重新构建或者浏览器缓存了旧页面。解决Build - Rebuild Project然后在 Tomcat 配置里确认On Update action设为Update classes and resources。浏览器用CtrlF5强制刷新。这个坑不致命但很耗时间尤其是答辩前改样式的时候。5. 让成绩管理系统更像一个「系统」分页、导出与权限控制5.1 用 LIMIT 做分页别一次查全表成绩数据一多score_list.jsp一次查全表会又慢又卡。常见做法是在ScoreListServlet里接收page和pageSize参数用 MySQL 的LIMIT做分页。下面是一个分页查询的写法同时返回总记录数用于计算总页数。int page req.getParameter(page) null ? 1 : Integer.parseInt(req.getParameter(page)); int pageSize 10; int offset (page - 1) * pageSize; // 查总数 String countSql SELECT COUNT(*) FROM score; // 查当前页 String listSql SELECT s.stu_id, st.stu_name, s.course_id, c.course_name, s.score FROM score s JOIN student st ON s.stu_idst.stu_id JOIN course c ON s.course_idc.course_id ORDER BY s.stu_id LIMIT ? OFFSET ?;参数说明page从 1 开始offset是跳过的行数LIMIT ? OFFSET ?是 MySQL 的写法。JSP 底部渲染上一页/下一页链接把page传回去。这个功能不复杂但能让你的系统从「能跑」变成「像个正经系统」答辩时演示分页效果很直观。5.2 用 Session Filter 做登录拦截现在你的系统里任何人直接访问score_list.jsp都能看到成绩这显然不合理。常见做法是写一个LoginFilter拦截所有请求检查 Session 里有没有userId没有就跳回登录页。下面是一个过滤器示例。WebFilter(/*) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request (HttpServletRequest) req; HttpServletResponse response (HttpServletResponse) resp; String uri request.getRequestURI(); // 放行登录页、登录接口和静态资源 if (uri.endsWith(login.jsp) || uri.endsWith(/login) || uri.contains(/css/) || uri.contains(/js/)) { chain.doFilter(req, resp); return; } HttpSession session request.getSession(false); if (session ! null session.getAttribute(userId) ! null) { chain.doFilter(req, resp); } else { response.sendRedirect(request.getContextPath() /login.jsp); } } }逻辑说明WebFilter(/*)拦截所有路径白名单放行登录相关和静态资源其余检查 Session。参数上request.getSession(false)表示不新建 Session避免给未登录用户创建会话。这个过滤器加上后你的系统就有了最基本的权限控制答辩时能讲清楚「未登录不能访问业务页面」这个安全点。5.3 成绩导出 Excel用 POI 还是 CSV很多成绩管理系统会加一个「导出成绩」功能。常见做法有两种用 Apache POI 生成.xlsx或者直接写 CSV。POI 功能强但依赖多CSV 简单但 Excel 打开中文可能乱码。如果你只是毕设演示我一般建议用 CSV加一个 UTF-8 BOM 头就能解决中文问题。下面是一个 CSV 导出的核心写法。resp.setContentType(text/csv;charsetUTF-8); resp.setHeader(Content-Disposition, attachment;filenamescores.csv); // 写 BOM让 Excel 正确识别 UTF-8 resp.getOutputStream().write(new byte[]{(byte)0xEF, (byte)0xBB, (byte)0xBF}); PrintWriter writer resp.getWriter(); writer.println(学号,姓名,课程号,课程名,成绩); for (MapString, Object row : list) { writer.println(row.get(stuId) , row.get(stuName) , row.get(courseId) , row.get(courseName) , row.get(score)); } writer.flush();参数说明Content-Disposition里的attachment表示下载而不是在浏览器打开filename是默认文件名。BOM 那三个字节是给 Excel 看的不加的话中文列名会乱码。这个功能代码量不大但演示效果好属于性价比很高的加分项。5.4 一个我自己的习惯先跑通再优化带过这么多毕设我最大的体会是不要一上来就想着加 Redis、加 Spring Boot、加前后端分离。JavaWeb 成绩管理系统的核心价值在于你能把 Servlet、JSP、JDBC、Session、Filter 这条链路讲清楚而不是堆技术栈。我一般会先把登录、录入、查询三个功能跑通数据库脚本能一键导入然后再考虑分页和导出。这样即使时间紧你也有一个完整可演示的系统。希望帮到你。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
云服务器购买指南:官网与代理商价格、账号归属与售后全解析 第一次买云服务器的人,基本上都会经历同一个困惑:官网价格明明摆在那里,代理商却总说能更便宜。你去问一句,对方回你一个比官网低不少的价格,附带一句“新用户专享价,走我们链接下单就行”。这时候你心里肯… · 2026/9/24 19:00:15
30个高频Linux命令,构建开发工作流实战速查 1. 这份清单是怎么圈出来的:不是背命令,是搭工作流很多刚接触Linux开发的朋友,第一次面对终端时的感受都是:命令太多了,根本记不住。网上随便一搜就是“Linux命令大全”“上千条命令整理”,翻完反而更慌&am… · 2026/9/24 19:00:15
百兆宽带够用吗?从单位换算到路由器排查的完整指南 上周有个朋友发消息问我:“家里刚升了千兆宽带,Steam下载怎么才11MB/s,是不是运营商骗我?”我一看这个数字,第一反应不是替他骂运营商,而是恭喜他:11MB/s,恰好就是百兆宽带跑满的理论… · 2026/9/24 19:00:15
Word打开显示只读的6大原因与精准修复方案 1. 为什么Word一打开就“锁住”了?这不是Bug,是系统在悄悄告诉你某些事 你双击一个Word文档,界面右上角赫然写着“只读”,编辑光标变成灰色,CtrlS毫无反应——这种瞬间被剥夺编辑权的体验,几乎每个办公族都… · 2026/9/24 19:35:49
WinPE启动盘制作与Windows纯净安装实战指南 1. 这不是“装系统”,是重建你对Windows底层控制权的起点很多人点开这个标题,第一反应是:“我又不是电脑小白,还用得着学PE?”——这话我十年前也说过。直到某天凌晨三点,客户服务器蓝屏报错0x0000007B&… · 2026/9/24 19:35:49
VS Code Python解释器选择与虚拟环境配置完全指南 昨天有个刚转Python的同事跑过来,脸色很不好看:“我在VS Code里明明选了Python 3.11解释器,为什么跑起来还是老版本?装OpenCV也一直报错,网上搜了半天都说是解释器问题,可我选的就是对的啊。”我看了一眼他… · 2026/9/24 19:35:49
VECM向量误差修正模型实战:从协整检验到滚动监控的Python落地指南 简介:这份资源面向宏观经济与金融时间序列分析的学习者和研究者,聚焦向量误差修正模型(VECM)的MATLAB实现,用于处理多变量非平稳数据间的长期均衡与短期调整关系。压缩包共4个文件,均为m脚本,整… · 2026/9/24 19:35:49
ByteBuddy泛型签名陷阱:同名T并非同一个变量 前阵子在一个基于 ByteBuddy 的动态 DAO 框架里做泛型返回类型解析,我踩了一个非常隐蔽的坑。日志里没有任何异常,没有 NPE,也没有 ClassCastException,只有反射拿回来的泛型信息完全不符合预期。更抓狂的是:方法上有个… · 2026/9/24 19:35:43
JupyterLab迁移指南:多文件管理、代码补全与内核管理实践 把 Jupyter Notebook 换成 JupyterLab 这件事,我拖了很久,真上手之后才后悔没早点做。JupyterLab 是 Notebook 官方的下一代工作台,在同一个网页界面里集成了 notebook、代码编辑器、终端和文件管理,专门解决 Notebook 在项目变大… · 2026/9/24 19:35:43
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44