如果你正打算做课堂考勤这个课题或者已经被老师分配了这个题目你先别急着去网上找代码直接改。这个题目看着经典但越经典的题目越容易做成一锅粥功能东拼西凑、前后端接口对不上、论文和代码说的是两套东西。我这两年陆续带过几个用 SSM Vue 做课堂考勤的毕设项目踩过不少坑也总结出了一套还算靠谱的落地路径。这篇就把完整思路、表结构、核心签到逻辑、Vue 端配置、论文写法、联调部署一次说清楚适合本科毕设、课程设计也适合想快速搭出一套前后端分离考勤系统的人。1. 内容整体设计与选题思路1.1 课堂考勤系统到底要做哪些事先别动代码把需求盘清楚。课堂考勤系统的核心角色一般是三类管理员、教师、学生。管理员管理教师信息、学生信息、课程信息生成统计报表系统日志查看。教师创建课程、发起一次签到、查看某个班某次课的到课情况、期末导出出勤率。学生查看自己已选课程、进行课堂签到、提交请假申请、查看个人考勤记录。功能上最常见的做法是教师端开启签到生成一个签到码或二维码学生输入签到码或扫码完成签到后端记录签到时间、签到方式、地理位置可选等并计算是否迟到。在此基础上还可以扩展请假审批、补签申请、考勤统计图表、邮件通知、课表管理等功能。毕设项目不建议贪多核心闭环做好再挑两个扩展点做亮就足够支撑论文的“创新点”章节了。1.2 为什么是 SSM Vue 而不直接上 Spring Boot先说结论从纯技术角度看Spring Boot 确实更省事自动配置、内嵌 Tomcat几分钟能跑起来。但毕业设计是学术评价的一部分很多院校的评分标准里明确要求展现“对各层框架的理解”。SSMSpring Spring MVC MyBatis的优势在于分层非常清楚Controller、Service、Mapper 各司其职论文中画架构图、数据流图都更好画。配置文件是显式的你对数据库连接、事务管理、Mapper 扫描都看得见摸得着答辩被问“讲讲这个配置是干嘛的”也不容易慌。参考资源多网上 SSM 整合案例、报错解决方案比某些偏门框架丰富得多。Vue 作为前端框架原因是更直白的前后端分离是当前主流Vue 生态成熟Vue Router、Vuex/Pinia 都有大量实践文章。而且 Vue 对新手友好比 React 的学习曲线稍缓热重载也快页面改完立马能看到效果。这里补充一点如果你导师不限制技术栈Spring Boot Vue 做起来更顺手论文里一样能写“Spring 家族技术”。但如果你用的就是 SSM请务必把 web.xml、spring-mvc.xml、spring-mybatis.xml 这几份配置吃透答辩几乎必问。1.3 前后端分离架构的边界划分SSM Vue 的项目天然是前后端分离的后端只提供 RESTful 接口返回 JSON前端用 Vue 组件渲染页面通过 Axios 发异步请求。在设计阶段就要把边界划好不然联调的时候会互相甩锅。我的习惯是后端接口统一以 /api 开头例如 /api/user/login、/api/attendance/start。所有返回数据统一用 { code, message, data } 这种结构包装。状态码约定清楚200 成功、401 未登录、403 无权限、500 服务器异常。前端不做业务逻辑判断只负责把后端返回的 code 翻译成用户能看懂的语言。这样约定之后前后端可以并行开发。后端用 Postman 测接口前端用 Mock 数据先画页面最后联调时只要关注字段对没对上省掉大量 Debug 时间。2. 后端 SSM 框架整合与核心业务实现2.1 SSM 整合的核心配置SSM 整合的关键就三份 XML 配置加一个 web.xml但很多人在这块卡住。先说 maven 依赖pom.xml 里除了 spring-webmvc、mybatis、mybatis-spring、mysql-connector-java务必加上 druid 连接池和 jackson-databind不然返回 JSON 会报错。spring-mybatis.xml 里主要配数据源、SqlSessionFactory、Mapper 扫描器和事务管理器。一个比较常规且不会出错的写法如下context:property-placeholder locationclasspath:jdbc.properties/ bean iddataSource classcom.alibaba.druid.pool.DruidDataSource property namedriverClassName value${jdbc.driver}/ property nameurl value${jdbc.url}/ property nameusername value${jdbc.username}/ property namepassword value${jdbc.password}/ /bean bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean property namedataSource refdataSource/ property nametypeAliasesPackage valuecom.example.entity/ property namemapperLocations valueclasspath:mapper/*.xml/ /bean bean classorg.mybatis.spring.mapper.MapperScannerConfigurer property namebasePackage valuecom.example.dao/ /bean bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManager property namedataSource refdataSource/ /bean tx:annotation-driven transaction-managertransactionManager/spring-mvc.xml 里核心是开启注解驱动和组件扫描同时把静态资源和 JSON 消息转换器配好mvc:annotation-driven mvc:message-converters bean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter property nameobjectMapper refjacksonObjectMapper/ /bean /mvc:message-converters /mvc:annotation-driven context:component-scan base-packagecom.example.controller/很多同学踩过的一个坑是Spring 容器和 Spring MVC 容器重复扫描同一个包导致事务失效。正确做法是 Spring 的扫描排除 ControllerSpring MVC 的扫描只包含 Controller。2.2 数据库表设计考勤系统的表不用太复杂但一定要满足三范式并支持业务闭环。我常用的表设计如下表名核心字段说明t_userid, username, password, role, name, email统一用户表用 role 区分管理员/教师/学生t_courseid, course_name, teacher_id, start_time, end_time, location课程信息t_student_courseid, student_id, course_id学生选课关联表t_attendanceid, course_id, student_id, attendance_date, status, sign_time, sign_type考勤记录表t_leaveid, student_id, course_id, reason, status, apply_time请假表这里有个设计取舍学生和老师分开建表是很多教程的做法但增量扩展和权限判断比较麻烦。我习惯用一张 t_user 表加 role 字段前端菜单和接口权限都用 role 控制后续加管理员角色也方便。考勤表里的 status 建议用整数存储0 代表缺勤1 代表正常2 代表迟到3 代表请假。用整数存的优势是统计 SQL 好写例如统计某门课到课率时直接 SUM(status 1) 就行。sign_type 可以记为 1 表示扫码签到2 表示输入签到码3 表示教师代签这个字段主要是为了论文里写“支持多种签到方式”时有数据支撑。建表时还要注意给 course_id 和 student_id 建联合索引否则后面统计报表时数据量稍大就会出现慢查询。别笑我的一个学生就是因为没建索引到答辩演示的时候查一次考勤统计等了三四秒场面一度很尴尬。2.3 签到核心逻辑与接口实现签到的核心逻辑并不复杂但必须考虑边界情况。教师发起签到时后端生成一个 4 到 6 位的随机签到码设置有效时长默认 5 分钟存入 Redis 或内存缓存。学生提交签到码时后端做以下判断public Result startSign(Integer courseId, Integer teacherId, int duration) { Course course courseDao.selectById(courseId); if (course null || !course.getTeacherId().equals(teacherId)) { return Result.error(课程不存在或无权操作); } String signCode String.valueOf((int) ((Math.random() * 9 1) * 1000)); // 实际开发中用 redis 存储key 为 sign: courseIdvalue 为签到码 signCache.put(courseId, signCode, duration); return Result.success(签到已开启, signCode); }学生提交签到接口除了校验签到码是否正确还要判断当前时间是否在有效范围内以及该学生是否已经签到过防止重复提交public Result doSign(Integer courseId, Integer studentId, String signCode) { String cacheCode signCache.get(courseId); if (cacheCode null) { return Result.error(签到已结束); } if (!cacheCode.equals(signCode)) { return Result.error(签到码错误); } int count attendanceDao.countToday(courseId, studentId); if (count 0) { return Result.error(您已签到请勿重复提交); } Attendance record new Attendance(); record.setCourseId(courseId); record.setStudentId(studentId); record.setAttendanceDate(new Date()); record.setSignTime(new Date()); // 判断是否迟到课程开始时间前5分钟到课程开始后20分钟内算正常 record.setStatus(judgeStatus(courseId)); record.setSignType(1); attendanceDao.insert(record); return Result.success(签到成功); }关于“迟到”判定别在代码里写死规则。因为不同学校对迟到的定义不一样我建议把这个规则放到配置表或者课程表的字段里由教师创建课程时设定比如“上课前5分钟到上课后15分钟内都算正常”。这样论文里还能多写一个“灵活考勤规则设置”的功能点答辩时能讲的东西一下子又多了一个。3. 前端 Vue 环境搭建与功能实现3.1 Vue 环境配置和项目创建前端这一块很多同学上来就卡在环境上。首先要确保本机装了 Node.js建议装 LTS 版本作者经常看到有人因为 Node 版本过新导致 node-sass 装不上然后整个人心态崩掉。装完 Node 之后npm 会自动带上然后把 npm 源切到国内镜像装依赖能快一大半npm config set registry https://registry.npmmirror.comVue CLI 创建项目或者直接用 Vite 都可以。如果你用的教材和网课是 Vue CLI 那一套建议按 Vue CLI 来因为报错案例多资料好查npm install -g vue/cli vue create attendance-web创建过程中会让你选预设选 Manually select features然后勾选 Babel、Router、Vuex、CSS Pre-processors。创建完成后进入目录再装 Axios 和 Element UI或 Element Plus取决于你 Vue 是 2 还是 3。这里我提醒一下很多教学楼 Wi-Fi 环境下载慢装依赖报错大概率是网络问题清理缓存重试或者换镜像源千万不要一股脑去卸了重装。安装完成后熟悉一下目录结构。src/router 里配置路由src/api 里封装接口请求src/views 里放页面组件。还有一个细节Vue Devtools 插件一定要装调试组件状态和路由跳转能省一半时间作者见过太多学生用 console.log 调试响应式数据最后被搞崩溃的。3.2 路由设计与登录鉴权考勤系统按角色分页面所以路由要区分管理员、教师、学生三种视角。我的做法是登录页是公开路由。登录成功之后根据返回的 role 字段动态拼接该角色对应的路由表用router.addRoutes动态添加Vue 3 里是router.addRoute。全局前置守卫里统一判断没有 token 就跳登录页有 token 但访问的路由不在当前角色权限内就跳 403 页。router.beforeEach((to, from, next) { const token sessionStorage.getItem(token) if (to.path /login) { next() } else if (!token) { next(/login) } else { next() } })这里要注意一个坑动态路由配合路由守卫时刷新页面会导致动态添加的路由丢失所以刷新后要重新拉取用户信息并重新挂载路由。常见的解决办法是把用户信息和路由表缓存到 sessionStorage刷新时先读缓存再 addRoute。3.3 Axios 封装与跨域问题Axios 封装的核心有两点统一处理请求头里的 token统一处理 HTTP 错误和业务错误。我常用的一个封装模板import axios from axios import router from /router const service axios.create({ baseURL: process.env.VUE_APP_BASE_API, timeout: 10000 }) service.interceptors.request.use(config { const token sessionStorage.getItem(token) if (token) { config.headers[Authorization] token } return config }) service.interceptors.response.use( response { const res response.data if (res.code ! 200) { if (res.code 401) { router.push(/login) } return Promise.reject(new Error(res.message)) } return res }, error { return Promise.reject(error) } ) export default service跨域问题是前后端分离项目的必经之路。后端就是 SSM 的项目最简单的方式是在 Controller 或拦截器里统一加 CORS 响应头或者直接用 Spring MVC 的CrossOrigin注解。但我建议前后端联调阶段使用 vue.config.js 里的 devServer.proxy 做代理这样浏览器看到的请求是同源的省去很多跨域带来的奇奇怪怪的问题devServer: { proxy: { /api: { target: http://localhost:8080, changeOrigin: true } } }这样配置之后前端代码里请求 /api/xxx 就会转发到后端的 localhost:8080。等部署上线时再把后端接口放到同一域名下或者用 Nginx 反向代理前端代码基本不用改。3.4 考勤签到页和统计报表页实现签到页是学生最重要的页面。我的实现思路是页面加载时调用后端 /api/attendance/current 接口查询当前用户所有正在签到中的课程。每条课程显示课程名称、教师、上课地点、签到剩余时间旁边放一个“签到”按钮。点击签到后弹窗让用户输入签到码提交到 /api/attendance/sign。签到成功后按钮置灰并显示签到成功的时间防止短时间重复点击造成重复提交。页面上的倒计时可以用 setInterval 实现但要注意在组件销毁时清除定时器否则页面切走之后回调依然在执行控制台报错不说还容易造成内存泄漏。统计报表页面建议用 ECharts 画柱状图和饼图柱状图展示某门课最近 10 次课的出勤人数变化饼图展示某次课的正常/迟到/缺勤/请假占比。ECharts 的引入方式不复杂直接 npm 安装后在组件里引入即可但要注意图表容器需要有明确的高度否则图表渲染不出来这个是新手高频踩坑点。4. 论文架构与撰写方法4.1 论文章节结构与每个章节该写什么毕设论文一般都不少于 1.5 万字常见的结构是章节内容建议篇幅摘要系统背景、主要功能、采用技术、测试结果300字左右第1章 绪论课题背景与意义、国内外研究现状、主要工作2000字以上第2章 需求分析可行性分析、功能需求、非功能需求、用例图2500字以上第3章 系统设计架构设计、功能模块设计、数据库设计、E-R图3000字以上第4章 系统实现各模块实现截图、核心代码片段、关键逻辑说明3500字以上第5章 系统测试测试环境、功能测试用例表、界面测试、性能测试1500字以上总结与展望系统解决了什么问题、还存在哪些不足、后续方向800字左右很多同学容易把第4章写成代码粘贴大会一整页整页贴代码导师看一眼就烦。正确做法是每个功能模块先放截图再贴 10 到 20 行核心代码然后用自然语言解释这段代码解决了什么问题。比如签到模块贴判断签到码和重复签到的那段逻辑就够了不要从 Controller 到 Mapper 全贴一遍。需求分析章节里用例图、类图、流程图是重头戏。用 Visio、ProcessOn 或者 draw.io 画清楚即可注意画图风格统一别一个图是黑白的一个图是彩色的这些细节评审老师很在意。4.2 论文与代码如何保证一致我见过最离谱的情况是论文里数据库表有 8 张实际代码里只建了 5 张论文里写了“支持签到码和二维码两种签到方式”代码里只有签到码输入框论文的架构图画的是 Spring Boot Redis代码却是纯 SSM。这种硬伤在答辩时被老师翻出来基本等于提前送命。我的建议是论文和开发同步进行不要等代码写完了再补论文。开发每完成一个模块就顺手把该模块的截图、表结构、核心逻辑写进论文草稿里。等开发完成论文的初稿其实就已经成型了大半后面只需要润色和补充测试章节就行。另外论文中的每个功能点都必须在代码里能找到对应实现代码里的每个核心类都要能在论文的模块设计里找到位置。哪怕是一些很小的功能比如“教师可以导出 Excel 考勤表”论文设计章节写了代码里就一定要有这个导出按钮不然就是给自己挖坑。4.3 答辩演示准备的几个要点答辩演示环节比很多人想象的重要作者听过太多“功能做好了但演示翻车”的案例。几个经验准备一套干净的演示数据不要用测试时插入的“测试1”“测试2”这类脏数据。演示前把数据库恢复到初始状态各项数据要看起来真实、规整。提前把各角色账号准备好管理员账号、教师账号、学生账号各一个密码统一设成容易输入的别在台上因为密码打错被卡住。演示流程要提前走三遍以上尤其是“教师发起签到 - 学生扫码签到 - 教师查看统计”这条主线流程确保每一步都不会因为网络慢、缓存过期等情况挂掉。万一演示时后端崩了代码层面临时修不好还有一个终极大法把所有核心页面截图放进 PPT 里说“这是我在本地环境的执行效果”虽然有点投机取巧但至少不会在台上冷场。还有一个答辩高频问题要提前准备“你的系统和其他考勤系统相比有什么优势或创新点”如果你没做算法、没做大数据分析就老老实实回答“本系统在业务流程上覆盖了课内考勤、请假、补签、统计的完整闭环并在界面交互上针对三种角色进行了设计优化”比硬吹“基于人工智能的考勤分析”靠谱得多。5. 前后端联调、部署与常见问题排查5.1 前后端联调的常见卡点前后端联调阶段大部分时间不是在写代码而是在对着接口文档核对字段。最常见的问题后端返回的时间是 Date 对象前端拿到的是时间戳字符串显示格式不对。解决办法是后端在实体类的日期字段上加上JsonFormat(pattern yyyy-MM-dd HH:mm:ss)注解。后端接口返回的字段用的是下划线命名如 student_name前端 JSON 里用的是驼峰命名studentName导致页面渲染为空。解决办法是 MyBatis 配置里开启mapUnderscoreToCamelCase或者在接口统一转一次。分页查询时前端传 pageNum 和 pageSize后端返回的 total 是总数但是前端忘了在表格组件里配置 total 的来源导致分页组件总显示 1 页。这类问题只要提前约定好返回结构就不会出现。我的习惯是写接口时同时维护一份简单的接口文档不用 Swagger 那么重用 Markdown 或者在代码注释里写好也行至少包含 URL、请求参数、返回示例。有了这个文档前后端并行开发时基本不会因为字段名反复扯皮。5.2 部署打包和环境问题速查项目做完了要提交或者部署到服务器后端打成 war 包丢进 Tomcat或者打成 jar 包直接因为有内嵌容器。但如果你用的是传统 SSM 外部 Tomcat注意以下这些点数据库连接配置不要写死 root 密码在代码里建议放到 jdbc.properties部署时只改配置文件就行。文件上传功能如果是写在本地磁盘部署到服务器后要留意目录是否存在、权限是否足够否则上传图片会静默失败。前端npm run build打成静态文件后直接放到 Tomcat 的 webapps 下也可以但刷新页面会出现 404因为 Vue Router 用的是 history 模式。解决办法有两个一是把模式改成 hash二是给 Tomcat 手动配置一个转发规则。毕设场景我建议直接用 hash 模式虽然地址栏多一个 # 号但省心很多。下面把作者和学生实际操作中遇到的典型问题整理成一个速查表直接照着排查就行现象可能原因解决办法后端启动时报端口被占用8080 端口被其他程序占用改 Tomcat 端口或杀掉占用进程启动时报 ClassNotFoundExceptionMaven 依赖缺失或版本冲突执行 mvn clean package 后重新导入检查依赖树连接数据库报 Access denied数据库账号密码错误或权限不足核对 jdbc.properties本地 MySQL 重启后重试MyBatis 查询结果全是 null表字段与实体类属性对不上开启 mapUnderscoreToCamelCase 或使用别名前端 npm install 报错Node 版本太高或太低、网络问题使用 LTS 版本切换镜像源删除 node_modules 重装跨域请求被拦截后端未加 CORS 配置使用 devServer proxy 或后端加 CrossOrigin前端页面空白路由配置错误、js 引入路径不对检查控制台报错确认 publicPath 配置idea 里 import 的包标红Maven 没有自动导入依赖Maven 面板点击 Reload All Projects5.3 线上演示环境的备份与回滚毕设答辩前最好把项目完整跑在一个稳定的演示环境里。我的经验是数据库一定要提前备份导出 SQL 文件放到网盘或者 U 盘。答辩现场经常会发生老师随意点了几个按钮把测试数据改乱或者删掉的情况如果数据库没备份当场恢复数据非常狼狈。备份数据库就一条命令的事mysqldump -u root -p attendance_db attendance_backup.sql恢复也简单把备份文件导进去就行。另外演示环境建议禁用“删除成绩”“清空考勤”这类高风险按钮或者至少加一个二次确认弹窗。这不是逃避问题而是降低演示出错概率的合理设计。还有一个小细节代码里所有涉及本地绝对路径的地方比如图片上传路径、日志目录都改成相对路径或者通过配置读取。否则换一台电脑运行项目这些莫名其妙的地方就会报错还不好排查。最后分享一点个人经验毕设做课堂考勤这个题最大的陷阱不是技术难度而是“一眼看去太简单”。我建议你在完成基础功能之后至少增加一个有区分度的扩展点比如导出月考勤汇总 Excel、课程维度的出勤趋势图表、迟到早退规则自定义、课表导入解析或者按班级批量导入学生名单。这些功能工作量不算大但能让你的系统从“例子”变成“作品”论文里的亮点更充分答辩时也更有底气。选题常见不要紧能让一个常见题目做出完整的工程质量和清晰的业务闭环本身就是合格毕业设计的标准。
企业数字化 ERP 产品动态
相关推荐
Flutter动画实战:10种高频交互动画方案与性能优化指南 做Flutter开发这些年,动画一直是我觉得投入产出比最高的部分。同样是完成一个页面,加了动效和没加动效,用户的感知完全是两回事。但动画也是最容易翻车的地方,要么卡顿掉帧,要么跟设计稿差之千里,要么一热重… · 2026/9/24 20:30:32
SpringCloud整合Dubbo实战:从Feign替换到Nacos配置全指南 先说一个我亲身经历的判断:在微服务改造的中后期,很多团队都会走到“SpringCloud 整合 Dubbo”这一步,但这不是纯粹的技术选型问题,而是对既有治理体系和通信模型的重新权衡。我最近在一个交易中台项目里,把核心链路上… · 2026/9/24 20:30:32
V100老卡跑27B模型:从4 tok/s到64 tok/s的推理调优实录 先交代一下背景:我手头有一块老旧的 Tesla V100 32GB,PCIE 版,没有 NVLink,单纯是上次项目淘汰下来的卡。本来想用它跑 7B 模型凑合一下,结果发现手头刚好有一个 Qwen 27B 的模型需求。27B 听起来不大,但放… · 2026/9/24 20:30:32
基于YOLOv8的跌倒检测实战:数据集、训练与源码全解析 简介:这份资源面向计算机视觉初学者与安防场景开发者,提供一套可直接上手的跌倒检测完整方案,解决从数据到模型落地的全流程问题。压缩包共1438个文件,约78.41MB,其中1428张jpg图片构成跌倒与正常行为的数据集… · 2026/9/24 21:11:08
英伟达H200深度解析:141GB大显存如何破解大模型内存墙 实话说,第一次听到“英伟达H200”这个名字时,我几乎以为这就是H100的小改款,无非是显存加大一点、带宽提升一点,然后继续卖个高价。直到我真正在机房把H200插上、跑了几轮大模型推理和微调之后,才发现这个“小改款”藏… · 2026/9/24 21:11:08
Visa 虚拟卡是什么?与普通 Visa 信用卡的区别、原理和使用场景 在海外 SaaS、AI 工具、云服务和跨境支付场景里,经常会看到一个词:Visa 虚拟卡。很多人第一次接触时,会把它理解成“没有实体卡的信用卡”,或者认为它只是随机生成的一组 Visa 卡号。实际上,这两个理解都不准确。Visa … · 2026/9/24 21:11:08
CNN实战指南:卷积神经网络核心原理、训练调参与落地实践 我这几年做深度学习落地项目,接触最多的就是卷积神经网络(CNN)。不管你是刚看完理论教程准备动手跑第一个模型,还是已经在调参路上踩了一堆坑,这篇都值得你花几分钟看完。它是这个系列的进阶篇,重点讲清楚一… · 2026/9/24 21:11:08
图像中文描述与视觉注意力Demo:原理、复现与避坑指南 简介:面向计算机视觉与自然语言处理交叉领域的学习者,这份资源是基于PyTorch实现的图像中文描述生成项目,特别适合毕业设计、课程实践与入门进阶,完整覆盖图像特征提取、视觉注意力机制、序列建模和中文文本生成等核心环节&#x… · 2026/9/24 21:11:08
HR数字化落地指南:从选型到实施的全流程解析 很多HR团队看着每天都很忙,但月底一算,真正花在事务性工作上的时间可能占了七成。入职离职手续、考勤异常核对、薪酬核算、社保增减员、招聘简历筛选,这些事每一件单拎出来都不算难,可它们堆在一起,会不断挤压你本来应… · 2026/9/24 21:11:02
基于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