MediaCMS 媒体权限体系深度解析:媒体状态、直接共享与 RBAC 角色访问控制
音视频CMS后端前端【免费下载链接】mediacmsMediaCMS is a modern, fully featured open source video and media CMS项目地址https://gitcode.com/gh_mirrors/me/mediacms点击查看免费下载本文以 MediaCMS 仓库中的docs/media_permissions.md为主体结合users、rbac、files等应用的实际源码完整梳理 MediaCMS 的媒体访问控制机制从 public/private/unlisted 三种媒体状态到MediaPermission用户级直接授权再到基于分类与分组的 RBAC 细粒度权限并给出权限检查在列表查询、API 鉴权、文件分发x-accel-redirect各层的具体实现位置帮助读者在自己的部署或二次开发中正确理解和配置这套权限系统。一、权限体系总览MediaCMS 的权限系统提供三个层次的访问控制三者可以叠加使用基础权限Media States由Media.state字段决定媒体的基本可见性取值固定为public、private、unlisted三种用户级直接授权MediaPermission通过MediaPermission模型向指定用户授予 viewer/editor/owner 三级权限适合点对点的临时共享基于角色的访问控制RBAC通过USE_RBAC设置开启后借助RBAC 分组 ↔ 用户角色 ↔ 分类的三元关系让团队成员按角色批量获得某分类下媒体的访问权。三层的判定优先级是媒体公开 → 属主 → 直接授权 → RBAC 分类继承 → 拒绝。下文逐层展开并给出对应的模型定义与判定代码位置。二、媒体状态public、private 与 unlisted每个媒体对象都有一个state字段决定其基本可见性定义在 Media 模型state models.CharField( max_length20, choicesMEDIA_STATES, defaulthelpers.get_portal_workflow(), db_indexTrue, help_textstate of Media, )其中MEDIA_STATES在 files/models/utils.py 中声明只有三个取值状态含义public所有人可见且可出现在公共列表页private仅属主和被显式授权直接授权或 RBAC的用户可见unlisted不出现在公共列表中但知道直接链接的人可访问默认状态由 PORTAL_WORKFLOW 决定新建媒体时的默认状态不是写死的而是由全局设置PORTAL_WORKFLOW默认public见 cms/settings.py决定。具体逻辑在 files/helpers.pydef get_default_state(userNone): # possible states given the portal workflow setting state private if settings.PORTAL_WORKFLOW public: state public if settings.PORTAL_WORKFLOW unlisted: state unlisted if settings.PORTAL_WORKFLOW private_verified: if user and user.advancedUser: state unlisted return state也就是说运营方可以通过PORTAL_WORKFLOW实现默认私有的工作流设置为private_verified时普通用户上传的媒体默认private而advancedUser高级用户默认unlisted。listable出现在公共列表的额外条件公开和出现在列表里是两件事。Media还有一个listable布尔字段files/models/media.py其赋值逻辑在 Media.save() 中# condition to appear on listings if self.state public and self.encoding_status success and self.is_reviewed is True: self.listable True else: self.listable False即只有public状态、转码成功且已被审核is_reviewed的媒体才会进入公共列表。因此unlisted媒体即使链接可访问也不会被任何列表页或 API 列表检索到这正是direct link 可访问但不公开列出语义的实现基础。三、MediaPermission面向单个用户的直接授权MediaPermission模型定义在 files/models/media.py是用户 ↔ 媒体一对一的授权记录class MediaPermission(models.Model): Model to store user permissions for media PERMISSION_CHOICES ( (viewer, Viewer), (editor, Editor), (owner, Owner), ) SOURCE_LTI_EMBED lti_embed SOURCE_EXPLICIT explicit SOURCE_CHOICES ( (SOURCE_LTI_EMBED, LTI Embed), (SOURCE_EXPLICIT, Explicit), ) owner_user models.ForeignKey(users.User, on_deletemodels.CASCADE, related_namegranted_permissions) user models.ForeignKey(users.User, on_deletemodels.CASCADE) media models.ForeignKey(Media, on_deletemodels.CASCADE, related_namepermissions) permission models.CharField(max_length20, choicesPERMISSION_CHOICES) source models.CharField(max_length32, choicesSOURCE_CHOICES, defaultSOURCE_EXPLICIT) created_at models.DateTimeField(auto_now_addTrue) class Meta: unique_together (user, media)几个关键设计点三级权限viewer— 可以查看该媒体即使它是privateeditor— 可查看并编辑元数据owner— 完全控制包括删除。unique_together (user, media)同一用户对同一媒体只保留一条授权记录重复共享时通过get_or_create覆盖而非堆积。source字段区分来源explicit是用户手动共享产生的lti_embed是在 LTI 1.3 会话中把媒体嵌入课程时自动生成的。这一区分被用于shared_with_me列表的过滤与课程清理见 files/views/media.py 中exclude_lti_embed参数也让EmbedMediaCourse审计表可以按source批量回收 LTI 授权。owner_user记录授权发起者用于shared_by_me我共享出去的媒体视图的反查。共享行为如何落到 MediaPermission在媒体编辑页的发布表单 MediaPublishForm 中Shared复选框直接驱动MediaPermission的创建与清理if shared: if self.request: submitted_categories self.cleaned_data.get(category, []) submitted_has_rbac any(cat.is_rbac_category for cat in submitted_categories) if self.had_explicit_permission or (not self.was_shared and not submitted_has_rbac): MediaPermission.objects.get_or_create( mediaself.instance, userself.request.user, defaults{owner_user: self.request.user, permission: owner}, ) elif not shared: self.instance.permissions.all().delete() rbac_cats self.instance.category.filter(is_rbac_categoryTrue) self.instance.category.remove(*rbac_cats)可以看到勾选 Shared 后属主会为媒体写入一条permissionowner的自身授权用于标记该媒体已共享取消勾选则会删除全部直接授权并把媒体从所有 RBAC 分类中移除。是否已共享由 Media.is_shared 判定——存在任意MediaPermission或媒体挂在任意is_rbac_categoryTrue的分类下都算共享。API 返回的is_shared字段由 SingleMediaSerializer 计算前端据此展示共享状态。四、RBAC分组、角色与分类开启方式RBAC 由设置项USE_RBAC控制在 cms/settings.py 中默认关闭USE_SAML False USE_RBAC False USE_IDENTITY_PROVIDERS False USE_LTI False # Enable LTI 1.3 integration代码中所有 RBAC 分支都通过getattr(settings, USE_RBAC, False)守卫关闭时 RBAC 分组与成员关系不产生任何访问效果见下文测试佐证。数据模型RBAC 的三个核心模型定义在 rbac/models.pyRBACGroup— 逻辑分组如某门课的教师组。字段包括uid同一身份提供方下唯一的 10 位随机串、name、categoriesM2M 到files.Category、identity_providerFK 到 allauth 的SocialApp可空。unique_together [[uid, identity_provider], [name, identity_provider]]保证同一 IdP 下组名唯一。RBACRole— 角色枚举固定三级rbac/models.pymember— 可查看该组关联分类下的媒体contributor— 可查看并编辑上传/归入该分类下的媒体manager— 对该分类下媒体拥有完全控制。RBACMembership— 用户 × 组 × 角色三元记录unique_together [user, rbac_group, role]且其save()会执行full_clean()非法角色值会直接抛ValidationErrorrbac/models.py。分类侧的开关是Category.is_rbac_categoryfiles/models/category.pyIf access to Category is controlled by role based membership of Groups。只有标记为 RBAC 控制的分类才会走角色继承路径files/admin.py 还保证一旦分类被挂到 RBAC 分组就无法悄悄关闭该开关。组与身份提供方的联动在 rbac/models.py当USE_IDENTITY_PROVIDERS开启且分组绑定了 IdP 时向分组添加分类会自动创建IdentityProviderCategoryMapping映射移除则删除映射——这为 SAML 登录用户按外部组自动归组提供了数据基础。权限继承链条一次访问判定中用户能否看到某媒体的 RBAC 推导链是User --RBACMembership(role)-- RBACGroup --categories M2M-- Category --M2M-- Media对应的查询辅助方法全部实现在 User 模型def get_rbac_categories_as_member(self): Get all categories related to RBAC groups the user belongs to rbac_groups RBACGroup.objects.filter( memberships__userself, memberships__role__in[member, contributor, manager] ) categories Category.objects.prefetch_related(user).filter(rbac_groups__inrbac_groups).distinct() return categories def get_rbac_categories_as_contributor(self): rbac_groups RBACGroup.objects.filter( memberships__userself, memberships__role__in[contributor, manager] ) categories Category.objects.filter(rbac_groups__inrbac_groups).distinct() return categoriesas_member包含全部三种角色凡进组即可看as_contributor只认contributor与manager只有这两种角色能把媒体归入该分类。五、User 模型的三个权限判定方法文档中给出的三个检查方法在 users/models.py 中实现内部检查顺序为属主 → RBAC → 直接授权def has_member_access_to_media(self, media): # First check if user is the owner if media.user self: return True # Then check RBAC permissions if getattr(settings, USE_RBAC, False): rbac_groups RBACGroup.objects.filter( memberships__userself, memberships__role__in[member, contributor, manager], categories__inmedia.category.all() ).distinct() if rbac_groups.exists(): return True # Then check MediaShare permissions for any access media_permission_exists MediaPermission.objects.filter( userself, mediamedia, ).exists() return media_permission_existshas_contributor_access_to_media与has_owner_access_to_media结构相同区别只在过滤条件方法属主RBAC 角色要求MediaPermission 要求has_member_access_to_media直接返回 Truemember/contributor/manager任意一条授权含 viewerhas_contributor_access_to_media直接返回 Truecontributor/managerpermission__in[editor, owner]has_owner_access_to_media直接返回 True仅manager仅permissionowner这套逐级收紧的写法保证角色层级天然单调manager ⊃ contributor ⊃ member。分类级对应方法has_member_access_to_category、has_contributor_access_to_category、has_manager_access_to_categoryusers/models.py用于分类页面、封面图鉴权与仅 manager 可改 RBAC 分类的校验can_edit_category。六、权限在各层的实际应用1. 媒体列表与 API 查询列表接口的查询集构造在 MediaListAPI._get_media_querysetdef _get_media_queryset(self, request, userNone): base_filters Q(listableTrue) if user: base_filters Q(useruser) base_queryset Media.objects.prefetch_related(user, tags) if not request.user.is_authenticated: return base_queryset.filter(base_filters) conditions base_filters permission_filter {user: request.user} if user: permission_filter[owner_user] user if MediaPermission.objects.filter(**permission_filter).exists(): perm_conditions Q(permissions__userrequest.user) if user: perm_conditions Q(useruser) conditions | perm_conditions if getattr(settings, USE_RBAC, False): rbac_categories request.user.get_rbac_categories_as_member() rbac_conditions Q(category__inrbac_categories) if user: rbac_conditions Q(useruser) conditions | rbac_conditions return base_queryset.filter(conditions).distinct()即登录用户能看到的集合 listable的公开媒体 ∪ 自己被授权的媒体 ∪ 自己所属 RBAC 组能触及分类下的媒体。全文检索接口使用同样的并集思路files/views/media.pyQ(listableTrue) | Q(permissions__userrequest.user) | Q(userrequest.user) | Q(category__inrbac_categories)。与文档Media Sharing一节对应的两个专用视图参数?showshared_by_me— 自己发起的共享permissions__owner_userme加上自己在 contributor 分类下的媒体files/views/media.py?showshared_with_me— 别人共享给自己的permissions__userme若开启 RBAC 再并入 member 视角的分类媒体还支持exclude_lti_embed1只看显式共享、shared_group组名按 RBAC 组名收窄files/views/media.py、#L264。此外publish_stateshared过滤器会命中存在自定义授权或挂在 RBAC 分类下的媒体files/views/media.py。序列化层也做了防泄漏处理CategoriesInfoMixin 在返回媒体所属分类时会剔除当前用户无权访问的 RBAC 分类避免通过分类标题侧漏组信息。2. 状态转移受 PORTAL_WORKFLOW 约束普通用户能做什么状态转移由 get_next_state 控制PORTAL_WORKFLOWprivate时禁止把媒体改为publicunlisted时同样禁止升为public只有is_mediacms_editor(user)superuser /is_manager/is_editor定义见 files/methods.py不受限制。编辑表单也会据此裁剪state下拉选项files/forms.py非 editor 用户在工作流非public时只能看到unlisted/private两个选项。3. 文件级鉴权x-accel-redirect 路径权限检查不仅发生在网页与 API 层还下沉到 nginx 回源鉴权。files/views/media_auth.py 的media_auth视图响应 nginxauth_request核心判定函数_decidefiles/views/media_auth.pydef _decide(uid, user): state, owner_id _lookup_state(uid) if state is None: return False if state in (public, unlisted): return True # private if not user.is_authenticated: return False if owner_id user.id: return True if is_mediacms_editor(user): return True # RBAC / MediaPermission path needs a full Media instance. try: media Media.objects.get(uiduid) except Media.DoesNotExist: return False return user.has_member_access_to_media(media)这与文档中如何应用权限的五步顺序完全一致public/unlisted 放行 → 属主放行 → editor 放行 → 走has_member_access_to_media内部含 RBAC 与 MediaPermission 检查→ 否则拒绝返回 403nginx 拒绝转发X-Accel-Redirect文件。判定结果按uid 用户维度缓存TTL 由X_ACCEL_AUTH_CACHE_SECONDS控制默认 300 秒。同类逻辑_decide_categoryfiles/views/media_auth.py还保护了 RBAC 分类的封面图非组内成员看不到私有 RBAC 分类的海报文件。七、用户角色User Roles与设置映射User模型上的几个布尔字段users/models.py承载了文档提到的平台级角色advancedUser— 高级用户配合PORTAL_WORKFLOWprivate_verified影响默认状态is_editor— MediaCMS Editor可跨用户编辑/审核内容is_mediacms_editor将其与 superuser、manager 同等对待可列出全部媒体、任意状态转移is_manager— MediaCMS Manager完整管理能力is_mediacms_manageris_superuser/is_staff— Django Admin 权限。批量导入用户时可用set_role_from_mappingusers/models.py把外部角色标识映射到上述字段识别advancedUser/editor/manager/admin四种映射值未识别的角色会清空全部提升标志——这为 Kaltura/Panopto/YouTube 迁移场景中的角色对齐提供了统一入口。注意区分两套角色平台级角色editor/manager/admin是全局的、写死在User布尔位上的RBAC 角色member/contributor/manager是用户在某个分组内的局部身份二者互不替代。八、行为验证测试用例中的权限边界tests/rbac/test_rbac_access.py 用一组端到端测试固化了上述语义可以作为行为验收标准角色层级test_access_levels_follow_role_hierarchy断言 member (member✓, contributor✗, owner✗)、contributor (✓, ✓, ✗)、manager (✓, ✓, ✓)、组外用户全 ✗tests/rbac/test_rbac_access.pyRBAC 开关是硬前提test_membership_grants_nothing_when_rbac_is_disabled验证USE_RBACFalse时成员对私有媒体返回 401#L177-L180撤销即时生效删除 membership 或从分组移除分类后原成员立刻失去访问权#L168-L175编辑页准入contributor 与 manager 可以打开/edit?m...member 只读会被重定向回首页#L208-L214数据模型约束membership 默认角色为member、未知角色与重复 (user, group, role) 会被ValidationError拒绝#L48-L63列表隔离member 的/api/v1/media包含组分类下的私有媒体组外用户不包含#L182-L187。九、共享媒体的三种方式与最佳实践结合前面的实现文档中Media Sharing一节的三条路径落到具体操作上公开/非列表公开把state改为public或unlisted受PORTAL_WORKFLOW与审核状态影响见第二节直接授权在编辑页勾选 Shared或程序化写入MediaPermission(user..., media..., permissionviewer|editor|owner)RBAC 分类把媒体归入is_rbac_categoryTrue且已关联到用户所在 RBAC 组的分类普通用户只能选择非 RBAC 分类 自己有 contributor 角色的分类选择集在 MediaPublishForm.init中构造。对应文档的 Best Practices可以补充为可操作的建议默认私有把PORTAL_WORKFLOW设为private或private_verified让新上传默认不公开再按需发布用分类组织媒体分类是 RBAC 权限的作用域先规划分类树再规划分组团队协作用 RBAC一个组 ↔ 一组分类成员进组即获得整分类权限无需逐条授权例外用直接授权一次性、跨分类的共享走MediaPermission粒度最小、撤销最直接删除该记录即可。十、相关配置与源码索引设置项默认值作用位置USE_RBACFalse启用/停用基于分类分组的 RBACcms/settings.pyPORTAL_WORKFLOWpublic控制新媒体默认状态与允许的状态转移cms/settings.pyUSE_IDENTITY_PROVIDERSFalse组-分类变更时自动维护 IdP 分类映射rbac/models.pyUSE_X_ACCEL_REDIRECTTrue文件回源是否走 nginx 鉴权路径files/views/media_auth.pyX_ACCEL_AUTH_CACHE_SECONDS300文件级鉴权判定的缓存 TTLfiles/views/media_auth.py关键源码入口一览状态与授权模型files/models/media.pyMediaPermission、files/models/utils.pyMEDIA_STATESRBAC 模型rbac/models.pyRBACGroup/RBACRole/RBACMembership、files/models/category.pyis_rbac_category判定方法users/models.py列表/检索过滤files/views/media.py文件回源鉴权files/views/media_auth.py状态转移与共享表单files/methods.py、files/forms.py行为测试tests/rbac/test_rbac_access.py。至此从文档描述的状态 → 属主 → 直接授权 → RBAC → 拒绝检查顺序到state/listable字段、MediaPermission记录、RBACGroup/RBACMembership关联再到列表查询集、编辑表单和 nginx 文件鉴权中的具体实现MediaCMS 的媒体权限体系在代码层面已全部闭环USE_RBACFalse时仅基础状态 直接授权生效开启后叠加分类-分组-角色继承且任何一层变更改状态、删授权、移分类、退组都会即时反映在下一次权限判定中。赞分享音视频CMS后端前端【免费下载链接】mediacmsMediaCMS is a modern, fully featured open source video and media CMS项目地址https://gitcode.com/gh_mirrors/me/mediacms点击查看免费下载相关推荐MediaCMS核心功能深度解析RBAC权限管理、Whisper自动转录与HLS流媒体技术MediaCMS核心功能深度解析RBAC权限管理、Whisper自动转录与HLS流媒体技术 MediaCMS是一款现代化、功能齐全的开源视频媒体内容管理系统桌面应用1Panel权限管理体系多用户角色与访问控制1Panel权限管理体系多用户角色与访问控制 概述 1Panel作为新一代Linux服务器运维管理面板其权限管理体系设计精巧而强大。系统采用基于会话 Ses后端前端运维可观测性Yii 2 安全授权完全指南ACF 访问控制过滤器与 RBAC 角色权限体系实战Yii 2 安全授权完全指南ACF 访问控制过滤器与 RBAC 角色权限体系实战 授权Authorization是验证用户是否有足够权限执行某项操作的后端Web框架上一篇eslint-plugin-unicorn 的 no-duplicate-font-family-names 规则CSS 重复字体族名检测与自动修复完全指南下一篇Sapling SCM 官方 VS Code 扩展实战指南在编辑器内驾驭 Interactive SmartlogISL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LiteLLM模型网关实践:统一多模型接入与成本管控

LiteLLM模型网关实践:统一多模型接入与成本管控

最近大半年,我一直在琢磨怎么把团队里五花八门的模型调用方式收敛到一个统一的入口。同事有的用某平台的原生 SDK,有的直接封装 HTTP 请求,有的又绕了一层别的工具,光是“换个模型就改一套代码”这事,就已经耗费了大量…

2026/10/13 8:43:01 阅读更多 →
agent-skills:智能体技能治理的注册、路由与观测实战

agent-skills:智能体技能治理的注册、路由与观测实战

大概三个月前,我所在的某项目组正被一堆混乱的智能体技能调用逼得发疯。也正是那次经历,让我决定动手做一套名为 agent-skills 的技能治理系统。当时项目的现状是:一部分工具逻辑硬编码在对话流程里,一部分挂在外部的消息总线上&a…

2026/10/13 8:43:01 阅读更多 →
opencode进阶实战:工具调用、服务面与MCP集成指南

opencode进阶实战:工具调用、服务面与MCP集成指南

1. 工具、服务面、外壳与实战集成:opencode 的进阶打开方式如果上一篇文章是在讲 opencode 的“发动机”——核心模型调度与上下文工程——那么这篇就是聊“方向盘、仪表盘和车厢布局”:怎么把工具(Tools)、服务面(Ser…

2026/10/13 8:43:01 阅读更多 →

最新新闻

AIGC创作训练营:从工具使用到工作流设计的系统化训练

AIGC创作训练营:从工具使用到工作流设计的系统化训练

1. 从"会用AI"到"驾驭AI":AIGC创作训练营到底在训练什么很多人第一次接触AIGC,都是从"帮我写一段文案""帮我生成一张图"开始的。提示词丢进去,结果出来,能用就复制粘贴,不能用…

2026/10/13 9:23:55 阅读更多 →
PS5第三方手柄兼容方案:用MCU做HID协议转换层

PS5第三方手柄兼容方案:用MCU做HID协议转换层

前阵子我发了条状态,说自己正在折腾一个叫AnyPS5的小项目,结果评论区一下子涌进来一堆私信,全是问同一个问题:能不能让我手里那些非官方的老手柄在PS5上正常用。说实话,这确实是这个项目最核心的诉求。PS5主机对第三方…

2026/10/13 9:23:55 阅读更多 →
devtron 仓库内 AWS SDK for Go v2 EventStream 协议包全解析:CHANGELOG 版本演进与编解码实现

devtron 仓库内 AWS SDK for Go v2 EventStream 协议包全解析:CHANGELOG 版本演进与编解码实现

云原生DevOps运维 【免费下载链接】devtron The only Kubernetes dashboard you need 项目地址: https://gitcode.com/gh_mirrors/dev/devtron 点击查看 免费下载 导读 本文以 devtron 仓库中锁定的第三方依赖 github.com/aws/aws-sdk-go-v2/aws/protocol/eventst…

2026/10/13 9:23:55 阅读更多 →
bilibili-api完全指南:从零开始掌握B站API开发与应用

bilibili-api完全指南:从零开始掌握B站API开发与应用

bilibili-api完全指南:从零开始掌握B站API开发与应用 B站作为国内领先的视频弹幕网站,拥有丰富的内容生态和开放的API接口,为开发者提供了广阔的创新空间。本指南将带你全面了解B站API的开发与应用,从基础概念到实际操作&#xf…

2026/10/13 9:23:55 阅读更多 →
自助点餐机24小时营业无人值守落地指南丨蓝速科技(larxu)

自助点餐机24小时营业无人值守落地指南丨蓝速科技(larxu)

很多餐饮老板都有过这样的纠结:看着深夜街头偶尔走过的行人,想着要是能多做几单生意该多好,但一算账又退缩了。招一个夜班收银员,工资要比白班高,还得担心人家干不久就离职,流动性大得让人头疼。更现实的是…

2026/10/13 9:23:55 阅读更多 →
Python大数据分析实验通关指南:从数据清洗到可视化全流程

Python大数据分析实验通关指南:从数据清洗到可视化全流程

1. 从lab7这个编号说起:为什么Python课设总在第七周卡住 如果你正在翻这门课的实验安排,看到lab7这个编号,大概率已经过了前六周的语法基础、循环判断、函数封装,开始进入真正要“处理数据”的阶段了。这门课的名字叫《Python程序…

2026/10/13 9:22:51 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →