Java旅行攻略搭子社交系统源码解析:从架构到匹配算法
刚拿到这套Java旅行攻略搭子社交系统源码的时候我第一反应是“又是个社区加聊天的常规项目”但真正把代码翻完才发现它把“旅行攻略内容”和“搭子社交关系”这两条链路死死咬合在一起。很多开发者做社区时只做内容做社交时只做关系最后产品变成两个孤岛。这套源码最值得读的地方恰恰是它怎么用一套数据模型同时支撑“找攻略”和“找人搭伙”两个需求。这篇文章我会从源码结构、核心模块实现、匹配算法、实时通讯再到缓存和并发坑点一条一条拆给你看适合正在做社区类项目或想学Java后端设计的人当参考。1. 系统定位与需求拆解攻略和搭子为什么必须放在一个系统里1.1 从“看完攻略没人同行”这个真实痛点切入单独做旅行攻略网站用户看完就走了攻略再精致也很难沉淀社交关系。单独做搭子社交没有内容支撑用户进来也只能干巴巴地发“周末有人去爬山吗”。这套系统把攻略和搭子打通逻辑非常朴素攻略是“去哪玩、怎么玩”的信息载体搭子是“跟谁去玩”的关系载体两者天然互补。我看源码里的用户故事写得很清楚一个用户发布一篇“杭州三日漫游”的攻略系统自动提取攻略中的景点、旅行偏好标签同时这个用户可以在攻略详情页发出“找搭子”的邀约。另一个用户搜到这篇攻略觉得行程匹配点击“申请同行”两个人建立搭子会话。这里的关键是——攻略不再只是静态文章它变成了一个可匹配的需求入口。1.2 核心实体与关键用例源码里的核心实体有五个角度的对象用户(User)包含昵称、头像、性别、常居城市、兴趣爱好标签列表。攻略(TravelNote)标题、正文、封面图、目的地、行程天数、人均预算、标签列表、状态。搭子关系(Companion)申请发起人、接收人、关联攻略、状态(待确认/已确认/已结束)。匹配标签(Tag)由攻略和用户共同引用是匹配的基石。会话消息(Message)搭子关系确认后产生的聊天记录。从用例来看最关键的是“基于攻略发起邀约”和“通过标签匹配推荐搭子”。这两个用例让攻略数据和社交关系数据产生交叉查询一个用户要看“去云南的搭子”系统需要从攻略表中检索云南相关攻略再从攻略关联的搭子关系中筛出还没结束的组合。源码的表结构设计就是围绕这个交叉查询来的。2. 工程结构与架构选型源码应该从哪个文件开始看2.1 单体优先的分层架构而不是一上来就拆微服务这个源码采用的是Spring Boot单体项目包结构是经典的controller - service - mapper三层但多了两个容易被忽略的包event和support。event包里面放了基于Spring事件机制解耦的业务事件比如“搭子关系确认”事件会触发消息通知和攻略热度更新support包放的是公共配置、统一返回、异常码等支撑类。对于这种规模的系统我认为单体是合理的选择。搭子社交类项目初期用户量不会有几千万微服务会徒增部署和运维成本。单体加上模块化包结构后期真要拆按event的边界切分也容易。2.2 包结构与模块依赖源码包结构大致如下com.travelpartner ├── controller # 接口层主要放攻略、搭子、消息三个方向的控制器 ├── service │ ├── note # 攻略服务 │ ├── companion # 搭子服务 │ ├── message # 消息服务 │ └── user # 用户服务 ├── mapper # MyBatis接口 ├── event # 事件定义与监听器 ├── domain # 实体与领域对象 ├── dto # 请求响应对象 └── support # 统一返回体、异常、配置这里值得学习的地方是控制器非常薄薄到几乎没有业务逻辑业务全在service层而service层之间只通过接口交互。比如CompanionServiceImpl创建搭子关系时不会直接去改TravelNote的数据而是抛出一个CompanionCreatedEvent由NoteEventListener去更新攻略的热度。这种事件解耦让我在调试时非常舒服修改一个模块不会波及另一个模块。2.3 数据库表怎么设计才支撑“攻略即需求”看数据库脚本最核心的几张表设计很巧妙。travel_note表除了标题、正文等常规字段还有几个容易被忽略的字段destination_keywords将目的地点名冗余成关键词字符串比如“杭州 西湖 灵隐寺”用逗号分隔。budget_level预算等级1表示穷游2表示舒适3表示高端。匹配搭子时会作为硬性条件。days行程天数同样会参与匹配。hot_value热度值不直接存被浏览次数而是用事件累加器维护。companion表的设计更有意思它直接关联travel_note_id而不是走中间表把“攻略”作为搭子关系的背景板。这样查询“这篇攻略下有哪些搭子”就变成一条简单的SQL不用做复杂的联表。很多新手做这种功能会设计成companion只关联两个用户然后单独做一个note_companion关联表其实没必要。因为一次搭子关系一定来源于一个攻略或者一个标签页直接冗余关联更高效。3. 攻略模块源码剖析内容建模与检索的关键实现3.1 攻略正文与富文本内容的存储方案源码里攻略正文没有直接用MySQL的text字段存富文本而是做了一个非常接地气的设计正文以HTML片段存库但图片单独拆表。note_content表存正文HTMLnote_image表存图片URL列表两者通过note_id关联。这样做的原因很实际HTML片段方便小程序/Web端直接渲染而图片独立成表可以使用CDN域名替换、图片懒加载列表等操作不用去解析HTML里的src。获取攻略详情时源码分两条查询先查note_content拿到正文再查note_image拿到图片列表然后在Service层组装成详情DTO。我看到有人会觉得多一次查询没必要但考虑到图片列表需要做顺序存储和批量打码处理拆开反而更清晰。攻略发布时的图片上传走的是“先传图拿URL再发布正文”的流程。源码里FileController包含一个/upload接口接收MultipartFile后存储到本地磁盘然后返回路径。本地存储虽然简单但生产环境建议换成对象存储这一个点我在文末会再提。3.2 搜索排序与标签系统怎么协同搜索功能没有用Elasticsearch而是基于MySQL的LIKE查询加标签过滤。TravelNoteMapper里有一条动态SQL核心逻辑类似SELECT * FROM travel_note WHERE status 1 AND ( title LIKE CONCAT(%, #{keyword}, %) OR destination_keywords LIKE CONCAT(%, #{keyword}, %) OR tag_ids LIKE CONCAT(%, #{keyword}, %) ) ORDER BY hot_value DESC, create_time DESC LIMIT #{offset}, #{pageSize}这种实现很聪明的地方在于tag_ids字段存的是逗号分隔的标签ID串搜索时直接用字符串包含匹配不需要联表查标签表。当然这种写法有性能上限但在数据量五十万以内、关键词命中率高的场景下实测响应仍在200毫秒内。源码也预留了hot_value排序机制热度高、发布时间新的攻略排前面这符合旅行攻略社区的浏览习惯。标签系统本身单独用了一张tag表攻略表只存ID集合而不建中间表。为什么因为攻略绑定的标签主要是为了检索和匹配不需要做严格的规范化。这里是一种“性能优先的反范式”设计我在实际项目里也经常这么干。但如果后续要做标签维度的统计报表建议还是老老实实用中间表。3.3 缓存策略Redis里到底缓存了什么这套源码的Redis用得比较克制只缓存了三类数据热点攻略详情、攻略排行榜、未读消息数。我原本以为它会缓存所有攻略列表但代码里并没有这么做。热点攻略详情缓存的KEY设计为note:detail:{id}过期时间30分钟。读取顺序是查Redis - 命中则反序列化为DTO返回未命中则查数据库并手动以JSON字符串写入缓存。这里有个细节缓存的是组装后的详情DTO而不是原始的数据库实体。因为原始实体包含content大文本、图片列表等序列化后体积很大而且知道用户端需要什么字段直接缓存DTO能省去每次查库后再组装的CPU开销。排行榜的缓存更简单直接缓存一个攻略ID列表KEY为note:hot:ranking每分钟刷新一次。点击排行榜进入详情时从缓存拿到ID再走详情缓存。这个思路非常适合中小型社区项目Redis只是用来抗峰值不承载核心一致性场景数据量再大时再考虑改造分布式缓存架构。4. 搭子匹配与社交互动的核心源码分析4.1 搭子关系状态机从“待确认”到“同行中”的流转companion表有个字段status取值如下表状态代码含义待确认0用户A发起申请等待用户B确认已确认1用户B同意双方形成搭子关系已拒绝2用户B拒绝申请已取消3发起方在待确认前撤销已结束4搭子关系结束比如行程完成源码在CompanionService里对状态流转做了严格校验比如只有status0时才能调用confirm方法只有status1时才能调用finish方法。这看起来是简单的枚举判断但非常关键。如果不做状态机校验用户反复点击同意按钮就可能出现重复写入消息的脏数据。我特别注意到创建搭子关系时源码会先查一遍“两个用户在同一攻略下是否已经存在有效搭子关系”Companion check companionMapper.selectActiveByNoteAndUsers(noteId, userIdA, userIdB); if (check ! null) { throw new BizException(你们在这篇攻略下已经有关联啦); }这行代码看似朴素却是避免重复匹配的第一道保险。很多类似项目在这个环节漏了唯一性约束数据库没有加唯一索引接口层也没有防重判断结果用户疯狂点“申请同行”就创建出一堆重复关系。4.2 匹配推荐算法地理距离与兴趣标签的候选集过滤匹配逻辑是这套源码最值得读的部分它不像很多社交App那样上来就搞复杂向量推荐而是用“候选集过滤”的四步流程第一步基于目的地过滤。用户输入想去的目的地源码先从travel_note表查出所有该目的地的攻略ID。第二步基于出发地距离过滤。取出当前用户的常居城市经纬度与搭子发起人的常居城市经纬度计算球面距离距离超过设定阈值的直接排除。这里用的是简单的Haversine公式Java里封装在DistanceUtil中public static double distance(double lat1, double lng1, double lat2, double lng2) { double radLat1 lat1 * Math.PI / 180.0; double radLat2 lat2 * Math.PI / 180.0; double a radLat1 - radLat2; double b lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0; 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) )); return s * 6371.0; }第三步基于兴趣标签匹配。把攻略的标签与搭子发起人的标签做交集交集数量作为匹配分。比如共同喜欢“美食”“露营”就能加两分会直接参与排名。第四步按匹配分倒序返回Top20候选搭子列表。这套算法不复杂但很实用。旅行搭子场景最关键的一点是“时间和目的地一致”其次是消费预算相近、兴趣接近。预算等级在源码里是硬编码的过滤条件双方等级差值超过1就直接剔除。这种简单过滤比迷信AI推荐更让人放心因为规则透明用户知道为什么推荐这个人。4.3 WebSocket消息通道与聊天记录持久化搭子关系确认之后双方需要聊天。源码用的是Spring Boot内置WebSocket不是Netty也不是第三方推送。消息流程是前端建立WebSocket连接时带上token握手拦截器校验token并解析出userId把session放入WebSocketSessionManager的ConcurrentHashMap中。发送消息时客户端通过WebSocket发送JSON{type:chat,toUserId:123,content:明天几点集合}。服务端收到后做三件事第一保存消息到message表第二给在线用户推送消息第三顺便把接收人的未读消息数加1存到Redis的Hash结构中。OnMessage public void onMessage(String message, Session session) { ChatMessageDTO dto JSON.parseObject(message, ChatMessageDTO.class); messageService.saveMessage(dto); pushToUser(dto.getToUserId(), message); messageService.incrementUnread(dto.getToUserId()); }这里有个容易被忽略的点消息顺序。源码里保存消息后立即推送如果网络抖动可能出现推送顺序和数据库自增ID顺序不一致。解决方案是用客户端记录一个本地消息序号服务端按序号排或者服务端在推消息时带上数据库生成的消息ID让客户端按ID排。这套源码没有做全局严格有序但我认为搭子聊天场景下偶尔乱序可接受重要的是不能丢消息。5. 接口设计与前端接入小程序/H5联调中的关键细节5.1 统一返回体与全局异常的处理思路源码里所有接口统一返回ResultT结构字段包括code、message、data。这种统一包装绝对是大项目最省心的决定前端只需要处理一种返回结构。异常处理采用RestControllerAdvice全局拦截业务异常返回“4xx”类code系统异常返回“500”类code。我见过很多项目里的返回结构混乱一个接口返回data是JSON对象另一个接口返回data是字符串。这种项目联调时前端要处处写额外的判断。这套源码的控制器里面基本没有Result组装逻辑统一由ResponseBodyAdvice自动包装代码干净很多。5.2 登录态与权限认证Token如何保持不掉线登录方案用的是JWT用户在登录接口拿到token后续请求在Header中带Authorization。JwtInterceptor在请求进来时解析token并取出userId放入ThreadLocal。这个方案实现简单适合没有多端单点登出强诉求的项目。源码中有一个非常细的点Token里只放了userId和过期时间没有放更多用户信息。要获取昵称头像时每次从Redis缓存里取取不到再查数据库。避免用户改昵称后Old token里的旧昵称还持续生效的问题。我在接入时也遇到过一个坑——JWT的过期时间设得太长用户离线半年还能继续访问。源码默认是7天对旅行搭子这种低频使用场景来说比较合理但如果你要做更严格的安全控制建议让用户每次打开小程序时刷新token。5.3 攻略详情页与搭子列表页的聚合接口前端加载一个攻略详情页至少需要这些数据攻略信息、作者信息、攻略图片、推荐标签、相关搭子邀约列表。如果前端分别请求5个接口不仅慢而且容易出现页面闪烁。源码为此设计了一个聚合接口GET /api/note/detail/{id}在Service层末尾把攻略、作者、图片、搭子邀约打包到一个超大DTO返回。这个聚合接口我在阅读时感觉很惊艳因为它内部定义了一个NoteDetailVO其中companions字段不是一个纯列表而是带有“申请状态”的列表。当前用户还没申请时列表项里带applicabletrue已经申请则带appliedtrue已经是搭子关系则带confirmedtrue。这样前端就不用再额外调一个接口查询当前用户和每个搭子发起人的关系状态一次请求就能渲染所有按钮。6. 源码里最容易踩的坑和我给出的优化建议6.1 并发环境下重复创建搭子关系的竞态问题虽然前面提到创建搭子关系前会做查询防重检查但并发场景下仍有可能漏掉。两个用户同时互相点击“申请同行”或者同一个用户连续点两次申请按钮请求同时到达时两次查询都没查到已存在关系然后都执行插入最终产生两条重复数据。源码里这个问题其实没有完全解决。如果是我来改我会在companion表增加一个唯一索引比如uniq_user_pair_note索引字段为user_id_a、user_id_b、note_id同时要求user_id_a user_id_b把一对用户按固定顺序存放。然后插入时用数据库的唯一约束兜底捕获DuplicateKeyException后返回“请勿重复申请”。这是最简单可靠的做法。6.2 热点攻略的缓存击穿与雪崩缓存策略部分我提过热点攻略详情缓存30分钟但这里有个风险一个非常火的攻略在缓存过期后同时有大量请求穿透到数据库。这套源码在NoteDetailService里没有做互斥重建用的是“查询数据库后手动写入缓存”一旦热点缓存失效数据库瞬时压力会很大。我的建议是对热点数据采用双重判定锁也就是在缓存未命中时先用Redis的SETNX加互斥锁拿到锁的线程才去查数据库和重建缓存其他线程短暂自旋后重新读缓存。String lockKey note:lock: noteId; boolean locked redisTemplate.opsForValue().setIfAbsent(lockKey, 1, 5, TimeUnit.SECONDS); if (locked) { try { // 查库并重建缓存 } finally { redisTemplate.delete(lockKey); } } else { Thread.sleep(50); return getNoteDetail(noteId); }这样就算缓存失效真正查库的请求也只有一个。对社区类项目来说这个优化性价比极高。6.3 未读消息计数不一致源码中未读消息数是存在Redis的unread:{userId}但“清除未读”的时机是用户打开聊天窗口时调用的。这里有一个典型问题如果用户开了两个聊天窗口先清除A窗口的未读数再清除B窗口的未读数A窗口期间新来的消息会被B窗口的清除操作误伤掉。更严重的WebSocket推送消息时是异步加一清除时直接删掉整个key会产生竞态。我的优化方案是未读数按会话维度存储unread:{sessionId}:{userId}清除时只删除当前会话的未读数而不是删除用户总未读数。列表页的总未读数用Redis的SUNION或其余多个key求和。这个方案改动不大但能彻底解决未读数打架的问题。6.4 图片上传本地磁盘的隐患源码里图片上传到本地目录然后通过静态资源映射对外访问。这在单机开发环境没问题但部署到多实例时用户A上传的图片可能在实例1的磁盘请求被负载均衡转发到实例2后就访问不到。建议尽早接入对象存储或者至少用NFS之类的共享存储。我在接手类似项目时第一个改造的就是这个。7. 从这套源码能带走的三样东西第一样是“用反范式换性能”的表设计思路。攻略表存目的地关键词、预算等级、标签ID集合搭子表直接关联攻略ID这些设计都不符合教科书上的范式理论但非常契合查询场景。做业务系统不能死扣范式要在可维护性和查询效率之间找平衡。第二样是“事件解耦”的模块协作方式。搭子关系创建后要通知消息模块、要更新攻略热度如果直接写在一个方法里代码会越来越乱。用Spring事件机制核心服务只做核心事其他副作用的处理交给监听器这是降低耦合度的有效手段。第三样是“克制”的技术选型。搜索没有上ES缓存没有滥用Redis匹配算法没有上协同过滤全部用简单可靠的办法解决问题。对于绝大多数中小型项目过度设计比做少了的危害更大。这套源码证明把一个系统做好从来不是取决于用了多高级的技术而是把每个基础环节的细节都处理到位。最后根据我的经验如果你想拿这套源码练手建议从CompanionService开始读把状态机的每个流转画出来再配合接口调试工具把创建搭子、确认、消息推送的完整链路跑通。跑通之后再去改造匹配算法比如加入“出发时间差”的权重你会对整套社交系统有更透彻的理解。

相关新闻

SpringBoot+Vue+MyBatis高校实习管理系统设计与实现复盘

SpringBoot+Vue+MyBatis高校实习管理系统设计与实现复盘

每年五六月,是高校里最“兵荒马乱”的一段日子。一边是学生急着盖实习鉴定章、补周志材料,一边是辅导员和教务老师埋头在QQ群、微信群里一遍遍催收,纸质表和电子表还经常对不上。带过毕业班的朋友应该都有体会——这个场景太适合用一套“高校…

2026/10/15 7:42:00 阅读更多 →
QUIC协议如何根治直播卡顿?首帧秒开与弱网优化实践

QUIC协议如何根治直播卡顿?首帧秒开与弱网优化实践

1. 为什么直播总是卡:先聊聊我在真实环境中踩过的坑还记得接手某跨平台直播系统的性能优化时,后台数据统计里最刺眼的一项就是“首帧秒开率不达标”,用户端动不动就黑屏转圈三五秒,弹幕里全是催“优化网络”的。我一开始也和大多数…

2026/10/15 7:42:00 阅读更多 →
基于UniApp的微信小程序个性化聊天交友系统开发实战

基于UniApp的微信小程序个性化聊天交友系统开发实战

赶在毕业季前,很多同学都在愁选题。聊天交友类小程序算是经典方向,但大多数网上开源版本要么界面停留在五年前,要么只做了个壳子。这次分享的这套基于微信小程序、采用UniApp开发的大学生线上聊天交友系统,亮点不仅仅是“能聊天”…

2026/10/15 7:42:00 阅读更多 →

最新新闻

从画图到设计:用文本化DSL把架构图变成可维护的工程资产

从画图到设计:用文本化DSL把架构图变成可维护的工程资产

平时我见得最多的“图”,不是最终文档里那张漂亮的架构图,而是评审会上被临时画在白板上的方框加箭头。主讲人一边画一边改,台下的人一边看一边猜。等会议结束,没人记得箭头谁指向谁,只记得“好像讲了一个方案”。后来…

2026/10/15 8:25:33 阅读更多 →
t3code赛事编码协议:从计时数据到成绩榜单的自动化方案

t3code赛事编码协议:从计时数据到成绩榜单的自动化方案

如果你跟我一样,经常被各种赛事计时表、Excel 成绩单、手动排名搞到半夜,那你一定要试试 t3code 这套思路。t3code 最开始只是我给一个周末赛车活动写的三行脚本,后来慢慢变成了一套三段式赛事编码协议:练习、排位、正赛三段&…

2026/10/15 8:25:33 阅读更多 →
SylixOS应用开发指南:线程模型、同步机制与调试实践

SylixOS应用开发指南:线程模型、同步机制与调试实践

简介:《SylixOS应用开发手册1》是一份面向具备C语言基础的程序员的实时嵌入式操作系统开发指南,系统讲解SylixOS应用程序设计接口,适用于航空航天、工业自动化、通信、新能源等场景。压缩包内共1个pdf文件,大小14.95MB&#xff0c…

2026/10/15 8:25:33 阅读更多 →
多协议网络库的架构设计与核心实现:从Reactor线程模型到协议解析

多协议网络库的架构设计与核心实现:从Reactor线程模型到协议解析

1. 为什么需要多协议网络库大概两年前,我们团队接手了一个典型的“什么都要接”的后台系统:对外要提供HTTP接口,方便前端和第三方系统调用;要和一批长期在线的硬件设备保持TCP长连接,并且随时可能下发指令;…

2026/10/15 8:25:33 阅读更多 →
T3 Stack全栈实战:构建类型安全的代码片段管理应用

T3 Stack全栈实战:构建类型安全的代码片段管理应用

如果你正在找一份能直接上手、不用绕弯子的全栈项目教程,那么基于 T3 Stack 打造的t3code应该能对上你的胃口。这个项目本质上是一个代码片段分享与管理系统,开发者可以注册登录,把自己常用的代码块按语言分类保存,支持标签检索、…

2026/10/15 8:25:33 阅读更多 →
多模态AI视频搜索实战:从250分钟到2分钟的工程化落地

多模态AI视频搜索实战:从250分钟到2分钟的工程化落地

1. 项目背景与核心痛点拆解1.1 250分钟到底卡在哪里视频搜索这件事,没做过的人会觉得不就是搜个关键词吗。但真正处理过大规模视频素材库的从业者都清楚,传统视频检索的流程有多笨重。Cond Nast 作为一家拥有海量视频内容的媒体集团,旗下品牌…

2026/10/15 8:24:32 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →