基于安卓与SSM的学生签到系统:从扫码签到到出勤统计全流程
简介这是一套面向高校课程设计与移动开发初学者的安卓学生签到系统完整源码采用SSM后端与Android Studio前端组合开发适合需要完成课程作业、毕业设计或练手全栈项目的学生与开发者。资源包共3个文件包含2个rar压缩包与1个sql数据库脚本分别对应后端IDEA工程、Android客户端源码以及初始数据库文件整体约139MB解压后可直接导入开发工具运行调试。系统功能覆盖扫码签到、数字签到、定位签到三种模式并支持修改签到记录同时附带加课码选课功能便于还原真实课堂考勤与选课场景。目前已有837人学习下载读者可借此掌握SSM接口设计、安卓端网络请求与数据库建表思路快速搭建可运行的签到系统原型。1. 从纸质点名到扫码签到这套安卓签到系统到底能跑通什么如果你带过高校的课或者在公司里组织过培训一定经历过这样的场景上课铃响了五分钟还在拿着花名册挨个点名一节课四十五分钟点名去掉八分钟后排的学生代答“到”你根本分不清。更麻烦的是签到数据留在纸上期末想统计出勤率得对着几十张纸一张张数。这套基于安卓的学生签到系统解决的就是这个从“点名”到“数据沉淀”的完整链路。它不是一个只跑在手机上的孤立 App而是一套前后端分离的完整方案安卓端负责学生扫码或定位签到服务端负责生成签到码、记录时间戳、统计出勤管理端负责导出报表。技术栈上安卓端用 Android Studio 开发服务端基于 SSMSpring SpringMVC MyBatis框架开发工具是 IntelliJ IDEA。适合谁用正在做课程设计的学生、需要快速搭建一套签到原型的开发者以及想拿一个完整前后端项目练手的人。下面我从环境搭建开始一步步拆给你看。2. 环境搭建与项目结构把 SSM 后端和安卓端跑起来2.1 开发环境清单与版本选择这套项目涉及两个独立的开发环境服务端和安卓端。服务端用 IntelliJ IDEA Maven 构建安卓端用 Android Studio。很多人卡在第一步不是因为技术难而是版本对不上。我一般会先确认 JDK 版本SSM 项目在 JDK 8 和 JDK 11 上都能跑但如果你用的 Spring 版本较老JDK 17 可能会遇到反射相关的报错。安卓端这边Gradle 版本和 Android Studio 版本要匹配否则同步阶段就红一片。组件推荐版本说明JDK8 或 11服务端编译运行IntelliJ IDEA2021.3 及以上服务端开发Maven3.6依赖管理MySQL5.7 或 8.0数据存储Android Studio2021.1 及以上安卓端开发Gradle7.0安卓构建Tomcat8.5 或 9.0服务端部署选 MySQL 5.7 还是 8.0如果你的项目里用了GROUP BY的宽松模式5.7 默认兼容8.0 默认开启ONLY_FULL_GROUP_BY统计出勤率时可能会报错。我一般会在 8.0 的my.ini里把这个模式关掉或者改写 SQL 让字段都出现在GROUP BY里。2.2 服务端项目结构与核心配置服务端用标准的 SSM 分层结构包名按com.xxx.signin组织。核心目录结构如下signin-server/ ├── src/main/java/com/xxx/signin/ │ ├── controller/ # 接口层 │ ├── service/ # 业务逻辑 │ ├── mapper/ # MyBatis 映射接口 │ ├── entity/ # 实体类 │ └── util/ # 工具类 ├── src/main/resources/ │ ├── mapper/ # MyBatis XML │ ├── spring-dao.xml # 数据源配置 │ ├── spring-service.xml │ ├── spring-mvc.xml │ └── jdbc.properties └── pom.xmljdbc.properties里配置数据库连接注意useSSLfalse和serverTimezoneAsia/Shanghai这两个参数少了第一个会有安全警告少了第二个时间会差八小时签到时间戳直接错乱。jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/signin_db?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.passwordyour_passwordspring-dao.xml里配置数据源和 MyBatis 的SqlSessionFactory把mapper目录下的 XML 扫描进去。这里有个容易翻车的点mapper扫描路径如果写成classpath:mapper/*.xml打包后 XML 文件可能没被复制到target目录导致BindingException。稳妥做法是在pom.xml的build里加上资源目录配置。build resources resource directorysrc/main/resources/directory includes include**/*.xml/include include**/*.properties/include /includes /resource /resources /build这段配置的作用是确保resources下的 XML 和 properties 文件在编译时被复制到target/classes否则 MyBatis 找不到映射文件启动就报错。2.3 安卓端项目结构与网络配置安卓端在 Android Studio 里新建一个 Empty Activity 项目包名和服务端可以不同但接口地址要对应。核心目录app/src/main/java/com/xxx/signinapp/ ├── activity/ # 页面 ├── adapter/ # 列表适配器 ├── model/ # 数据模型 ├── network/ # 网络请求封装 └── util/ # 工具类网络请求用 OkHttp 或 Retrofit我一般用 OkHttp 加 Gson轻量够用。注意安卓 9.0 以后默认禁止明文 HTTP 请求如果你的服务端还没上 HTTPS需要在AndroidManifest.xml的application标签里加android:usesCleartextTraffictrue否则请求直接被系统拦截日志里只看到CLEARTEXT communication not permitted新手很容易在这里卡半天。application android:usesCleartextTraffictrue android:networkSecurityConfigxml/network_security_config ... /application更规范的做法是配一个network_security_config.xml只对特定域名放行明文而不是全局打开。但课程设计阶段全局打开更省事上线前再收紧。3. 签到核心逻辑二维码生成、定位校验与防代签3.1 签到码的生成与刷新机制签到码有两种常见方案一种是固定二维码贴在讲台上学生扫码签到另一种是教师端动态生成带时间戳的二维码每隔几秒刷新一次。固定二维码的问题是学生可以把码拍下来发给没来的人代签成本极低。动态二维码解决了这个问题但实现上要多做一步。服务端生成签到码的逻辑是教师发起签到 → 服务端生成一个 UUID 作为本次签到的sessionId→ 把sessionId和过期时间存入 Redis 或数据库 → 返回给教师端一个二维码内容通常是sessionId加上签名。学生扫码后把sessionId和学号传给服务端服务端校验sessionId是否有效、是否过期、该学号是否已签到。// 教师发起签到 PostMapping(/startSignIn) public Result startSignIn(RequestParam Integer courseId) { String sessionId UUID.randomUUID().toString().replace(-, ); long expireAt System.currentTimeMillis() 5 * 60 * 1000; // 5分钟有效 SignInSession session new SignInSession(); session.setSessionId(sessionId); session.setCourseId(courseId); session.setExpireAt(expireAt); signInSessionMapper.insert(session); return Result.success(sessionId); }这段代码的关键参数是expireAt我设的是 5 分钟。太短了学生还没扫完就过期太长了代签风险又上来。实际用的时候可以根据班级规模调整大班可以设 3 分钟小班 5 分钟足够。sessionId用 UUID 去掉横线避免二维码内容里出现特殊字符导致扫码解析异常。3.2 定位校验与距离计算如果签到不只用二维码还要校验学生是否在教室附近就需要用到定位。安卓端通过LocationManager或FusedLocationProviderClient获取经纬度传给服务端服务端计算学生位置和教室坐标的距离超过阈值就拒绝签到。// 服务端计算两点距离单位米 public static double getDistance(double lat1, double lng1, double lat2, double lng2) { double radLat1 Math.toRadians(lat1); double radLat2 Math.toRadians(lat2); double a radLat1 - radLat2; double b Math.toRadians(lng1) - Math.toRadians(lng2); double s 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2))); s s * 6371000; // 地球半径单位米 return Math.round(s * 10000.0) / 10000.0; }这个公式是 Haversine 公式6371000是地球平均半径。阈值我一般设 100 米因为 GPS 在室内漂移可能到 50 米以上设太小会导致明明在教室却签不上。如果教室在高层建筑里GPS 信号弱可以放宽到 200 米或者干脆只用二维码不校验定位。定位校验的另一个坑是安卓 6.0 以后需要动态申请ACCESS_FINE_LOCATION权限不申请直接调定位接口会返回空值而且不报错只是拿不到数据。3.3 防代签的几层校验防代签不能只靠一种手段我一般会叠三层第一层是动态二维码过期即失效第二层是设备绑定同一个设备不能给多个学号签到第三层是签到频率限制同一学号在短时间内不能重复签到。设备绑定的实现方式是在学生首次登录时把设备的ANDROID_ID或IMEI安卓 10 以后 IMEI 不可用改用ANDROID_ID和学号绑定签到请求里带上设备标识服务端校验该设备是否已经给其他学号签过到。ANDROID_ID在恢复出厂设置后会变但日常使用中足够稳定。// 获取设备标识 String deviceId Settings.Secure.getString(getContentResolver(), Settings.Secure.ANDROID_ID);签到频率限制用 Redis 的setnx实现key 是signin:limit:{studentId}过期时间设 60 秒。如果setnx返回 false说明 60 秒内已经签过直接拒绝。这样即使有人拿到了签到码也没法在短时间内批量代签。4. 数据统计与报表导出从签到记录到出勤率4.1 数据库表设计与索引优化签到系统的核心表有三张学生表、课程表、签到记录表。签到记录表的数据量增长最快一个班 50 人一学期 32 节课就是 1600 条记录多个班级叠加可能到几万条。所以索引必须提前建好。CREATE TABLE sign_in_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, student_id VARCHAR(20) NOT NULL, course_id INT NOT NULL, session_id VARCHAR(64) NOT NULL, sign_time DATETIME NOT NULL, status TINYINT DEFAULT 1 COMMENT 1正常 2迟到 3缺勤, device_id VARCHAR(64), INDEX idx_student_course (student_id, course_id), INDEX idx_session (session_id), INDEX idx_sign_time (sign_time) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;idx_student_course用于按学生和课程查询出勤记录idx_session用于按签到场次统计idx_sign_time用于按时间范围导出报表。注意status字段用TINYINT而不是VARCHAR省空间且比较快。device_id字段长度给 64因为ANDROID_ID是 64 位十六进制字符串。4.2 出勤率统计的 SQL 写法出勤率 实际签到次数 / 总签到场次。总签到场次从sign_in_session表里按课程统计实际签到次数从sign_in_record表里按学生和课程统计。一条 SQL 搞定SELECT s.student_id, s.student_name, COUNT(DISTINCT r.session_id) AS attended, (SELECT COUNT(*) FROM sign_in_session WHERE course_id #{courseId}) AS total, ROUND(COUNT(DISTINCT r.session_id) * 100.0 / (SELECT COUNT(*) FROM sign_in_session WHERE course_id #{courseId}), 2) AS rate FROM student s LEFT JOIN sign_in_record r ON s.student_id r.student_id AND r.course_id #{courseId} AND r.status 1 WHERE s.class_id #{classId} GROUP BY s.student_id, s.student_name ORDER BY rate ASC;这里用COUNT(DISTINCT r.session_id)而不是COUNT(*)是因为一个学生在一场签到里可能有多条记录比如先签失败后签成功去重后才准确。LEFT JOIN保证没签到的学生也会出现在结果里出勤率为 0。ORDER BY rate ASC让出勤率低的排在前面方便教师重点关注。4.3 报表导出与 Excel 生成导出报表用 Apache POI服务端生成 Excel 文件后返回给管理端下载。核心代码GetMapping(/export) public void export(HttpServletResponse response, RequestParam Integer courseId) throws IOException { ListAttendanceVO list signInService.getAttendanceList(courseId); XSSFWorkbook workbook new XSSFWorkbook(); XSSFSheet sheet workbook.createSheet(出勤统计); XSSFRow header sheet.createRow(0); String[] titles {学号, 姓名, 签到次数, 总场次, 出勤率}; for (int i 0; i titles.length; i) { header.createCell(i).setCellValue(titles[i]); } int rowNum 1; for (AttendanceVO vo : list) { XSSFRow row sheet.createRow(rowNum); row.createCell(0).setCellValue(vo.getStudentId()); row.createCell(1).setCellValue(vo.getStudentName()); row.createCell(2).setCellValue(vo.getAttended()); row.createCell(3).setCellValue(vo.getTotal()); row.createCell(4).setCellValue(vo.getRate() %); } response.setContentType(application/vnd.openxmlformats-officedocument.spreadsheetml.sheet); response.setHeader(Content-Disposition, attachment;filenameattendance.xlsx); workbook.write(response.getOutputStream()); workbook.close(); }XSSFWorkbook对应.xlsx格式HSSFWorkbook对应.xls。数据量大时用SXSSFWorkbook它是流式写入内存占用低。Content-Disposition里的文件名如果包含中文需要 URL 编码否则浏览器下载下来文件名是乱码。我一般写成filename*UTF-8加编码后的文件名。5. 避坑与排查那些让我熬夜的报错5.1 跨域请求被拦截现象安卓端请求服务端接口返回 403 或直接失败浏览器控制台报CORS policy。原因服务端和安卓端不在同一个域浏览器和安卓 WebView 都会触发跨域检查。解决在服务端加一个跨域过滤器或者用 Spring 的CrossOrigin注解。我一般写一个全局过滤器一劳永逸。WebFilter(/*) public class CorsFilter implements Filter { Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response (HttpServletResponse) res; response.setHeader(Access-Control-Allow-Origin, *); response.setHeader(Access-Control-Allow-Methods, GET,POST,PUT,DELETE,OPTIONS); response.setHeader(Access-Control-Allow-Headers, Content-Type,Authorization); chain.doFilter(req, res); } }注意Access-Control-Allow-Origin设成*在携带 Cookie 时会失效如果项目用了 Session 保持登录态需要把*改成具体的前端域名并且加上Access-Control-Allow-Credentials: true。5.2 时间差八小时现象签到记录里的时间和实际时间差八小时。原因MySQL 的serverTimezone没配或者 JDBC URL 里没加时区参数。解决在jdbc.url里加serverTimezoneAsia/Shanghai同时检查 MySQL 服务器的time_zone变量。如果服务端和数据库不在同一台机器还要确认两台机器的系统时间是否同步。5.3 二维码扫描后无响应现象学生扫码后 App 没反应或者一直转圈。原因二维码内容里带了换行符或特殊字符安卓端解析失败或者扫码后的网络请求超时。解决生成二维码时对内容做 URL 编码扫码后先解码再解析。网络请求超时时间设 10 秒超时后给用户明确提示而不是一直转圈。5.4 定位权限被拒绝后无提示现象学生点了签到App 没反应也没报错。原因安卓 6.0 以后定位权限需要动态申请代码里没处理权限回调直接调定位接口返回空值。解决在Activity里重写onRequestPermissionsResult权限被拒绝时弹 Toast 提示用户去设置里手动开启。if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) ! PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1); }5.5 MyBatis 映射文件找不到现象启动报BindingException: Invalid bound statement (not found)。原因mapperXML 文件没被编译到target/classes下或者namespace和接口全限定名不一致。解决检查pom.xml的资源目录配置确认 XML 文件在target/classes/mapper下存在。如果用的是 IDEA还要检查Settings → Build → Compiler里有没有排除 XML 文件。6. 进阶技巧把签到系统做成可复用的组件这套系统跑通之后我习惯把它拆成可复用的组件下次做类似项目直接拿过来改。第一个技巧是把签到逻辑抽成一个独立的SignInService不依赖具体的课程和班级只接收sessionId和studentId这样换一个业务场景比如活动签到、会议签到只需要改上层调用核心逻辑不动。第二个技巧是用 Redis 缓存签到场次信息而不是每次都查数据库。教师发起签到后把sessionId、courseId、expireAt写入 Redis设置过期时间。学生签到时先查 Redis命中就直接校验没命中再查数据库。这样在高并发场景下比如 200 人同时扫码数据库压力小很多。// Redis 缓存签到场次 redisTemplate.opsForValue().set(signin:session: sessionId, session, 5, TimeUnit.MINUTES);第三个技巧是给签到接口加限流。用 Redis 的INCR加过期时间实现简单的计数器同一个 IP 每分钟最多请求 30 次超过就返回 429。这样即使有人写脚本刷签到也能挡住大部分。最后一个技巧是关于数据归档的。签到记录表用久了会很大我一般会在每学期结束后把上学期的记录导出到历史表主表只保留当前学期的数据。归档用INSERT INTO ... SELECT加DELETE实现注意在事务里操作避免中途失败导致数据丢失。从那以后我每次做签到类项目都会先把 Redis 缓存和限流加上再去做业务逻辑。因为等到几百人同时扫码的时候再补就不是改几行代码的事了。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

5G NR小区搜索中的PSS-SSS联合检测与polar译码仿真

5G NR小区搜索中的PSS-SSS联合检测与polar译码仿真

简介:基于polar编解码的PSS-SSS联合检测仿真资源,面向通信方向本硕博教研与学习人群,用于掌握polar编解码算法及PSS-SSS联合检测流程。资源基于MATLAB实现,输出联合检测成功率、误码率BER与误块率BLER等关键指标,可作为…

2026/10/12 17:33:57 阅读更多 →
Agent工程化实战:插件化架构与可回放日志实现精准调试

Agent工程化实战:插件化架构与可回放日志实现精准调试

如果你也正经维护过一个Agent项目,大概率体会过这种深夜心态:Demo跑得飞起,一进真实场景就翻车,而且你根本说不清是模型抽风、工具调用错了、还是上下文被某轮脏数据悄悄污染了。我的DeepSeek Harness框架,初衷就是把这…

2026/10/12 17:32:56 阅读更多 →
ADO2.20 Class 封装实战:连接字符串、参数化查询与事务避坑指南

ADO2.20 Class 封装实战:连接字符串、参数化查询与事务避坑指南

简介:ADO2.20 Class 是一套面向 Visual C 开发者的 ActiveX Data Objects 类库,由非中文开发者在 CodeProject 上发布,旨在简化 VC 程序对 SQL Server、Oracle、Access 等数据源的访问,让开发者无需深入底层 ADO 接口即可完成数据…

2026/10/12 17:32:56 阅读更多 →

最新新闻

Redis Cluster集群搭建实战:3主3从配置、故障转移与运维避坑指南

Redis Cluster集群搭建实战:3主3从配置、故障转移与运维避坑指南

1. 从单机到集群:为什么我们要折腾Redis ClusterRedis单机性能再强,也扛不住数据量持续膨胀和单点故障带来的双重压力。我见过太多项目一开始用单实例跑得好好的,业务量一上来,内存告警、主从切换失败、写入阻塞全来了。Redis Clu…

2026/10/12 21:47:48 阅读更多 →
BosonNLP情感词典实战:Python情感分析代码与避坑指南

BosonNLP情感词典实战:Python情感分析代码与避坑指南

简介:这份资源面向希望快速上手中文情感分析的开发者与数据科学学习者,提供了一套基于BosonNLP情感词典的完整示例代码,可用于舆情监控、评论挖掘、用户反馈分类等场景。代码流程覆盖读入BosonNLP情感词典与停用词表、用pandas读取.xlsx待分析…

2026/10/12 21:47:48 阅读更多 →
模板题与Special Judge:语义等价性与判定鲁棒性设计

模板题与Special Judge:语义等价性与判定鲁棒性设计

1. 为什么模板题和Special Judge不是“加个if判断”就能搞定的事在LPOJ这类在线判题系统里,很多人第一次接触“模板题”和“Special Judge”时,下意识会觉得:不就是让程序输出固定格式的字符串,或者写个校验函数比对答案对错吗&am…

2026/10/12 21:47:48 阅读更多 →
一人公司内容获客:五工位AI工作流,告别工具堆叠

一人公司内容获客:五工位AI工作流,告别工具堆叠

1. 一人公司做内容获客,为什么“工具堆叠”反而拖垮效率一个人撑起一家公司,最稀缺的从来不是想法,而是能稳定产出的时间。我见过太多独立开发者、自由职业者、小工作室主理人,电脑里躺着十几个AI工具:写文案的、做图的…

2026/10/12 21:47:48 阅读更多 →
PointNet点云语义分割实战:VKITTI3D数据训练与避坑全记录

PointNet点云语义分割实战:VKITTI3D数据训练与避坑全记录

简介:面向点云语义分割与三维视觉入门者,提供基于PointNet在虚拟KITTI数据集上完成3D语义分割的完整工程,涵盖数据说明、训练主流程与可视化脚本,适合希望复现经典PointNet流程、理解XYZRGBL七维点云特征的读者。压缩包共54个文件…

2026/10/12 21:47:48 阅读更多 →
Python函数参数设计实战:位置参数、默认参数、可变参数与关键字参数详解

Python函数参数设计实战:位置参数、默认参数、可变参数与关键字参数详解

1. 从一次函数调用报错说起:为什么参数设计值得单独拎出来讲刚带新人的时候,我特别喜欢观察他们写函数的习惯。有个很典型的场景:某同学写了一个计算订单折扣的函数,参数列表里塞了七八个参数,调用的时候全靠位置硬怼。…

2026/10/12 21:46:47 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式: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/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →