feat(admin): Add user management and upgrade to module permission system
Features - User Management (Phase 4.1): - Database: Add user_modules table for fine-grained module permissions - Database: Add 4 user permissions (view/create/edit/delete) to role_permissions - Backend: UserService (780 lines) - CRUD with tenant isolation - Backend: UserController + UserRoutes (648 lines) - 13 API endpoints - Backend: Batch import users from Excel - Frontend: UserListPage (412 lines) - list/filter/search/pagination - Frontend: UserFormPage (341 lines) - create/edit with module config - Frontend: UserDetailPage (393 lines) - details/tenant/module management - Frontend: 3 modal components (592 lines) - import/assign/configure - API: GET/POST/PUT/DELETE /api/admin/users/* endpoints Architecture Upgrade - Module Permission System: - Backend: Add getUserModules() method in auth.service - Backend: Login API returns modules array in user object - Frontend: AuthContext adds hasModule() method - Frontend: Navigation filters modules based on user.modules - Frontend: RouteGuard checks requiredModule instead of requiredVersion - Frontend: Remove deprecated version-based permission system - UX: Only show accessible modules in navigation (clean UI) - UX: Smart redirect after login (avoid 403 for regular users) Fixes: - Fix UTF-8 encoding corruption in ~100 docs files - Fix pageSize type conversion in userService (String to Number) - Fix authUser undefined error in TopNavigation - Fix login redirect logic with role-based access check - Update Git commit guidelines v1.2 with UTF-8 safety rules Database Changes: - CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled) - ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code) - INSERT 4 permissions + role assignments - UPDATE PUBLIC tenant with 8 module subscriptions Technical: - Backend: 5 new files (~2400 lines) - Frontend: 10 new files (~2500 lines) - Docs: 1 development record + 2 status updates + 1 guideline update - Total: ~4900 lines of code Status: User management 100% complete, module permission system operational
This commit is contained in:
@@ -1,52 +1,63 @@
|
||||
# **REDCap鈭峕活撘<EFBFBD><EFBFBD>烐楛摨衣<EFBFBD>蝛嗆𥁒<EFBFBD>𠺪<EFBFBD><EFBFBD>嗆<EFBFBD>雿梶頂<EFBFBD><EFBFBD>宏<EFBFBD>函垢鈭支<EFBFBD>銝擧<EFBFBD>雿喳<EFBFBD>頝萄<EFBFBD><EFBFBD>航圾<EFBFBD>?*
|
||||
# **REDCap二次开发深度研究报告:架构体系、移动端交互与最佳实践全景解析**
|
||||
|
||||
## **1\. <EFBFBD>扯<EFBFBD><EFBFBD>䁅<EFBFBD>銝擧沲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?*
|
||||
## **1\. 执行摘要与架构背景**
|
||||
|
||||
Research Electronic Data Capture (REDCap) 撌脩<EFBFBD>隞𦒘<EFBFBD>銝芸<EFBFBD>銝<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>格𤣰<EFBFBD><EFBFBD>極<EFBFBD>瑟<EFBFBD><EFBFBD>䀝蛹銝<EFBFBD>銝芾<EFBFBD>憭<EFBFBD>𣈲<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>葩摨𡃏<EFBFBD>撉䎚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>亙極雿𨀣<EFBFBD><EFBFBD>𣬚熊<EFBFBD>𤑳<EFBFBD>蝛嗥<EFBFBD>撘箏之<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頂蝏麄<EFBFBD><EFBFBD>蒾<EFBFBD>嗉<EFBFBD>敺瑕嵗憭批郎嚗Āanderbilt University嚗匧<E59A97><E58CA7>𤑳<EFBFBD><F0A491B3>詨<EFBFBD>摨𠉛鍂蝔见<E89D94><E8A781>𣂷<EFBFBD>鈭<EFBFBD><E988AD>憟堒<E6869F><E5A092><EFBFBD><EFBFBD>靚<EFBFBD>䰻蝞∠<E89D9E><E288A0>峕㺭<E5B395>桀<EFBFBD><E6A180>亙極<E4BA99>瘀<EFBFBD>雿<EFBFBD>笆鈭𦒘<E988AD>銝𡁶漣<F0A181B6>𠉛弦<F0A0899B><E5BCA6><EFBFBD><EFBFBD><EFBFBD>葩摨𦠜㺭<F0A6A09C>桃恣<E6A183><E681A3><EFBFBD>諹<EFBFBD>嚗朙EDCap<61><70>迤<EFBFBD><E8BFA4><EFBFBD><EFBFBD>𥕦銁鈭𤾸<E988AD><F0A4BEB8>靝<EFBFBD>甈∪<E79488><E288AA>爗<EFBFBD>肽<EFBFBD><E882BD>䜘<EFBFBD><E49C98><EFBFBD>銝<EFBFBD><E98A9D>航祗瘨萇<E798A8>鈭<EFBFBD><E988AD>朞<EFBFBD>憭㚚<E686AD>璅∪<E79285>嚗𠄌xternal Module, EM嚗㗇<E59A97><E39787>嗚<EFBFBD><E5979A><EFBFBD><EFBFBD>函<EFBFBD>摨讐<E691A8>蝔𧢲𦻖<F0A7A2B2><F0A6BB96><EFBFBD>API嚗剹<E59A97><E589B9>㺭<EFBFBD>桀<EFBFBD><E6A180>亥圻<E4BAA5>穃膥嚗㇄ET嚗劐誑<E58A90>𦠜<EFBFBD><F0A6A09C>䟕EDCap蝘餃𢆡摨𠉛鍂蝔见<E89D94><E8A781>愢yCap<61><70>宏<EFBFBD>券<EFBFBD><E588B8>鞟<EFBFBD><E99E9F>亙笆REDCap餈𥡝<E9A488><F0A5A19D><EFBFBD><EFBFBD>摨誩<E691A8><E8AAA9>拙<EFBFBD>1<EFBFBD>?
|
||||
<EFBFBD>祆𥁒<EFBFBD>𦠜秄<EFBFBD>冽<EFBFBD>靘𥕦<EFBFBD>鈭竃EDCap鈭峕活撘<EFBFBD><EFBFBD>𤑳<EFBFBD>霂血偷<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD><EFBFBD>僐<EFBFBD><EFBFBD><EFBFBD>銝滢<EFBFBD><EFBFBD>Z悄鈭<EFBFBD>沲<EFBFBD><EFBFBD><EFBFBD><EFBFBD>單辺隞嗚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>抒<EFBFBD><EFBFBD>雴辣嚗㇊lugin嚗匧<EFBFBD><EFBFBD>唬誨憭㚚<EFBFBD>璅∪<EFBFBD>獢<EFBFBD>沲<EFBFBD><EFBFBD><EFBFBD>皜~<EFBFBD><EFBFBD><EFBFBD><EFBFBD>函<EFBFBD><EFBFBD><EFBFBD><EFBFBD>頝蛛<EFBFBD>餈䀹楛<EFBFBD>亙<EFBFBD><EFBFBD>𣂷<EFBFBD>蝘餃𢆡蝡臬<EFBFBD>甇亦<EFBFBD>憭齿<EFBFBD><EFBFBD>箏<EFBFBD><EFBFBD><EFBFBD>迨憭吔<EFBFBD><EFBFBD>亙<EFBFBD>霂衣<EFBFBD><EFBFBD>堒枂鈭<EFBFBD>鸌摰𡁶<EFBFBD>皞𣂷誨<EFBFBD><EFBFBD>芋撘𧶏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭<EFBFBD>虜閫<EFBFBD><EFBFBD><EFBFBD>琿𩐠嚗<EFBFBD>朖撘<EFBFBD><EFBFBD>睲葉<EFBFBD><EFBFBD><EFBFBD>𨅯<EFBFBD><EFBFBD>嘅<EFBFBD>嚗<EFBFBD>僎<EFBFBD>𣂷<EFBFBD>鈭<EFBFBD>銁摰𡁜<EFBFBD><EFBFBD>蠘<EFBFBD><EFBFBD>嗥輕<EFBFBD>斤頂蝏笔<EFBFBD><EFBFBD>湔<EFBFBD>抒<EFBFBD><EFBFBD><EFBFBD>雿喳<EFBFBD>頝萸<EFBFBD>?
|
||||
### **1.1 <20>𠉛<EFBFBD>璅∪<E79285>銝擧<E98A9D><E693A7><EFBFBD>挪<EFBFBD>格<EFBFBD><E6A0BC>鞟<EFBFBD><E99E9F>寞<EFBFBD><E5AF9E>?*
|
||||
Research Electronic Data Capture (REDCap) 已经从一个单一的数据收集工具演变为一个能够支持复杂临床试验、运营工作流和纵向研究的强大生态系统。虽然范德堡大学(Vanderbilt University)开发的核心应用程序提供了一套完善的调查管理和数据录入工具,但对于企业级研究和复杂临床数据管理而言,REDCap真正的潜力在于其“二次开发”能力。这一术语涵盖了通过外部模块(External Module, EM)框架、应用程序编程接口(API)、数据录入触发器(DET)以及涉及REDCap移动应用程序和MyCap的移动集成策略对REDCap进行的程序化扩展1。
|
||||
|
||||
本报告旨在提供关于REDCap二次开发的详尽技术分析。它不仅探讨了架构先决条件、从旧版插件(Plugin)向现代外部模块框架的过渡、安全编码实践,还深入剖析了移动端同步的复杂机制。此外,报告详细列出了特定的源代码模式,分析了常见的陷阱(即开发中的“坑”),并提供了在定制功能时维护系统完整性的最佳实践。
|
||||
|
||||
### **1.1 联盟模式与源码访问权限的特殊性**
|
||||
|
||||
与传统的开源软件不同,REDCap在一种独特的管理模式下运行。它对非营利组织免费提供,但并非公共领域的开源软件。为了获得二次开发所需的源代码,组织必须通过与范德堡大学签署最终用户许可协议(EULA)加入REDCap联盟3。
|
||||
|
||||
这种区别对开发者至关重要。源代码无法在GitHub等公共存储库中以可运行的格式获取;严格来说,核心代码库是联盟的专有财产。然而,扩展机制——特别是外部模块框架——是公开文档化的,且社区通过REDCap Repo分享了数百个模块1。为了进行深度的二次开发,开发者通常需要其所在机构的REDCap管理员授予本地服务器访问权限,以便检查核心PHP文件和进行调试6。
|
||||
|
||||
銝𦒘<EFBFBD>蝏毺<EFBFBD>撘<EFBFBD>皞鞱蔓隞嗡<EFBFBD><EFBFBD>䕘<EFBFBD>REDCap<EFBFBD>其<EFBFBD>蝘滨𡠺<EFBFBD>寧<EFBFBD>蝞∠<EFBFBD>璅∪<EFBFBD>銝贝<EFBFBD>銵䎚<EFBFBD><EFBFBD><EFBFBD>撖寥<EFBFBD><EFBFBD>亙⏚蝏<EFBFBD><EFBFBD><EFBFBD>滩晶<EFBFBD>𣂷<EFBFBD>嚗䔶<EFBFBD>撟園<EFBFBD><EFBFBD>砍<EFBFBD>憸<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>皞鞱蔓隞嗚<EFBFBD><EFBFBD>蛹鈭<EFBFBD>繮敺𦯀<EFBFBD>甈∪<EFBFBD><EFBFBD>烐<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD>嚗𣬚<EFBFBD>蝏<EFBFBD><EFBFBD>憿駁<EFBFBD>朞<EFBFBD>銝舘<EFBFBD>敺瑕嵗憭批郎蝑曄蔡<EFBFBD><EFBFBD>蝏<EFBFBD>鍂<EFBFBD>瑁捂<EFBFBD>臬<EFBFBD>霈殷<EFBFBD>EULA嚗匧<EFBFBD><EFBFBD>充EDCap<EFBFBD>𠉛<EFBFBD>3<EFBFBD>?
|
||||
餈嗵<EFBFBD><EFBFBD>箏<EFBFBD>撖孵<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>秐<EFBFBD>喲<EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD><EFBFBD>䭾<EFBFBD><EFBFBD>沁itHub蝑匧<EFBFBD><EFBFBD>勗<EFBFBD><EFBFBD>典<EFBFBD>銝凋誑<EFBFBD>航<EFBFBD>銵𣬚<EFBFBD><EFBFBD>澆<EFBFBD><EFBFBD>瑕<EFBFBD>嚗𥕢艇<EFBFBD>潭䔉霂湛<EFBFBD><EFBFBD>詨<EFBFBD>隞<EFBFBD><EFBFBD>摨𤘪糓<EFBFBD>𠉛<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㕑揣鈭扼<EFBFBD><EFBFBD><EFBFBD><EFBFBD>䕘<EFBFBD><EFBFBD>拙<EFBFBD><EFBFBD>箏<EFBFBD><EFBFBD>婙<EFBFBD>𠉛鸌<EFBFBD>急糓憭㚚<EFBFBD>璅∪<EFBFBD>獢<EFBFBD>沲<EFBFBD>婙<EFBFBD>娍糓<EFBFBD>砍<EFBFBD><EFBFBD><EFBFBD>﹝<EFBFBD>𣇉<EFBFBD>嚗䔶<EFBFBD>蝷曉躹<EFBFBD>朞<EFBFBD>REDCap Repo<70><6F>澈鈭<E6BE88>㺭<EFBFBD>曆葵璅∪<E79285>1<EFBFBD><31>蛹鈭<E89BB9><E988AD>銵峕楛摨衣<E691A8>鈭峕活撘<E6B4BB><E69298>𡢅<EFBFBD>撘<EFBFBD><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD>𡁜虜<F0A1819C><E8999C>閬<EFBFBD><E996AC><EFBFBD><EFBFBD><EFBFBD>冽㦤<E586BD><E3A6A4><EFBFBD>REDCap蝞∠<E89D9E><E288A0>䀹<EFBFBD>鈭<EFBFBD>𧋦<EFBFBD>唳<EFBFBD><E594B3>∪膥霈輸䔮<E8BCB8><E494AE><EFBFBD>嚗䔶誑靘踵<E99D98><E8B8B5>交瓲敹<E793B2>HP<48><50>辣<EFBFBD>諹<EFBFBD>銵諹<E98AB5>霂?<3F>?
|
||||
### **1.2 技术架构:LAMP栈与EAV模型**
|
||||
|
||||
二次开发要求对REDCap的底层基础设施有深刻的理解。REDCap构建在LAMP栈之上:
|
||||
|
||||
* **Linux/Windows嚗?* <20>条恣摨𠉛鍂蝔见<E89D94><E8A781><EFBFBD><EFBFBD>雿𦦵頂蝏麄<E89D8F>?
|
||||
* **Apache/IIS/Nginx嚗?* 憭<><E686AD>HTTP霂瑟<E99C82><E7919F><EFBFBD>eb<65>滚𦛚<E6BB9A>具<EFBFBD>?
|
||||
* **MySQL/MariaDB嚗?* <20>喟頂<E5969F>𧢲㺭<F0A7A2B2>桀<EFBFBD>蝞∠<E89D9E>蝟餌<E89D9F><E9A48C>?
|
||||
* **PHP嚗?* <20>其<EFBFBD><E585B6>詨<EFBFBD><E8A9A8>餉<EFBFBD><E9A489>峕<EFBFBD>撅閧<E69285><E996A7>滚𦛚<E6BB9A>函垢<E587BD>𡁏𧋦霂剛<E99C82><E5899B>?
|
||||
REDCap鋡急<EFBFBD>餈唬蛹<EFBFBD>𡏭蝠<EFBFBD>讐漣<EFBFBD>嘅<EFBFBD><EFBFBD>𡁜虜<EFBFBD><EFBFBD>閬<EFBFBD>eb<EFBFBD>滚𦛚<EFBFBD>典<EFBFBD><EFBFBD>祉<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>桀<EFBFBD><EFBFBD>滚𦛚<EFBFBD>具<EFBFBD><EFBFBD>笆鈭擧<EFBFBD><EFBFBD><EFBFBD>蝙<EFBFBD>剁<EFBFBD>Web<EFBFBD>滚𦛚<EFBFBD>典<EFBFBD><EFBFBD>唳旿摨枏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>10GB<EFBFBD><EFBFBD><EFBFBD><EFBFBD>函征<EFBFBD>湧<EFBFBD>𡁜虜頞喃誑<EFBFBD>舀<EFBFBD>蝚砌<EFBFBD>撟渡<EFBFBD>擃睃撩摨虫蝙<EFBFBD>?<3F><><EFBFBD><EFBFBD>䕘<EFBFBD>鈭峕活撘<E6B4BB><E69298>穃<EFBFBD>敺<EFBFBD>隡𡁜蒂<F0A1819C>交凒擃条<E69383>韏<EFBFBD><E99F8F><EFBFBD><EFBFBD>瘙<EFBFBD><E79899><EFBFBD><EFBFBD>銵<EFBFBD><E98AB5><EFBFBD><EFBFBD>䰻霂X<E99C82><EFBCB8>朞<EFBFBD>API憭<49><E686AD>憭扳㺭<E689B3>桃<EFBFBD><E6A183>芸<EFBFBD>銋㗇芋<E39787>堒<EFBFBD><E5A092>𨀣𧊋蝏讛<E89D8F>隡睃<E99AA1>嚗<EFBFBD>虾<EFBFBD>賭<EFBFBD>蝏蹱㺭<E8B9B1>桀<EFBFBD>撣行䔉撌典之<E585B8>见<EFBFBD><E8A781>?
|
||||
<EFBFBD>唳旿摨𤘪芋撘譍蜓閬<EFBFBD><EFBFBD><EFBFBD>典<EFBFBD>雿?撅墧<E69285>?<3F>潘<EFBFBD>Entity-Attribute-Value, EAV嚗㗇芋<E39787>页<EFBFBD><E9A1B5>孵<EFBFBD><E5ADB5>盍edcap\_data銵剁<E98AB5>摰<EFBFBD>誑<EFBFBD>剔<EFBFBD><E58994><EFBFBD>熊<EFBFBD>烐聢撘𧶏<E69298>record\_id, project\_id, field\_name, value嚗匧<E59A97><E58CA7>函<EFBFBD>憭折<E686AD><E68A98><EFBFBD>★<EFBFBD>格㺭<E6A0BC>柴<EFBFBD><E69FB4><EFBFBD>銝<EFBFBD><E98A9D>嗆<EFBFBD><E59786>喟<EFBFBD><E5969F><EFBFBD>捂<EFBFBD>其<EFBFBD><E585B6>湔㺿<E6B994>唳旿摨𤘪芋撘讐<E69298><E8AE90><EFBFBD><EFBFBD>銝𧢲<E98A9D><F0A7A2B2><EFBFBD>𧑐<EFBFBD>𥕦遣<F0A595A6><E981A3>㺭<EFBFBD>桅店<E6A185>函<EFBFBD>銵典<E98AB5>嚗䔶<E59A97>餈蹱遬<E8B9B1>堒<EFBFBD><E5A092>牐<EFBFBD>鈭峕活撘<E6B4BB><E69298>睲葉<E79DB2>湔𦻖SQL<51>亥砭<E4BAA5><E7A0AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?<3F><><EFBFBD><EFBFBD>𤏸<EFBFBD><F0A48FB8><EFBFBD>憿餃<E686BF>敹<EFBFBD>𧑐瘚讛<E7989A>甇斗芋撘譍誑<E8AD8D>踹<EFBFBD><E8B8B9>扯<EFBFBD>銝钅<E98A9D><E99285>?
|
||||
* **Linux/Windows:** 托管应用程序的操作系统。
|
||||
* **Apache/IIS/Nginx:** 处理HTTP请求的Web服务器。
|
||||
* **MySQL/MariaDB:** 关系型数据库管理系统。
|
||||
* **PHP:** 用于核心逻辑和扩展的服务器端脚本语言。
|
||||
|
||||
REDCap被描述为“轻量级”,通常需要Web服务器和独立的数据库服务器。对于标准使用,Web服务器和数据库各分配10GB的存储空间通常足以支持第一年的高强度使用7。然而,二次开发往往会带来更高的资源需求。执行复杂查询或通过API处理大数据的自定义模块如果未经过优化,可能会给数据库带来巨大压力。
|
||||
|
||||
数据库模式主要采用实体-属性-值(Entity-Attribute-Value, EAV)模型,特别是redcap\_data表,它以狭窄的纵向格式(record\_id, project\_id, field\_name, value)存储绝大部分项目数据。这一架构决策允许在不更改数据库模式的情况下流畅地创建元数据驱动的表单,但这显著增加了二次开发中直接SQL查询的复杂性2。开发者必须小心地浏览此模式以避免性能下降。
|
||||
|
||||
## ---
|
||||
|
||||
**2\. 外部模块框架(External Module Framework):定制化的现代标准**
|
||||
|
||||
<EFBFBD><EFBFBD>蟮銝𠺪<EFBFBD>REDCap<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嗆糓<EFBFBD>朞<EFBFBD><EFBFBD>𣿯ooks嚗<EFBFBD>偬摮琜<EFBFBD><EFBFBD>嘥<EFBFBD><EFBFBD>憕lugins嚗<EFBFBD><EFBFBD>隞塚<EFBFBD><EFBFBD>嘥<EFBFBD><EFBFBD>啁<EFBFBD><EFBFBD>婙<EFBFBD>𥪜朖<EFBFBD>湔𦻖瘜典<EFBFBD>Web<EFBFBD>滚𦛚<EFBFBD>冽<EFBFBD>隞嗉楝敺<EFBFBD><EFBFBD><EFBFBD>𡁏𧋦<EFBFBD><EFBFBD>蒾<EFBFBD>嗉<EFBFBD>蝘齿䲮瘜閙<EFBFBD><EFBFBD><EFBFBD><EFBFBD>雿<EFBFBD><EFBFBD><EFBFBD>𧼮虜<EFBFBD><EFBFBD>摹嚗𢡱EDCap<EFBFBD>詨<EFBFBD><EFBFBD><EFBFBD><EFBFBD>蝥抒<EFBFBD>撣詨紡<EFBFBD>游<EFBFBD><EFBFBD>嗅<EFBFBD><EFBFBD>賢仃<EFBFBD><EFBFBD><EFBFBD>銝磰楊憭帋葵憿寧𤌍蝞∠<EFBFBD><EFBFBD><EFBFBD>𧋦<EFBFBD>刻<EFBFBD><EFBFBD>蹂<EFBFBD><EFBFBD>舐<EFBFBD><EFBFBD>鞟<EFBFBD>9<EFBFBD>?
|
||||
**憭㚚<E686AD>璅∪<E79285>嚗𠄌xternal Module, EM嚗㗇<E59A97><E39787>?*<2A><><EFBFBD><EFBFBD>亙蝠摨閙㺿<E99699>䀝<EFBFBD>鈭峕活撘<E6B4BB><E69298>𤑳<EFBFBD><F0A491B3>澆<EFBFBD><E6BE86><EFBFBD><EFBFBD>撠<EFBFBD>䌊摰帋<E691B0>隞<EFBFBD><E99A9E>撠<EFBFBD><E692A0><EFBFBD>典蒂<E585B8><E89282>𧋦<EFBFBD><F0A78BA6><EFBFBD>銝哨<E98A9D><E593A8>臭誑<E887AD>典<EFBFBD><E585B8>舐鍂<E88890>𡝗<EFBFBD>憿寧𤌍<E5AFA7>舐鍂嚗<E98D82>僎<EFBFBD>朞<EFBFBD><E69C9E>曉耦<E69B89>冽<EFBFBD><E586BD>屸𢒰嚗𠃑UI嚗㕑<E59A97>銵𣬚恣<F0A3AC9A><E681A3><EFBFBD>銝磰<E98A9D><E7A3B0>刻<EFBFBD><E588BB>笔<EFBFBD><E7AC94>曹澈1<E6BE88>?
|
||||
历史上,REDCap的定制是通过“Hooks(钩子)”和“Plugins(插件)”实现的——即直接注入Web服务器文件路径的脚本。虽然这种方法有效,但它非常脆弱;REDCap核心的升级经常导致定制功能失效,且跨多个项目管理版本在行政上是繁琐的9。
|
||||
|
||||
**外部模块(External Module, EM)框架**的引入彻底改变了二次开发的格局。它将自定义代码封装在带版本的包中,可以全局启用或按项目启用,并通过图形用户界面(GUI)进行管理,且能在联盟内共享1。
|
||||
|
||||
### **2.1 外部模块的解剖学结构**
|
||||
|
||||
銝<EFBFBD>銝芸<EFBFBD><EFBFBD>冽芋<EFBFBD>埈糓雿滢<EFBFBD>\<redcap-root\>/modules/<EFBFBD>桀<EFBFBD>銝讠<EFBFBD><EFBFBD><EFBFBD>辣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>賢<EFBFBD>蝥血<EFBFBD><EFBFBD>𧼮虜銝交聢嚗䨵<prefix\>\_v\<version\_number\><EFBFBD><EFBFBD><EFBFBD>憒<EFBFBD><EFBFBD>銝<EFBFBD>銝芰眏<EFBFBD>滨<EFBFBD>銝算<EFBFBD>𦣇ompany<EFBFBD>萘<EFBFBD>撘<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤑳<EFBFBD><EFBFBD>滢蛹<EFBFBD>𣿯ello World<6C>萘<EFBFBD>璅∪<E79285><E288AA>航<EFBFBD>雿滢<E99BBF>modules/company\_hello\_world\_v1.0.010<EFBFBD>?
|
||||
一个外部模块是位于\<redcap-root\>/modules/目录下的文件集合。其命名约定非常严格:\<prefix\>\_v\<version\_number\>。例如,一个由前缀为“company”的开发者开发的名为“Hello World”的模块可能位于modules/company\_hello\_world\_v1.0.010。
|
||||
|
||||
外部模块的核心组件如下表所示:
|
||||
|
||||
| 蝏<EFBFBD>辣<EFBFBD>滨妍 | <20><>辣<EFBFBD>?| <20>蠘<EFBFBD><E8A098>讛膩 |
|
||||
| 组件名称 | 文件名 | 功能描述 |
|
||||
| :---- | :---- | :---- |
|
||||
| **<EFBFBD>滨蔭皜<EFBFBD><EFBFBD>** | config.json | 摰帋<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>柴<EFBFBD><EFBFBD><EFBFBD><EFBFBD>僐<EFBFBD><EFBFBD>曎<EFBFBD>乓<EFBFBD><EFBFBD>頂蝏?憿寧𤌍霈曄蔭隞亙<E99A9E>Cron雿靝<E99BBF><E99D9D><EFBFBD><EFBFBD><EFBFBD>舀芋<E88880>㛖<EFBFBD><E39B96>亙藁<E4BA99>嫘<EFBFBD>?|
|
||||
| **<EFBFBD>餉<EFBFBD>蝐?* | Module.php | 蝏扳㗁<EFBFBD>服bstractExternalModule<EFBFBD><EFBFBD>HP蝐颯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>思<EFBFBD><EFBFBD>⊿<EFBFBD>餉<EFBFBD><EFBFBD>屸偬摮𣂼<EFBFBD><EFBFBD>啜<EFBFBD>?|
|
||||
| **<EFBFBD><EFBFBD>﹝** | README.md | 雿輻鍂霂湔<EFBFBD>嚗<EFBFBD>笆鈭擧<EFBFBD>鈭文<EFBFBD>Repo<EFBFBD>喳<EFBFBD><EFBFBD>滩<EFBFBD>嚗剹<EFBFBD>?|
|
||||
| **霈詨虾霂?* | LICENSE | 霈詨虾<EFBFBD>⊥狡嚗<EFBFBD><EFBFBD>𡁜虜銝撤IT<EFBFBD>𣇉掩隡潭辺甈曆誑靘蹂<EFBFBD><EFBFBD>𠉛<EFBFBD><EFBFBD>曹澈嚗剹<EFBFBD>?|
|
||||
| **颲<EFBFBD>𨭌<EFBFBD><EFBFBD>辣** | /pages, /js | <EFBFBD>其<EFBFBD>摮䀹𦆮<EFBFBD>芸<EFBFBD>銋厰△<EFBFBD>U<EFBFBD><EFBFBD>avaScript<EFBFBD>𥟟SS韏<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>桀<EFBFBD><EFBFBD>?|
|
||||
| **配置清单** | config.json | 定义元数据、权限、链接、系统/项目设置以及Cron作业。它是模块的入口点。 |
|
||||
| **逻辑类** | Module.php | 继承自AbstractExternalModule的PHP类。包含业务逻辑和钩子实现。 |
|
||||
| **文档** | README.md | 使用说明(对于提交到Repo至关重要)。 |
|
||||
| **许可证** | LICENSE | 许可条款(通常为MIT或类似条款以便于联盟共享)。 |
|
||||
| **辅助文件** | /pages, /js | 用于存放自定义页面、JavaScript或CSS资源的子目录。 |
|
||||
|
||||
#### **2.1.1 <EFBFBD>滨蔭<EFBFBD><EFBFBD>辣 (config.json) <EFBFBD><EFBFBD>楛摨西圾<EFBFBD>?*
|
||||
#### **2.1.1 配置文件 (config.json) 的深度解析**
|
||||
|
||||
config.json文件不仅是配置,它是模块的声明书。它告诉REDCap该模块能做什么以及它需要什么权限。如果JSON文件配置错误,模块将无法加载。
|
||||
|
||||
config.json<6F><6E>辣銝滢<E98A9D><E6BBA2>舫<EFBFBD>蝵殷<E89DB5>摰<EFBFBD>糓璅∪<E79285><E288AA><EFBFBD>ㄟ<EFBFBD>𦒘髡<F0A69298><E9ABA1><EFBFBD><EFBFBD>𡃏<EFBFBD>REDCap霂交芋<E4BAA4>𡑒<EFBFBD><F0A19192>帋<EFBFBD>銋<EFBFBD>誑<EFBFBD>𠰴<EFBFBD><F0A0B0B4><EFBFBD>閬<EFBFBD><E996AC>銋<EFBFBD><E98A8B><EFBFBD>僐<EFBFBD><E58390><EFBFBD><EFBFBD>䯀SON<4F><4E>辣<EFBFBD>滨蔭<E6BBA8>躰秤嚗峕芋<E5B395>堒<EFBFBD><E5A092>䭾<EFBFBD><E4ADBE>㰘蝸<E3B098>?
|
||||
**源代码示范:config.json结构**
|
||||
|
||||
JSON
|
||||
|
||||
{
|
||||
"name": "Advanced Data Processor",
|
||||
"description": "<EFBFBD>其<EFBFBD>摮䀹𧒄憭<EFBFBD><EFBFBD><EFBFBD>唳旿撟嗡<EFBFBD>憭㚚<EFBFBD>API<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?,
|
||||
"description": "在保存时处理数据并与外部API集成。",
|
||||
"permissions": \[
|
||||
"redcap\_save\_record",
|
||||
"redcap\_every\_page\_top"
|
||||
@@ -54,14 +65,14 @@ JSON
|
||||
"links": {
|
||||
"project": \[
|
||||
{
|
||||
"name": "<EFBFBD>唳旿憭<EFBFBD><EFBFBD>隞芾”<EFBFBD>?,
|
||||
"name": "数据处理仪表盘",
|
||||
"icon": "fas fa-chart-line",
|
||||
"url": "pages/dashboard.php"
|
||||
}
|
||||
\],
|
||||
"control-center": \[
|
||||
{
|
||||
"name": "憭<EFBFBD><EFBFBD><EFBFBD>冽𠯫敹?,
|
||||
"name": "处理器日志",
|
||||
"icon": "fas fa-server",
|
||||
"url": "pages/admin\_logs.php"
|
||||
}
|
||||
@@ -71,10 +82,12 @@ JSON
|
||||
"authors":
|
||||
}
|
||||
|
||||
*獢<><E78DA2><EFBFBD><EFBFBD><EFBFBD>嚗? permissions<6E>啁<EFBFBD><E59581>曉<EFBFBD>霂瑟<E99C82>撖寧鸌摰𡁻偬摮鞟<E691AE>霈輸䔮<E8BCB8><E494AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𨀣迨憭<E8BFA8>𧊋<EFBFBD>堒枂<E5A092>𣂷葵<F0A382B7>拙<EFBFBD>嚗<EFBFBD>朖雿踹銁PHP蝐颱葉摰帋<E691B0>鈭<EFBFBD>砲<EFBFBD>賣㺭嚗<E3BAAD><E59A97>銋<EFBFBD>偶餈靝<E9A488>隡𡁏<E99AA1>銵䎚<E98AB5><E48E9A>roject-settings<67>啁<EFBFBD><E59581>券★<E588B8>株挽蝵桅△<E6A185>V葉<EFBCB6>𥕦遣鈭<E981A3><E988AD>銝果UI嚗<49><E59A97>霈貊鍂<E8B28A>瑕銁銝齿𦻖閫虫誨<E899AB><E8AAA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝钅<E98A9D>蝵格芋<E6A0BC>?1<>?
|
||||
#### **2.1.2 璅∪<E79285>蝐?(ExternalModule.php) <20><><EFBFBD><EFBFBD>圈<EFBFBD>餉<EFBFBD>**
|
||||
*案例分析:* permissions数组显式请求对特定钩子的访问权限。如果此处未列出某个钩子,即使在PHP类中定义了该函数,它也永远不会执行。project-settings数组在项目设置页面中创建了一个GUI,允许用户在不接触代码的情况下配置模块11。
|
||||
|
||||
#### **2.1.2 模块类 (ExternalModule.php) 的实现逻辑**
|
||||
|
||||
这个文件包含扩展AbstractExternalModule的PHP类。这种继承提供了对框架辅助方法的访问,如getProjectSetting、query和日志记录功能。
|
||||
|
||||
餈嗘葵<EFBFBD><EFBFBD>辣<EFBFBD><EFBFBD>鉄<EFBFBD>拙<EFBFBD>AbstractExternalModule<EFBFBD><EFBFBD>HP蝐颯<EFBFBD><EFBFBD><EFBFBD>蝘滨誧<EFBFBD>踵<EFBFBD>靘𥕢<EFBFBD>撖寞<EFBFBD><EFBFBD>嗉<EFBFBD><EFBFBD>拇䲮瘜閧<EFBFBD>霈輸䔮嚗<EFBFBD><EFBFBD>getProjectSetting<EFBFBD><EFBFBD>uery<EFBFBD>峕𠯫敹𡑒扇敶訫<EFBFBD><EFBFBD>賬<EFBFBD>?
|
||||
**源代码示范:类结构与逻辑封装**
|
||||
|
||||
PHP
|
||||
@@ -87,7 +100,7 @@ use REDCap;
|
||||
|
||||
class AdvancedDataProcessor extends AbstractExternalModule {
|
||||
|
||||
// 敶栞扇敶蓥<EFBFBD>摮䀹𧒄<EFBFBD>芸𢆡閫血<EFBFBD><EFBFBD><EFBFBD>䲮瘜?
|
||||
// 当记录保存时自动触发的方法
|
||||
public function redcap\_save\_record($project\_id, $record, $instrument, $event\_id, $group\_id, $survey\_hash, $response\_id, $repeat\_instance) {
|
||||
|
||||
// 1\. 检查该项目是否启用了模块逻辑
|
||||
@@ -95,9 +108,9 @@ class AdvancedDataProcessor extends AbstractExternalModule {
|
||||
return;
|
||||
}
|
||||
|
||||
// 2\. <EFBFBD>脫迫<EFBFBD>𣳇<EFBFBD>敺芰㴓嚗?Infinite Loop Trap)
|
||||
// 憒<EFBFBD><EFBFBD>甇文遆<EFBFBD>唬<EFBFBD>摮䀹㺭<EFBFBD>殷<EFBFBD>摰<EFBFBD>虾<EFBFBD>賭<EFBFBD><EFBFBD>齿活閫血<EFBFBD>redcap\_save\_record<EFBFBD>?
|
||||
// 雿輻鍂<EFBFBD>蹱<EFBFBD><EFBFBD><EFBFBD>敹埈<EFBFBD>璉<EFBFBD><EFBFBD>乩<EFBFBD>摮䀹糓<EFBFBD>衣眏<EFBFBD>祆芋<EFBFBD>𡑒圻<EFBFBD>烐糓敹<EFBFBD>◆<EFBFBD><EFBFBD><EFBFBD>?
|
||||
// 2\. 防止无限循环!(Infinite Loop Trap)
|
||||
// 如果此函数保存数据,它可能会再次触发redcap\_save\_record。
|
||||
// 使用静态标志或检查保存是否由本模块触发是必须的。
|
||||
static $is\_processing \= false;
|
||||
if ($is\_processing) return;
|
||||
$is\_processing \= true;
|
||||
@@ -106,7 +119,7 @@ class AdvancedDataProcessor extends AbstractExternalModule {
|
||||
// 3\. 执行核心逻辑
|
||||
$this\-\>processData($project\_id, $record, $instrument);
|
||||
} catch (\\Exception $e) {
|
||||
$this\-\>emError("憭<EFBFBD><EFBFBD>霈啣<EFBFBD> $record <EFBFBD>嗅枂<EFBFBD>? ". $e\-\>getMessage());
|
||||
$this\-\>emError("处理记录 $record 时出错: ". $e\-\>getMessage());
|
||||
}
|
||||
|
||||
$is\_processing \= false;
|
||||
@@ -119,40 +132,50 @@ class AdvancedDataProcessor extends AbstractExternalModule {
|
||||
}
|
||||
}
|
||||
|
||||
餈嗵<EFBFBD>蝏𤘪<EFBFBD>蝖桐<EFBFBD>鈭<EFBFBD><EFBFBD>鋆<EFBFBD><EFBFBD>扼<EFBFBD><EFBFBD><EFBFBD>朞<EFBFBD>雿輻鍂namespace嚗峕芋<EFBFBD>烾<EFBFBD><EFBFBD>滢<EFBFBD>銝𤾸<EFBFBD>隞硋虾<EFBFBD>賭蝙<EFBFBD>函㮾隡潛掩<EFBFBD>滨<EFBFBD>璅∪<EFBFBD><EFBFBD>𤑳<EFBFBD><EFBFBD>脩<EFBFBD>13<EFBFBD>?
|
||||
这种结构确保了封装性。通过使用namespace,模块避免了与其他可能使用相似类名的模块发生冲突13。
|
||||
|
||||
### **2.2 关键钩子(Hooks)与事件处理机制**
|
||||
|
||||
<EFBFBD>拙<EFBFBD><EFBFBD>臬僕憸<EFBFBD>EDCap撌乩<EFBFBD>瘚<EFBFBD><EFBFBD>銝餉<EFBFBD><EFBFBD>箏<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞砍<EFBFBD>霈詨<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>銁摨𠉛鍂蝔见<EFBFBD><EFBFBD>笔𦶢<EFBFBD>冽<EFBFBD><EFBFBD><EFBFBD>鸌摰𡁶<EFBFBD><EFBFBD>扯<EFBFBD>隞<EFBFBD><EFBFBD>9<EFBFBD>?
|
||||
#### **2.2.1 redcap\_save\_record嚗𡁏瓲敹<E793B2>㺭<EFBFBD>桀<EFBFBD><E6A180>?*
|
||||
钩子是干预REDCap工作流的主要机制。它们允许开发者在应用程序生命周期的特定点执行代码9。
|
||||
|
||||
餈蹱糓鈭峕活撘<EFBFBD><EFBFBD>睲葉<EFBFBD><EFBFBD><EFBFBD>滩<EFBFBD><EFBFBD><EFBFBD>偬摮僐<EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽㺭<EFBFBD>桀歇<EFBFBD>𣂷漱<EFBFBD>唳㺭<EFBFBD>桀<EFBFBD>*銋见<E98A8B>*嚗䔶<E59A97><E494B6>函鍂<E587BD>瑞<EFBFBD><E7919E>啁&霈斗<E99C88><E69697>臭<EFBFBD><E887AD>㵪<EFBFBD><E3B5AA>冽<EFBFBD>鈭𥕢<E988AD>銝𧢲<E98A9D>銝哨<E98A9D><E593A8>硋銁<E7A18B>𤾸蝱靽嘥<E99DBD><E598A5>𡒊<EFBFBD><F0A1928A>唾圻<E594BE>㻫<EFBFBD>?
|
||||
* **<2A><>㺭霂西圾嚗?* $project\_id嚗<64>★<EFBFBD>埋D嚗? $record嚗<64>扇敶訫<E695B6>嚗? $instrument嚗<74>”<EFBFBD>訫<EFBFBD>嚗? $event\_id嚗<64><E59A97>隞貂D嚗? $group\_id嚗<64>㺭<EFBFBD>株挪<E6A0AA>桃<EFBFBD>ID嚗? $survey\_hash嚗<68><E59A97><EFBFBD>亙<EFBFBD>撣䕘<E692A3>, $response\_id嚗<64><E59A97>摨㶏D嚗? $repeat\_instance嚗<65><E59A97>憭滚<E686AD>靘页<E99D98>14<31>?
|
||||
#### **2.2.1 redcap\_save\_record:核心数据处理**
|
||||
|
||||
这是二次开发中最重要的钩子。它在数据已提交到数据库*之后*,但在用户看到确认消息之前(在某些上下文中)或在后台保存后立即触发。
|
||||
|
||||
* **参数详解:** $project\_id(项目ID), $record(记录名), $instrument(表单名), $event\_id(事件ID), $group\_id(数据访问组ID), $survey\_hash(调查哈希), $response\_id(响应ID), $repeat\_instance(重复实例)14。
|
||||
* **最佳应用场景:**
|
||||
* **<EFBFBD>芸𢆡霂<EFBFBD><EFBFBD>銝舘恣蝞梹<EFBFBD>** 憭<><E686AD>REDCap<61><70>蔭霈∠<E99C88>摮埈挾<E59F88>䭾<EFBFBD>憭<EFBFBD><E686AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>靘见<E99D98>嚗諹楊鈭衤辣霈∠<E99C88><E288A0>𡝗<EFBFBD><F0A19D97>𦠜辺隞園<E99A9E>餉<EFBFBD><E9A489><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
* **<EFBFBD>唳旿敶訫<EFBFBD>閫血<EFBFBD><EFBFBD>剁<EFBFBD>DET嚗㗇芋<EFBFBD><EFBFBD><EFBFBD>** 靽嘥<E99DBD><E598A5>嗥<EFBFBD><E597A5>喳<EFBFBD><E596B3>唳旿<E594B3>券<EFBFBD><E588B8><EFBFBD>憭㚚<E686AD>瘜典<E7989C>銵冽<E98AB5><E586BD>萄<EFBFBD><E89084><EFBFBD><EFBFBD>蝟餌<E89D9F>嚗𠄌MR嚗剹<E59A97>?
|
||||
* **<EFBFBD>唳旿<EFBFBD>峕郊嚗?* <20>芸𢆡撠<F0A286A1><E692A0>𦦵<EFBFBD><F0A6A6B5>争<EFBFBD>嗪★<E597AA>桐葉<E6A190><E89189>㺭<EFBFBD>桀<EFBFBD><E6A180>嗅<EFBFBD><E59785>靝蜓<E99D9D>𠉛弦<F0A0899B>嗪★<E597AA>桐葉17<31>?
|
||||
* **<EFBFBD>游𦶢<EFBFBD>琿𩐠嚗㇍he Infinite Loop嚗㚁<EFBFBD>** 銝<>銝芸虜閫<E8999C><E996AB><EFBFBD>躰秤<E8BAB0>盍edcap\_save\_record<EFBFBD><EFBFBD><EFBFBD>靚<EFBFBD>鍂REDCap::saveData<EFBFBD><EFBFBD>眏鈭粃aveData隡𡁜<EFBFBD>甈∟圻<EFBFBD>𩹨edcap\_save\_record嚗諹<EFBFBD>隡𡁜紡<EFBFBD>湔<EFBFBD><EFBFBD>鞾<EFBFBD>鍦<EFBFBD>嚗峕<EFBFBD>蝏<EFBFBD>紡<EFBFBD>湔<EFBFBD><EFBFBD>∪膥撏拇<EFBFBD>嚗<EFBFBD>挾<EFBFBD>躰秤<EFBFBD>硋<EFBFBD>摮䁅<EFBFBD>堒偷嚗剹<EFBFBD>?
|
||||
* *閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗? 撘<><E69298>𤏸<EFBFBD><F0A48FB8><EFBFBD>憿餃<E686BF><E9A483>恍<EFBFBD>餉<EFBFBD><E9A489>交<EFBFBD><E4BAA4>乩<EFBFBD>摮䀹糓<E480B9>血歇<E8A180>刻<EFBFBD>銵䔶葉嚗峕<E59A97>雿輻鍂<E8BCBB><E98D82><EFBFBD><EFBFBD>典遆<E585B8>啁眏璅∪<E79285><E288AA>祈澈閫血<E996AB><E8A180>嗆<EFBFBD><E59786>漤<EFBFBD><E6BCA4><EFBFBD>箝<EFBFBD>?
|
||||
* **自动评分与计算:** 处理REDCap内置计算字段无法处理的复杂评分(例如,跨事件计算或涉及条件逻辑的聚合)。
|
||||
* **数据录入触发器(DET)模拟:** 保存时立即将数据推送到外部注册表或电子病历系统(EMR)。
|
||||
* **数据同步:** 自动将“筛选”项目中的数据复制到“主研究”项目中17。
|
||||
* **致命陷阱(The Infinite Loop):** 一个常见的错误是redcap\_save\_record内部调用REDCap::saveData。由于saveData会再次触发redcap\_save\_record,这会导致无限递归,最终导致服务器崩溃(段错误或内存耗尽)。
|
||||
* *解决方案:* 开发者必须包含逻辑来检查保存是否已在进行中,或使用标志在函数由模块本身触发时提前退出。
|
||||
|
||||
#### **2.2.2 redcap\_every\_page\_top:UI注入与全局控制**
|
||||
|
||||
甇日偬摮𣂼銁瘥譍葵憿寧𤌍銝𠹺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>憿菟𢒰<EFBFBD>㰘蝸<EFBFBD>嗆<EFBFBD>銵䎚<EFBFBD>?
|
||||
* **<2A><>雿喳<E99BBF><E596B3>典㦤<E585B8>荔<EFBFBD>**
|
||||
* **UI/DOM<4F>滢<EFBFBD>嚗?* 瘜典<E7989C>JavaScript嚗<74>掩隡嘯hazam璅∪<E79285><E288AA><EFBFBD>䲮瘜𤏪<E7989C><F0A48FAA>乩耨<E4B9A9>道OM嚗<4D>抅鈭𤾸<E988AD><F0A4BEB8><EFBFBD><EFBFBD>餉<EFBFBD><E9A489>鞱<EFBFBD>摮埈挾嚗峕<E59A97><E5B395>湔㺿隞芸膥<E88AB8><E886A5><EFBFBD>閫?3<>?
|
||||
* **CSS瘜典<EFBFBD>嚗?* <20>㰘蝸<E3B098>芸<EFBFBD>銋㗇甅撘讛”隞亙笆憿寧𤌍餈𥡝<E9A488><F0A5A19D><EFBFBD><EFBFBD><EFBFBD>硔<EFBFBD>?
|
||||
* **<EFBFBD>扯<EFBFBD>霅血<EFBFBD>嚗?* <20>曹<EFBFBD>甇日偬摮𣂼銁*瘥譍<E798A5>憿?餈鞱<E9A488>嚗<EFBFBD>銁甇日偬摮𣂼<E691AE>餈𥡝<E9A488>蝜<EFBFBD><E89D9C><EFBFBD><EFBFBD>㺭<EFBFBD>桀<EFBFBD><E6A180>亥砭撠<E7A0AD>艇<EFBFBD>漤<EFBFBD>雿𡒊鍂<F0A1928A>瑚<EFBFBD>撉䎚<E69289><E48E9A>迨憭<E8BFA8><E686AD>隞<EFBFBD><E99A9E>敹<EFBFBD>◆<EFBFBD><E29786>漲頧駁<E9A0A7><E9A781>?
|
||||
#### **2.2.3 redcap\_survey\_complete嚗𡁜<E59A97>銝舘<E98A9D><E88898><EFBFBD>蝔𧢲綉<F0A7A2B2>?*
|
||||
此钩子在每个项目上下文的页面加载时执行。
|
||||
|
||||
* **最佳应用场景:**
|
||||
* **UI/DOM操作:** 注入JavaScript(类似Shazam模块的方法)来修改DOM,基于复杂逻辑隐藏字段,或更改仪器的外观13。
|
||||
* **CSS注入:** 加载自定义样式表以对项目进行品牌化。
|
||||
* **性能警告:** 由于此钩子在*每一页*运行,在此钩子内进行繁重的数据库查询将严重降低用户体验。此处的代码必须极度轻量。
|
||||
|
||||
#### **2.2.3 redcap\_survey\_complete:参与者流程控制**
|
||||
|
||||
类似于save\_record,但专用于调查完成时。这是根据参与者的回答将他们重定向到不同URL,或发送超出标准“警报和通知”模块功能的自定义电子邮件通知的理想钩子18。
|
||||
|
||||
蝐颱撮鈭粃ave\_record嚗䔶<E59A97>銝梶鍂鈭舘<E988AD><E88898>亙<EFBFBD><E4BA99>鞉𧒄<E99E89><F0A79284><EFBFBD><EFBFBD>舀覔<E88880>桀<EFBFBD>銝舘<E98A9D><E88898><EFBFBD><EFBFBD>䂿<EFBFBD>撠<EFBFBD><E692A0>隞祇<E99A9E>摰𡁜<E691B0><F0A1819C>唬<EFBFBD><E594AC>𪄇RL嚗峕<E59A97><E5B395>煾<EFBFBD><E785BE><EFBFBD><EFBFBD>箸<EFBFBD><E7AEB8><EFBFBD><EFBFBD>𡏭郎<F0A18FAD>亙<EFBFBD><E4BA99>𡁶䰻<F0A181B6>脲芋<E884B2>堒<EFBFBD><E5A092>賜<EFBFBD><E8B39C>芸<EFBFBD>銋厩㩞摮鞾<E691AE>隞園<E99A9E>𡁶䰻<F0A181B6><E4B0BB><EFBFBD><EFBFBD>喲偬摮?8<>?
|
||||
## ---
|
||||
|
||||
**3\. 数据库交互与安全工程**
|
||||
|
||||
鈭峕活撘<EFBFBD><EFBFBD>睲葉<EFBFBD><EFBFBD>憭抒<EFBFBD>憌𡡞埯銋衤<EFBFBD><EFBFBD>臭<EFBFBD>敶梶<EFBFBD><EFBFBD>唳旿摨㮖漱鈭𡜐<EFBFBD>餈坔虾<EFBFBD>賢紡<EFBFBD>巽QL瘜典<EFBFBD>嚗𠄎QLi嚗㗇<EFBFBD>瘣𠺶<EFBFBD><EFBFBD><EFBFBD>鈭竃EDCap摮睃<EFBFBD><EFBFBD>𤩺<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靽脲擪<EFBFBD>亙熒靽⊥<EFBFBD>嚗㇊HI嚗㚁<EFBFBD>摰匧<EFBFBD><EFBFBD>扯秐<EFBFBD>喲<EFBFBD>閬<EFBFBD><EFBFBD>?
|
||||
二次开发中最大的风险之一是不当的数据库交互,这可能导致SQL注入(SQLi)漏洞。鉴于REDCap存储敏感的受保护健康信息(PHI),安全性至关重要。
|
||||
|
||||
### **3.1 抽象查询方法与SQL注入防御**
|
||||
|
||||
<EFBFBD>冽唂<EFBFBD><EFBFBD><EFBFBD>隞嗡葉嚗<EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD>撣訾蝙<EFBFBD>牡b\_query("SELECT \* FROM table WHERE id \= $id")<EFBFBD>?*餈蹱糓銝仿<E98A9D><E4BBBF><EFBFBD><EFBFBD><EFBFBD>刻<EFBFBD>閫?*嚗<><E59A97>銝箏<E98A9D><E7AE8F>?id<69>舐鍂<E88890>瑁<EFBFBD><E79181>伐<EFBFBD>摰<EFBFBD><E691B0>霈祿QL瘜典<E7989C>19<31>?
|
||||
憭㚚<EFBFBD>璅∪<EFBFBD>獢<EFBFBD>沲撘訫<EFBFBD>鈭<EFBFBD><EFBFBD><EFBFBD>函<EFBFBD><EFBFBD>亥砭蝐颯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD>雿輻鍂$this-\>query()嚗<><E59A97>ExternalModules::query嚗㚁<E59A97>霂交䲮瘜閙𣈲<E99699><F0A388B2><EFBFBD><EFBFBD>啣<EFBFBD><E595A3>亥砭<E4BAA5>?
|
||||
**<EFBFBD><EFBFBD>摹隞<EFBFBD><EFBFBD>嚗<EFBFBD>艇蝳<EFBFBD>蝙<EFBFBD>剁<EFBFBD>嚗?*
|
||||
在旧版插件中,开发者经常使用db\_query("SELECT \* FROM table WHERE id \= $id")。**这是严重的安全违规**,因为如果$id是用户输入,它允许SQL注入19。
|
||||
|
||||
外部模块框架引入了安全的查询类。开发者应使用$this-\>query()(或ExternalModules::query),该方法支持参数化查询。
|
||||
|
||||
**脆弱代码(严禁使用):**
|
||||
|
||||
PHP
|
||||
|
||||
@@ -160,11 +183,11 @@ PHP
|
||||
$sql \= "SELECT value FROM redcap\_data WHERE project\_id \= ". $\_GET\['pid'\]. " AND field\_name \= '". $\_GET\['field'\]. "'";
|
||||
$q \= db\_query($sql);
|
||||
|
||||
**摰匧<EFBFBD>隞<EFBFBD><EFBFBD>嚗<EFBFBD><EFBFBD>雿喳<EFBFBD>頝蛛<EFBFBD>嚗?*
|
||||
**安全代码(最佳实践):**
|
||||
|
||||
PHP
|
||||
|
||||
// <EFBFBD><EFBFBD>㺭<EFBFBD>𡝗䰻霂?
|
||||
// 参数化查询
|
||||
$sql \= "SELECT value FROM redcap\_data WHERE project\_id \=? AND field\_name \=?";
|
||||
$q \= $this\-\>query($sql, \[$project\_id, $field\_name\]);
|
||||
|
||||
@@ -172,43 +195,55 @@ while ($row \= $q\-\>fetch\_assoc()) {
|
||||
// 安全处理数据
|
||||
}
|
||||
|
||||
雿輻鍂?<3F>牐<EFBFBD>蝚衣&靽脲㺭<E884B2>桀<EFBFBD>撽勗𢆡蝔见<E89D94>撖寡<E69296><E5AFA1>亥<EFBFBD>銵諹蓮銋㚁<E98A8B>隞舘<E99A9E>䔶葉<E494B6>峕𤫇<E5B395>餉<EFBFBD><E9A489>釣<EFBFBD>亦<EFBFBD>隞颱<E99A9E><E9A2B1>嗆<EFBFBD>SQL<51>賭誘11<31>?
|
||||
使用?占位符确保数据库驱动程序对输入进行转义,从而中和攻击者注入的任何恶意SQL命令11。
|
||||
|
||||
### **3.2 跨站脚本攻击(XSS)的防御**
|
||||
|
||||
敶𤘪芋<EFBFBD>堒<EFBFBD>瘚讛<EFBFBD><EFBFBD>刻<EFBFBD><EFBFBD>箸㺭<EFBFBD>格𧒄<EFBFBD>婙<EFBFBD>𥪜陘<EFBFBD>嗆糓<EFBFBD>冽<EFBFBD>颲枏<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>栽<EFBFBD>婙<EFBFBD>𥪜<EFBFBD>憿駁俈甇°SS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>𦦵鍂<EFBFBD>瑕銁<EFBFBD><EFBFBD>𧋦摮埈挾銝剛<EFBFBD><EFBFBD>功<script\>alert('Hack');\</script\>嚗諹<E59A97>峕芋<E5B395>堒銁隞芾”<E88ABE>蹂<EFBFBD><E8B982>曄內霂亙<E99C82>畾萎<E795BE><E8908E>芾<EFBFBD>銵諹蓮銋㚁<E98A8B><E39A81>𡁏𧋦撠<F0A78BA6>銁<EFBFBD>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD>瘚讛<E7989A><E8AE9B>其葉<E585B6>扯<EFBFBD><E689AF>?
|
||||
当模块向浏览器输出数据时——尤其是用户输入的数据——必须防止XSS。如果用户在文本字段中输入\<script\>alert('Hack');\</script\>,而模块在仪表板上显示该字段且未进行转义,脚本将在查看者的浏览器中执行。
|
||||
|
||||
最佳实践:
|
||||
憪讠<EFBFBD>撠<EFBFBD><EFBFBD><EFBFBD>箏<EFBFBD>鋆孵銁REDCap::escapeHtml()銝哨<EFBFBD><EFBFBD>碶蝙<EFBFBD>冽<EFBFBD><EFBFBD>嗥<EFBFBD>撘箏<EFBFBD><EFBFBD>寞<EFBFBD><EFBFBD>?
|
||||
始终将输出包裹在REDCap::escapeHtml()中,或使用框架的强制方法。
|
||||
|
||||
PHP
|
||||
|
||||
echo "用户备注: ". REDCap::escapeHtml($user\_note);
|
||||
|
||||
<EFBFBD>芾<EFBFBD><EFBFBD>扯<EFBFBD>甇斗<EFBFBD>雿𨀣糓璅∪<EFBFBD><EFBFBD>刻<EFBFBD><EFBFBD>笔恣<EFBFBD>亥<EFBFBD>蝔衤葉鋡急<EFBFBD>蝏萘<EFBFBD>銝餉<EFBFBD><EFBFBD>笔<EFBFBD>22<EFBFBD>?
|
||||
未能执行此操作是模块在联盟审查过程中被拒绝的主要原因22。
|
||||
|
||||
### **3.3 数据访问组(DAGs)与权限隔离**
|
||||
|
||||
敶梶凒<EFBFBD>仿<EFBFBD>撖雹edcap\_data蝻硋<EFBFBD>SQL<EFBFBD>亥砭<EFBFBD>塚<EFBFBD>璅∪<EFBFBD>隡𡁶<EFBFBD>餈𧍒EDCap<EFBFBD><EFBFBD><EFBFBD><EFBFBD>函<EFBFBD>摨讐漣摰匧<EFBFBD><EFBFBD>改<EFBFBD><EFBFBD><EFBFBD>𡠺<EFBFBD>唳旿霈輸䔮蝏<EFBFBD><EFBFBD>DAGs嚗剹<EFBFBD><EFBFBD>䰻霂W虾<EFBFBD>賭<EFBFBD><EFBFBD>䭾<EFBFBD>銝剛<EFBFBD><EFBFBD>鮋★<EFBFBD>桐葉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㕑扇敶𤏪<EFBFBD>隞舘<EFBFBD><EFBFBD><EFBFBD>霈貊<EFBFBD><EFBFBD>農<EFBFBD><EFBFBD>鍂<EFBFBD>瑞<EFBFBD><EFBFBD>啁<EFBFBD><EFBFBD>運<EFBFBD><EFBFBD>㺭<EFBFBD>柴<EFBFBD>?
|
||||
当直接针对redcap\_data编写SQL查询时,模块会绕过REDCap的应用程序级安全性,包括数据访问组(DAGs)。查询可能会无意中返回项目中的所有记录,从而允许站点A的用户看到站点B的数据。
|
||||
|
||||
最佳实践:
|
||||
<EFBFBD>芾<EFBFBD><EFBFBD>航<EFBFBD>嚗諹窈雿輻鍂REDCap::getData()<EFBFBD>寞<EFBFBD>隞<EFBFBD>𤜯<EFBFBD>笔<EFBFBD>SQL<EFBFBD><EFBFBD>EDCap::getData()隡朞䌊<EFBFBD>典<EFBFBD><EFBFBD>䄂AG<EFBFBD>𣬚鍂<EFBFBD>瑟<EFBFBD><EFBFBD>僐<EFBFBD>?
|
||||
只要可能,请使用REDCap::getData()方法代替原始SQL。REDCap::getData()会自动尊重DAG和用户权限。
|
||||
|
||||
PHP
|
||||
|
||||
$data \= REDCap::getData($project\_id, 'array', $record\_id);
|
||||
|
||||
憒<EFBFBD><EFBFBD><EFBFBD>箔<EFBFBD><EFBFBD>扯<EFBFBD><EFBFBD>笔<EFBFBD>敹<EFBFBD>◆雿輻鍂<EFBFBD>笔<EFBFBD>SQL嚗<EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD>?敹<>◆*<2A>见𢆡餈墧𦻖redcap\_data\_access\_groups銵剁<E98AB5>撟嗆覔<E59786>桀<EFBFBD><E6A180>滨鍂<E6BBA8>瑞<EFBFBD>group\_id餈𥡝<E9A488>餈<EFBFBD>誘24<32>?
|
||||
如果出于性能原因必须使用原始SQL,开发者*必须*手动连接redcap\_data\_access\_groups表,并根据当前用户的group\_id进行过滤24。
|
||||
|
||||
## ---
|
||||
|
||||
**4\. 移动端交互:REDCap Mobile App深度解析**
|
||||
|
||||
REDCap<EFBFBD>滚𦛚<EFBFBD>其<EFBFBD>蝘餃𢆡霈曉<EFBFBD>銋钅𡢿<EFBFBD><EFBFBD>漱鈭埝糓鈭峕活撘<EFBFBD><EFBFBD>𤑳<EFBFBD><EFBFBD>喲睸憸<EFBFBD><EFBFBD>嚗𣬚鸌<EFBFBD>急糓<EFBFBD>其<EFBFBD><EFBFBD>𠉛<EFBFBD>餈墧𦻖颲<EFBFBD>榆<EFBFBD><EFBFBD>𧑐<EFBFBD>箄<EFBFBD>銵<EFBFBD><EFBFBD><EFBFBD>啁<EFBFBD>蝛嗆𧒄<EFBFBD>?
|
||||
### **4.1 REDCap Mobile App<70><70>沲<EFBFBD><E6B2B2><EFBFBD>撌乩<E6928C>瘚?*
|
||||
REDCap服务器与移动设备之间的交互是二次开发的关键领域,特别是在互联网连接较差的地区进行实地研究时。
|
||||
|
||||
### **4.1 REDCap Mobile App的架构与工作流**
|
||||
|
||||
REDCap Mobile App是一个“胖客户端”,它将项目结构(元数据)和数据(可选)下载到本地设备。它充当本地Web服务器,允许离线数据收集。当恢复连接时,它通过REDCap API将数据同步回中央服务器25。
|
||||
|
||||
REDCap Mobile App<70>臭<EFBFBD>銝芬<E98A9D>𡏭<EFBFBD>摰X<E691B0>蝡胼<E89DA1>嘅<EFBFBD>摰<EFBFBD><E691B0>憿寧𤌍蝏𤘪<E89D8F>嚗<EFBFBD><E59A97><EFBFBD>唳旿嚗匧<E59A97><E58CA7>唳旿嚗<E697BF>虾<EFBFBD>㚁<EFBFBD>銝贝蝸<E8B49D>唳𧋦<E594B3>啗挽憭<E68CBD><E686AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>砍𧑐Web<65>滚𦛚<E6BB9A>剁<EFBFBD><E58981><EFBFBD>捂蝳餌瑪<E9A48C>唳旿<E594B3>園<EFBFBD><E59C92><EFBFBD><EFBFBD><EFBFBD>W<EFBFBD>餈墧𦻖<E5A2A7>塚<EFBFBD>摰<EFBFBD><E691B0>朞<EFBFBD>REDCap API撠<49>㺭<EFBFBD>桀<EFBFBD>甇亙<E79487>銝剖亢<E58996>滚𦛚<E6BB9A>?5<>?
|
||||
### **4.2 API同步机制与JSON Payload**
|
||||
|
||||
<EFBFBD>峕郊餈<EFBFBD><EFBFBD>擃睃漲靘肽<EFBFBD>鈭垾PI隞斤<EFBFBD>嚗㇍oken嚗剹<EFBFBD>?
|
||||
1. **隞斤<E99A9E><E696A4><EFBFBD><EFBFBD>嚗?* <20>冽<EFBFBD><E586BD>冽<EFBFBD><E586BD>∪膥蝡舐<E89DA1><E88890>𣂷誘<F0A382B7>䎚<EFBFBD>?
|
||||
2. **<EFBFBD>嘥<EFBFBD><EFBFBD>吔<EFBFBD>** 摨𠉛鍂蝔见<E89D94><E8A781>急<EFBFBD><E680A5><EFBFBD>鉄<EFBFBD>嘥<EFBFBD><E598A5>碶誨<E7A2B6><E8AAA8><EFBFBD>鈭𣬚輕<F0A3AC9A><E8BC95><EFBFBD>霂乩誨<E4B9A9><E8AAA8><EFBFBD>霂<EFBFBD>挽憭<E68CBD>僎銝贝蝸憿寧𤌍XML嚗<4C><E59A97><EFBFBD>唳旿嚗?5<>?
|
||||
3. **<EFBFBD>唳旿隡㰘<EFBFBD>嚗?* 霈曉<E99C88>銝𦠜𤣰<F0A6A09C><F0A4A3B0><EFBFBD><EFBFBD>唳旿摮睃<E691AE><E79D83>典<EFBFBD>撖<EFBFBD><E69296>SQLCipher<65>唳旿摨㮖葉嚗ǎOS/Android嚗剹<E59A97><E589B9><EFBFBD>甇交𧒄嚗淾pp<70>魀mportRecords API蝡舐<E89DA1><E88890>煾<EFBFBD><E785BE>SON<4F>㗇<EFBFBD>韐蠘蝸<E8A098>?
|
||||
JSON Payload蝏𤘪<E89D8F>嚗<EFBFBD><E59A97>甇伐<E79487>嚗?
|
||||
API<EFBFBD><EFBFBD><EFBFBD><EFBFBD>唳旿<EFBFBD><EFBFBD>鍂<EFBFBD>孵<EFBFBD><EFBFBD><EFBFBD>SON蝏𤘪<EFBFBD><EFBFBD><EFBFBD>笆鈭擧<EFBFBD>撱箄䌊撌梁<EFBFBD>蝘餃𢆡<EFBFBD>亙藁嚗<EFBFBD>𤜯隞<EFBFBD><EFBFBD><EFBFBD>農pp嚗厩<EFBFBD>鈭峕活撘<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>䔉霂湛<EFBFBD><EFBFBD>萄<EFBFBD>甇斗芋撘𤩺糓撘箏<EFBFBD><EFBFBD>抒<EFBFBD><EFBFBD>?
|
||||
同步过程高度依赖于API令牌(Token)。
|
||||
|
||||
1. **令牌生成:** 用户在服务器端生成令牌。
|
||||
2. **初始化:** 应用程序扫描包含初始化代码的二维码,该代码验证设备并下载项目XML(元数据)25。
|
||||
3. **数据传输:** 设备上收集的数据存储在加密的SQLCipher数据库中(iOS/Android)。同步时,App向importRecords API端点发送JSON有效负载。
|
||||
|
||||
JSON Payload结构(同步):
|
||||
API期望数据采用特定的JSON结构。对于构建自己的移动接口(替代官方App)的二次开发者来说,遵守此模式是强制性的。
|
||||
|
||||
JSON
|
||||
|
||||
\[
|
||||
@@ -221,44 +256,57 @@ JSON
|
||||
}
|
||||
\]
|
||||
|
||||
28<EFBFBD>?
|
||||
### **4.3 <20>脩<EFBFBD>閫<EFBFBD><E996AB>銝𡡞<E98A9D><F0A1A19E>拍恣<E68B8D>?*
|
||||
28。
|
||||
|
||||
### **4.3 冲突解决与风险管理**
|
||||
|
||||
移动集成中的一个主要“陷阱”是**同步冲突**。如果用户A在服务器上编辑记录101,而用户B在离线移动应用程序上编辑记录101,则同步期间会发生冲突。REDCap Mobile App具有基本的冲突解决界面,要求用户选择“服务器版本”或“设备版本”。
|
||||
|
||||
**二次开发启示:** 如果您正在构建自动脚本(例如DET)来修改正在被移动数据收集者使用的记录,则会增加冲突的风险。
|
||||
|
||||
* *最佳实践:* 移动用户应分配新的、唯一的记录或特定的DAG,以防止与服务器端进程发生重叠编辑30。
|
||||
|
||||
蝘餃𢆡<EFBFBD><EFBFBD><EFBFBD>銝剔<EFBFBD>銝<EFBFBD>銝芯蜓閬<EFBFBD><EFBFBD>𣈯萅<EFBFBD>晦<EFBFBD>脲糓**<2A>峕郊<E5B395>脩<EFBFBD>**<2A><><EFBFBD><EFBFBD>𦦵鍂<F0A6A6B5>嫂<EFBFBD>冽<EFBFBD><E586BD>∪膥銝羓<E98A9D>颲𤏸扇敶?01嚗諹<E59A97>𣬚鍂<F0A3AC9A>媲<EFBFBD>函氖蝥輻宏<E8BCBB>典<EFBFBD><E585B8>函<EFBFBD>摨譍<E691A8>蝻𤥁<E89DBB>霈啣<E99C88>101嚗<31><E59A97><EFBFBD>峕郊<E5B395>罸𡢿隡𡁜<E99AA1><F0A1819C>笔<EFBFBD>蝒<EFBFBD><E89D92><EFBFBD>EDCap Mobile App<70>瑟<EFBFBD><E7919F>箸𧋦<E7AEB8><F0A78BA6><EFBFBD>蝒<EFBFBD>圾<EFBFBD>喟<EFBFBD><E5969F>g<EFBFBD>閬<EFBFBD><E996AC><EFBFBD>冽<EFBFBD><E586BD>㗇𥋘<E39787>𨀣<EFBFBD><F0A880A3>∪膥<E288AA><E886A5>𧋦<EFBFBD>脲<EFBFBD><E884B2>𡏭挽憭<E68CBD><E686AD><EFBFBD>砂<EFBFBD>腈<EFBFBD>?
|
||||
**鈭峕活撘<E6B4BB><E69298>穃鍳蝷綽<E89DB7>** 憒<><E68692><EFBFBD>冽迤<E586BD>冽<EFBFBD>撱箄䌊<E7AE84>刻<EFBFBD><E588BB>穿<EFBFBD>靘见<E99D98>DET嚗㗇䔉靽格㺿甇<E3BABF>銁鋡怎宏<E6808E>冽㺭<E586BD>格𤣰<E6A0BC><F0A4A3B0><EFBFBD><EFBFBD>蝙<EFBFBD>函<EFBFBD>霈啣<E99C88>嚗<EFBFBD><E59A97>隡𡁜<E99AA1><F0A1819C>惩<EFBFBD>蝒<EFBFBD><E89D92>憌𡡞埯<F0A1A19E>?
|
||||
* *<EFBFBD><EFBFBD>雿喳<EFBFBD>頝蛛<EFBFBD>* 蝘餃𢆡<E9A483>冽<EFBFBD>摨𥪜<E691A8><F0A5AA9C>齿鰵<E9BDBF><E9B0B5><EFBFBD><EFBFBD>𣈲銝<F0A388B2><E98A9D><EFBFBD>扇敶閙<E695B6><E99699>孵<EFBFBD><E5ADB5><EFBFBD>AG嚗䔶誑<E494B6>脫迫銝擧<E98A9D><E693A7>∪膥蝡航<E89DA1>蝔见<E89D94><E8A781>罸<EFBFBD><E7BDB8>删<EFBFBD>颲?0<>?
|
||||
## ---
|
||||
|
||||
**5\. MyCap:参与者端的定制与交互**
|
||||
|
||||
<EFBFBD>賜<EFBFBD>REDCap Mobile App<EFBFBD>舫𢒰<EFBFBD>𤑳<EFBFBD>蝛嗡犖<EFBFBD>条<EFBFBD>嚗䔶<EFBFBD>**MyCap**<2A>舫𢒰<E888AB>穃<EFBFBD>銝舘<E98A9D><E88898><EFBFBD><EFBFBD><EFBFBD>yCap<61><70><EFBFBD>脲糓銝<E7B393>銝芸<E98A9D><E88AB8>冽芋<E586BD>梹<EFBFBD><E6A2B9>𤾸銁13.0<EFBFBD><EFBFBD>𧋦銝剛◤<EFBFBD><EFBFBD><EFBFBD><EFBFBD>訌EDCap<EFBFBD>詨<EFBFBD>銝哨<EFBFBD>蝒<EFBFBD>遬鈭<EFBFBD><EFBFBD><EFBFBD>滩<EFBFBD><EFBFBD>?2<>?
|
||||
虽然REDCap Mobile App是面向研究人员的,但**MyCap**是面向参与者的。MyCap最初是一个外部模块,后在13.0版本中被集成到REDCap核心中,突显了其重要性32。
|
||||
|
||||
### **5.1 架构:ResearchKit与ResearchStack**
|
||||
|
||||
MyCap<EFBFBD>拍鍂鈭<EFBFBD>pple<EFBFBD>?*ResearchKit**嚗ǎOS嚗匧<EFBFBD>**ResearchStack**嚗㇁ndroid嚗剹<EFBFBD><EFBFBD><EFBFBD>鈭𥟇糓銝㮖蛹<EFBFBD>餃郎<EFBFBD>𠉛弦摨𠉛鍂蝔见<EFBFBD>霈曇恣<EFBFBD><EFBFBD><EFBFBD>皞鞉<EFBFBD><EFBFBD>嗚<EFBFBD><EFBFBD>yCap<EFBFBD><EFBFBD><EFBFBD>獢交<EFBFBD>嚗?
|
||||
1. **<EFBFBD>滨蔭嚗?* <20>𠉛弦鈭箏<E988AD><E7AE8F>沖EDCap銝剝<E98A9D>蝵桐遙<E6A190>~<EFBFBD>?
|
||||
2. **頧祆揢嚗?* MyCap撠<70>EDCap<61><70>㺭<EFBFBD>株蓮<E6A0AA>V蛹ResearchKit撖寡情摰帋<E691B0><E5B88B>?
|
||||
3. **<EFBFBD>扯<EFBFBD>嚗?* 摨𠉛鍂蝔见<E89D94>撠<EFBFBD><E692A0>鈭𥕦笆鞊⊥葡<E28AA5>㮖蛹<E3AE96>毺<EFBFBD>蝘餃𢆡閫<F0A286A1>㦛嚗<E3A69B><E59A97>屸<EFBFBD>Web閫<62>㦛嚗㚁<E59A97><E39A81>𣂷<EFBFBD>瘚<EFBFBD><E7989A><EFBFBD><EFBFBD>pp雿㯄<E99BBF>34<33>?
|
||||
MyCap利用了Apple的**ResearchKit**(iOS)和**ResearchStack**(Android)。这些是专为医学研究应用程序设计的开源框架。MyCap充当桥梁:
|
||||
|
||||
1. **配置:** 研究人员在REDCap中配置任务。
|
||||
2. **转换:** MyCap将REDCap元数据转换为ResearchKit对象定义。
|
||||
3. **执行:** 应用程序将这些对象渲染为原生移动视图(而非Web视图),提供流畅的App体验34。
|
||||
|
||||
### **5.2 主动任务(Active Tasks)的定制**
|
||||
|
||||
MyCap<EFBFBD><EFBFBD><EFBFBD>祉鸌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>賣糓<EFBFBD>靝蜓<EFBFBD>其遙<EFBFBD>﹦<EFBFBD>吲<EFBFBD>婙<EFBFBD>𥪜⏚<EFBFBD>冽<EFBFBD><EFBFBD>箔<EFBFBD><EFBFBD>笔膥嚗<EFBFBD><EFBFBD><EFBFBD>笔漲霈~<EFBFBD><EFBFBD>漲<EFBFBD>钅<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>箔貌嚗㗇<EFBFBD><EFBFBD>讛恕<EFBFBD>交<EFBFBD>頨思<EFBFBD><EFBFBD>蠘<EFBFBD><EFBFBD><EFBFBD>暑<EFBFBD>剁<EFBFBD>靘见<EFBFBD>嚗峕䛵<EFBFBD>駁<EFBFBD>笔漲<EFBFBD><EFBFBD>郊<EFBFBD><EFBFBD><EFBFBD>撟唾﹛<EFBFBD><EFBFBD>征<EFBFBD>渲扇敹<EFBFBD><EFBFBD>37<EFBFBD>?
|
||||
MyCap最独特的功能是“主动任务”——利用手机传感器(加速度计、麦克风、陀螺仪)测量认知或身体功能的活动(例如,敲击速度、步态与平衡、空间记忆)37。
|
||||
|
||||
二次开发机会:
|
||||
撘<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD>虾隞亙<EFBFBD>撱箄䌊摰帋<EFBFBD><EFBFBD><EFBFBD>蜓<EFBFBD>其遙<EFBFBD>∴<EFBFBD>雿<EFBFBD><EFBFBD><EFBFBD><EFBFBD>閬<EFBFBD>wift嚗ǎOS嚗㗇<EFBFBD>Kotlin/Java嚗㇁ndroid嚗厩<EFBFBD>擃条漣<EFBFBD>亥<EFBFBD>嚗<EFBFBD>僎靽格㺿MyCap皞𣂷誨<EFBFBD><EFBFBD><EFBFBD>餈䠷<EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>䔶<EFBFBD>REDCap<EFBFBD>詨<EFBFBD>霈詨虾<EFBFBD><EFBFBD>鸌摰朞<EFBFBD><EFBFBD>鬹pp皞𣂷誨<EFBFBD><EFBFBD>捂<EFBFBD>荔<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䕘<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>甈∪<EFBFBD><EFBFBD>煾<EFBFBD>𡁜虜靘折<EFBFBD>鈭舘圻<EFBFBD>餹yCap<EFBFBD>滢<EFBFBD><EFBFBD>硋<EFBFBD><EFBFBD><EFBFBD>yCap<EFBFBD>唳旿<EFBFBD>?
|
||||
* *獢<><E78DA2>嚗? 銝<>銝芸<E98A9D><E88AB8>冽芋<E586BD>梹<EFBFBD><E6A2B9>朞<EFBFBD>redcap\_save\_record<72>烐綉隡惩<E99AA1><E683A9><EFBFBD>yCap銝餃𢆡隞餃𦛚<E9A483>唳旿嚗<E697BF><E59A97><EFBFBD>𨅯<EFBFBD>銝舘<E98A9D><E88898><EFBFBD><EFBFBD>𨀣郊<F0A880A3><E9838A><EFBFBD>笔漲<E7AC94>苷<EFBFBD>鈭𡒊鸌摰𡁻<E691B0><F0A181BB>潘<EFBFBD>銵冽<E98AB5>頝<EFBFBD><E9A09D>㘾<EFBFBD><E398BE>抬<EFBFBD>嚗<EFBFBD><E59A97>閫血<E996AB>霅行𥁒38<33>?
|
||||
开发者可以创建自定义的主动任务,但这需要Swift(iOS)或Kotlin/Java(Android)的高级知识,并修改MyCap源代码(这需要不同于REDCap核心许可的特定联盟App源代码许可)。然而,标准的二次开发通常侧重于触发MyCap操作或处理MyCap数据。
|
||||
|
||||
* *案例:* 一个外部模块,通过redcap\_save\_record监控传入的MyCap主动任务数据,如果参与者的“步态速度”低于特定阈值(表明跌倒风险),则触发警报38。
|
||||
|
||||
### **5.3 通过外部模块定制MyCap**
|
||||
|
||||
撠賜恣MyCap<EFBFBD>舀瓲敹<EFBFBD><EFBFBD><EFBFBD>踝<EFBFBD>EM隞滨<EFBFBD><EFBFBD>臭誑憓𧼮撩摰<EFBFBD><EFBFBD><EFBFBD><EFBFBD>憒<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>其<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣬚<EFBFBD><EFBFBD>芸<EFBFBD>銋劐<EFBFBD>蝏渡<EFBFBD>撟嗉䌊<EFBFBD>券<EFBFBD>朞<EFBFBD><EFBFBD>萄<EFBFBD><EFBFBD>桐辣<EFBFBD>煾<EFBFBD><EFBFBD><EFBFBD><EFBFBD>pp Links<6B>蠘<EFBFBD><E8A098><EFBFBD>捂隞𤾸<E99A9E><F0A4BEB8>冽<EFBFBD>瘛勗漲<E58B97>暹𦻖<E69AB9>衽yCap摨𠉛鍂蝔见<E89D94>39<33>?
|
||||
尽管MyCap是核心功能,EM仍然可以增强它。例如,生成用于参与者入职的自定义二维码并自动通过电子邮件发送。App Links功能允许从外部源深度链接到MyCap应用程序39。
|
||||
|
||||
## ---
|
||||
|
||||
**6\. REDCap API嚗𡁶<EFBFBD><EFBFBD><EFBFBD>頂蝏毺<EFBFBD><EFBFBD>芸𢆡<EFBFBD>𡝗‘璇?*
|
||||
**6\. REDCap API:生态系统的自动化桥梁**
|
||||
|
||||
API<EFBFBD>臭<EFBFBD><EFBFBD>滢<EFBFBD><EFBFBD>抒<EFBFBD><EFBFBD>舀<EFBFBD><EFBFBD><EFBFBD>笆鈭𦒘<EFBFBD>甈∪<EFBFBD><EFBFBD>𤏸<EFBFBD>諹<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>𡁜虜<EFBFBD>舐<EFBFBD><EFBFBD>坔<EFBFBD><EFBFBD>冽芋<EFBFBD>㛖<EFBFBD><EFBFBD>蹂誨<EFBFBD>寞<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𣈯<EFBFBD>餉<EFBFBD><EFBFBD>臭誑<EFBFBD>朞<EFBFBD><EFBFBD>每ron雿靝<EFBFBD>銝𡃏<EFBFBD>銵𣬚<EFBFBD>憭㚚<EFBFBD><EFBFBD>𡁏𧋦嚗㇊ython/R嚗㗇䔉憭<E49489><E686AD>嚗屸<E59A97>銋<EFBFBD><E98A8B><EFBFBD>𡁜虜瘥𥪜銁<F0A5AA9C>滚𦛚<E6BB9A>其<EFBFBD>摰㕑<E691B0>PHP璅∪<E79285><E288AA>游<EFBFBD><E6B8B8>具<EFBFBD>?
|
||||
### **6.1 撖澆枂銝𤾸紡<F0A4BEB8>亦<EFBFBD><E4BAA6><EFBFBD>雿喳<E99BBF>頝?*
|
||||
API是互操作性的支柱。对于二次开发而言,它通常是编写外部模块的替代方案。如果逻辑可以通过在Cron作业上运行的外部脚本(Python/R)来处理,那么这通常比在服务器上安装PHP模块更安全。
|
||||
|
||||
### **6.1 导出与导入的最佳实践**
|
||||
|
||||
* **分批处理(Batching):** 导出大型数据集时,一次请求所有记录会导致超时。
|
||||
* *解决方案:* 使用batch\_size参数或分块循环遍历记录。
|
||||
* **类型处理:** 默认情况下,API在JSON中将所有数据作为字符串返回。
|
||||
* *陷阱:* 在PHP/Python布尔检查中,字段值“0”(字符串)在某些上下文中为真,但“0”(整数)为假。开发者必须严格对API响应进行类型转换40。
|
||||
* **“扁平”与“EAV”导出:** API创建一个“扁平”文件(每个记录/事件一行)。这与后端的EAV结构不同。二次开发者通常构建“数据录入触发器”(DET),每当保存记录时,该触发器都会收到来自REDCap的POST请求,然后调用API导出该特定记录进行处理42。
|
||||
|
||||
* **<2A><>鸌憭<E9B88C><E686AD>嚗㇂atching嚗㚁<E59A97>** 撖澆枂憭批<E686AD><E689B9>唳旿<E594B3><E697BF>𧒄嚗䔶<E59A97>甈∟窈瘙<E7AA88><E79899><EFBFBD>㕑扇敶蓥<E695B6>撖潸稲頞<E7A8B2>𧒄<EFBFBD>?
|
||||
* *閫<><E996AB><EFBFBD>寞<EFBFBD>嚗? 雿輻鍂batch\_size<7A><65>㺭<EFBFBD>硋<EFBFBD><E7A18B>堒儐<E5A092>舫<EFBFBD><E888AB><EFBFBD>扇敶𨰻<E695B6>?
|
||||
* **蝐餃<E89D90>憭<EFBFBD><E686AD>嚗?* 暺䁅恕<E48185><E68195><EFBFBD>銝页<E98A9D>API<50>沅SON銝剖<E98A9D><E58996><EFBFBD><EFBFBD>㗇㺭<E39787>桐<EFBFBD>銝箏<E98A9D>蝚虫葡餈𥪜<E9A488><F0A5AA9C>?
|
||||
* *<2A>琿𩐠嚗? <20>沌HP/Python撣<6E><E692A3>璉<EFBFBD><E79289>乩葉嚗<E89189><E59A97>畾萄<E795BE>潑<EFBFBD>?<3F>嘅<EFBFBD>摮㛖泵銝莎<E98A9D><E88E8E>冽<EFBFBD>鈭𥕢<E988AD>銝𧢲<E98A9D>銝凋蛹<E5878B><E89BB9><EFBFBD>雿<EFBFBD><E99BBF>?<3F>嘅<EFBFBD><E59885>湔㺭嚗劐蛹<E58A90><E89BB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>𤏸<EFBFBD><F0A48FB8><EFBFBD>憿颱艇<E9A2B1>澆笆API<50>滚<EFBFBD>餈𥡝<E9A488>蝐餃<E89D90>頧祆揢40<34>?
|
||||
* **<2A>𨀣<EFBFBD>撟喇<E6929F>苷<EFBFBD><E88BB7>諪AV<41>嘥紡<E598A5>綽<EFBFBD>** API<50>𥕦遣銝<E981A3>銝芬<E98A9D>𨀣<EFBFBD>撟喇<E6929F>脲<EFBFBD>隞塚<E99A9E>瘥譍葵霈啣<E99C88>/鈭衤辣銝<E8BEA3>銵䕘<E98AB5><E49598><EFBFBD><EFBFBD>銝𤾸<E98A9D>蝡舐<E89DA1>EAV蝏𤘪<E89D8F>銝滚<E98A9D><E6BB9A><EFBFBD><EFBFBD>甈∪<E79488><E288AA>𤏸<EFBFBD><F0A48FB8><EFBFBD>𡁜虜<F0A1819C><E8999C>遣<EFBFBD>𨀣㺭<F0A880A3>桀<EFBFBD><E6A180>亥圻<E4BAA5>穃膥<E7A983>嘅<EFBFBD>DET嚗㚁<E59A97>瘥誩<E798A5>靽嘥<E99DBD>霈啣<E99C88><E595A3>塚<EFBFBD>霂亥圻<E4BAA5>穃膥<E7A983>賭<EFBFBD><E8B3AD>嗅<EFBFBD><E59785>亥䌊REDCap<61><70>OST霂瑟<E99C82>嚗𣬚<E59A97><F0A3AC9A>舘<EFBFBD><E88898>杗PI撖澆枂霂亦鸌摰朞扇敶閗<E695B6>銵<EFBFBD><E98AB5><EFBFBD>?2<>?
|
||||
**代码示范:Python API导出脚本**
|
||||
|
||||
Python
|
||||
@@ -267,7 +315,7 @@ import requests
|
||||
import pandas as pd
|
||||
|
||||
api\_url \= 'https://redcap.institution.edu/api/'
|
||||
\# payload<EFBFBD><EFBFBD><EFBFBD>?
|
||||
\# payload构造
|
||||
payload \= {
|
||||
'token': 'YOUR\_32\_CHAR\_TOKEN',
|
||||
'content': 'record',
|
||||
@@ -291,60 +339,74 @@ except requests.exceptions.RequestException as e:
|
||||
except ValueError:
|
||||
print("JSON解码失败 \- 响应可能非JSON格式")
|
||||
|
||||
44<EFBFBD>?
|
||||
44。
|
||||
|
||||
## ---
|
||||
|
||||
**7\. <EFBFBD><EFBFBD>雿單<EFBFBD>靘讠<EFBFBD>蝛塚<EFBFBD>Case Studies嚗?*
|
||||
**7\. 最佳案例研究(Case Studies)**
|
||||
|
||||
为了说明“最佳应用”,我们分析三种突出的二次开发方法。
|
||||
|
||||
銝箔<EFBFBD>霂湔<EFBFBD><EFBFBD>𨀣<EFBFBD>雿喳<EFBFBD><EFBFBD>兩<EFBFBD>嘅<EFBFBD><EFBFBD>睲賑<EFBFBD><EFBFBD><EFBFBD>銝厩<EFBFBD>蝒<EFBFBD>枂<EFBFBD><EFBFBD><EFBFBD>甈∪<EFBFBD><EFBFBD>烐䲮瘜𨰻<EFBFBD>?
|
||||
### **7.1 案例一:Shazam(UI与前端改造)**
|
||||
|
||||
* **<EFBFBD>格<EFBFBD>嚗?* 銝箄<E98A9D><E7AE84>亙<EFBFBD>撱箄䌊摰帋<E691B0>撣<EFBFBD><E692A3>嚗<EFBFBD><E59A97>摮埈挾<E59F88><E68CBE><EFBFBD>銝箇畆<E7AE87>菜<EFBFBD><E88F9C>墧<EFBFBD><E5A2A7><EFBFBD><EFBFBD>閫㗇聢撘譌<E69298>?
|
||||
* **<EFBFBD>箏<EFBFBD>嚗?* Shazam<EFBFBD>臭<EFBFBD>銝芸<EFBFBD><EFBFBD>冽芋<EFBFBD>梹<EFBFBD>摰<EFBFBD>釣<EFBFBD>仔avaScript/CSS<53><53><EFBFBD>閫<EFBFBD><E996AB><EFBFBD>讛膩<E8AE9B>扳<EFBFBD><E689B3>砍<EFBFBD>畾萎葉<E8908E><E89189>鸌摰尠<E691B0>侻hazam<61>脲<EFBFBD>蝑橘<E89D91><E6A998>嗅<EFBFBD><E59785>齿鰵<E9BDBF>鍦<EFBFBD><E98DA6>唳旿敶訫<E695B6>銵典<E98AB5><E585B8><EFBFBD>TML DOM<EFBFBD>?
|
||||
* **瘣𧼮<EFBFBD>嚗?* 餈坔<E9A488>蝷箔<E89DB7>EM憒<4D><E68692><EFBFBD>其<EFBFBD><E585B6>湔㺿<E6B994>滚𦛚<E6BB9A>函垢<E587BD>唳旿蝏𤘪<E89D8F><F0A498AA><EFBFBD><EFBFBD><EFBFBD>萎<EFBFBD>嚗䔶<E59A97>*摰X<E691B0>蝡?敶餃<E695B6><E9A483>孵<EFBFBD><E5ADB5>冽<EFBFBD>雿㯄<E99BBF>1<EFBFBD>?
|
||||
* **目标:** 为调查创建自定义布局,将字段分组为矩阵或非标准视觉格式。
|
||||
* **机制:** Shazam是一个外部模块,它注入JavaScript/CSS。它解析描述性文本字段中的特定“Shazam”标签,然后重新排列数据录入表单的HTML DOM。
|
||||
* **洞察:** 这展示了EM如何在不更改服务器端数据结构的情况下,从*客户端*彻底改变用户体验1。
|
||||
|
||||
### **7.2 案例二:Auto-Schedule(工作流自动化)**
|
||||
|
||||
* **<EFBFBD>格<EFBFBD>嚗?* <20>箔<EFBFBD><E7AE94>箇瑪<E7AE87>交<EFBFBD>嚗<EFBFBD><E59A97>憒<EFBFBD><E68692><EFBFBD>舀𠯫<E88880><F0A0AFAB><EFBFBD><EFBFBD>芸𢆡<E88AB8><F0A286A1><EFBFBD>蝥萄<E89DA5>鈭衤辣<E8A1A4><E8BEA3>𧒄<EFBFBD>渲”<E6B8B2>?
|
||||
* **<EFBFBD>箏<EFBFBD>嚗?* 雿輻鍂redcap\_save\_record<EFBFBD>拙<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靽嘥<EFBFBD><EFBFBD>𦨴urgery\_date<EFBFBD>嘥<EFBFBD>畾菜𧒄嚗峕芋<EFBFBD>𡑒恣蝞埈𧊋<EFBFBD>交𠯫<EFBFBD><EFBFBD><EFBFBD>+30憭抬<E686AD>+60憭抬<E686AD>撟嗅‵<E59785><E280B5>★<EFBFBD>格𠯫<E6A0BC><F0A0AFAB><EFBFBD>?
|
||||
* **瘣𧼮<EFBFBD>嚗?* 餈蹱𤜯隞<F0A49CAF><E99A9E>鈭箏極霈∠<E99C88>嚗<EFBFBD><E59A97>撠睲<E692A0><E79DB2>讛<EFBFBD><E8AE9B>条<EFBFBD><E69DA1>躰秤嚗<E7A7A4><E59A97>蝷箔<E89DB7><E7AE94>𡒊垢<F0A1928A>拙<EFBFBD><E68B99>刻<EFBFBD><E588BB>交<EFBFBD><E4BAA4><EFBFBD>葉<EFBFBD><E89189><EFBFBD><EFBFBD>?5<>?
|
||||
* **目标:** 基于基线日期(例如手术日期)自动生成纵向事件的时间表。
|
||||
* **机制:** 使用redcap\_save\_record钩子。当保存“surgery\_date”字段时,模块计算未来日期(+30天,+60天)并填充项目日历。
|
||||
* **洞察:** 这替代了人工计算,减少了协调员的错误,展示了后端钩子在运营效率中的作用45。
|
||||
|
||||
### **7.3 案例三:Cross-Project Piping(跨项目数据互通)**
|
||||
|
||||
* **<EFBFBD>格<EFBFBD>嚗?* 撠<>犖<EFBFBD><E78A96><EFBFBD>霈⊥㺭<E28AA5>桐<EFBFBD>銝剖亢<E58996>𨀣釣<F0A880A3>𢞖<EFBFBD>嗪★<E597AA>格<EFBFBD><E6A0BC>硋<EFBFBD><E7A18B>孵<EFBFBD><E5ADB5><EFBFBD><EFBFBD>𦦵<EFBFBD>蝛嗯<E89D9B>嗪★<E597AA>桐葉<E6A190>?
|
||||
* **<EFBFBD>箏<EFBFBD>嚗?* 銝<>銝枕M嚗<4D><E59A97><EFBFBD>亥砭皞鞾★<E99EBE>桃<EFBFBD><E6A183>唳旿摨橒<E691A8>雿輻鍂REDCap::getData嚗匧僎撠<E5838E>㺭<EFBFBD>格<EFBFBD><E6A0BC>亙<EFBFBD><E4BA99>漤★<E6BCA4>株”<E6A0AA>𨰻<EFBFBD>?
|
||||
* **<EFBFBD>𣂼<EFBFBD><EFBFBD>喲睸嚗?* 摰<>蝙<EFBFBD>兩<EFBFBD>𡏭圻<F0A18FAD>穃<EFBFBD>畾菊<E795BE>腈<EFBFBD><E88588>蘨<EFBFBD>匧銁靽格㺿<E6A0BC>孵<EFBFBD>摮埈挾<E59F88>嗆<EFBFBD>隡朞<E99AA1>銵<EFBFBD><E98AB5><EFBFBD>塚<EFBFBD><E5A19A>脫迫銝齿鱏閬<E9B18F><E996AC>47<34>?
|
||||
* **目标:** 将人口统计数据从中央“注册”项目拉取到特定的“研究”项目中。
|
||||
* **机制:** 一个EM,它查询源项目的数据库(使用REDCap::getData)并将数据插入当前项目表单。
|
||||
* **成功关键:** 它使用“触发字段”。只有在修改特定字段时才会进行复制,防止不断覆盖47。
|
||||
|
||||
## ---
|
||||
|
||||
**8\. 避坑指南:常见问题与解决方案**
|
||||
|
||||
鈭峕活撘<EFBFBD><EFBFBD>穃<EFBFBD>皛⊿<EFBFBD><EFBFBD>押<EFBFBD><EFBFBD>誑銝𧢲糓<EFBFBD>𠉛<EFBFBD>銝剜𥁒<EFBFBD>羓<EFBFBD><EFBFBD><EFBFBD>撣貉<EFBFBD><EFBFBD>桅<EFBFBD>嚗?
|
||||
### **8.1 <20>𨅯<EFBFBD>蝥扯稲甇領<E79487>嘅<EFBFBD>The Upgrade Death嚗?*
|
||||
二次开发充满风险。以下是联盟中报告的最常见问题:
|
||||
|
||||
### **8.1 “升级致死”(The Upgrade Death)**
|
||||
|
||||
* **场景:** 开发者使用非标准文件路径编写插件,或依赖于REDCap内部(私有)核心函数。
|
||||
* **后果:** 当REDCap更新时,函数名称更改或路径移动,导致插件崩溃。
|
||||
* **避坑指南:** 严格坚持使用外部模块框架,并仅调用REDCap::类方法,这些方法为了向后兼容性而受到维护。
|
||||
|
||||
* **<2A>箸艶嚗?* 撘<><E69298>𤏸<EFBFBD><F0A48FB8>蝙<EFBFBD>券<EFBFBD><E588B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>辣頝臬<E9A09D>蝻硋<E89DBB><E7A18B>雴辣嚗峕<E59A97>靘肽<E99D98>鈭竃EDCap<61><70><EFBFBD>嚗<EFBFBD><E59A97><EFBFBD>㚁<EFBFBD><E39A81>詨<EFBFBD><E8A9A8>賣㺭<E8B3A3>?
|
||||
* **<2A>擧<EFBFBD>嚗?* 敶𣫮EDCap<61>湔鰵<E6B994>塚<EFBFBD><E5A19A>賣㺭<E8B3A3>滨妍<E6BBA8>湔㺿<E6B994>𤥁楝敺<E6A59D>宏<EFBFBD>剁<EFBFBD>撖潸稲<E6BDB8>雴辣撏拇<E6928F><E68B87>?
|
||||
* **<2A>踹<EFBFBD><E8B8B9><EFBFBD><EFBFBD>嚗?* 銝交聢<E4BAA4>𡁏<EFBFBD>雿輻鍂憭㚚<E686AD>璅∪<E79285>獢<EFBFBD>沲嚗<E6B2B2>僎隞<E5838E><E99A9E><EFBFBD>沖EDCap::蝐餅䲮瘜𤏪<E7989C>餈嗘<E9A488><E59798>寞<EFBFBD>銝箔<E98A9D><E7AE94>穃<EFBFBD><E7A983>澆捆<E6BE86>扯<EFBFBD><E689AF><EFBFBD><EFBFBD>啁輕<E59581>扎<EFBFBD>?
|
||||
### **8.2 redcap\_data的性能瓶颈**
|
||||
|
||||
* **<EFBFBD>箸艶嚗?* 璅∪<E79285><E288AA>𦦵揣<F0A6A6B5>𨀣<EFBFBD><F0A880A3>匧僑樴?\> 50<35><30>扇敶𨰝<E695B6>腈<EFBFBD>?
|
||||
* **<EFBFBD>琿𩐠嚗?* <20>其<EFBFBD>銝芣𥅾<E88AA3>?0銝<30>辺霈啣<E99C88><E595A3><EFBFBD>★<EFBFBD>桐葉嚗屸<E59A97>朞<EFBFBD>SELECT \* FROM redcap\_data WHERE value \> 50<EFBFBD>扯<EFBFBD>甇斗<EFBFBD>雿靝<EFBFBD>撘箏<EFBFBD>撖寡”餈𥡝<EFBFBD><EFBFBD>刻”<EFBFBD>急<EFBFBD>嚗<EFBFBD><EFBFBD>銝箄砲銵典<EFBFBD><EFBFBD>?<3F><><EFBFBD>?憿寧𤌍<E5AFA7><F0A48C8D>㺭<EFBFBD>殷<EFBFBD><E6AEB7>?
|
||||
* **閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗?* 憪讠<E686AA><E8AEA0>沒QL<51>亥砭銝剖<E98A9D><E58996>厚roject\_id雿靝蛹擐𤥁<E69390>餈<EFBFBD>誘<EFBFBD>∩辣<E288A9><E8BEA3>⏚<EFBFBD>沖EDCap::getData()<29><><EFBFBD>皛日<E79A9B>餉<EFBFBD>嚗峕<E59A97><E5B395><EFBFBD><EFBFBD><EFBFBD>𣈯<EFBFBD>閬<EFBFBD><E996AC>憪喹QL嚗𣬚&靽脲<E99DBD><E884B2><EFBFBD>𧑐<EFBFBD>拍鍂鈭<E98D82>roject\_id<EFBFBD>靕ield\_name銝羓<EFBFBD>蝝W<EFBFBD><EFBFBD>?
|
||||
### **8.3 靚<>䰻憿菟𢒰甇餃儐<E9A483>荔<EFBFBD>Survey Loop嚗?*
|
||||
* **场景:** 模块搜索“所有年龄 \> 50的记录”。
|
||||
* **陷阱:** 在一个拥有10万条记录的项目中,通过SELECT \* FROM redcap\_data WHERE value \> 50执行此操作会强制对表进行全表扫描(因为该表包含*所有*项目的数据)。
|
||||
* **解决方案:** 始终在SQL查询中包含project\_id作为首要过滤条件。利用REDCap::getData()的过滤逻辑,或者如果需要原始SQL,确保有效地利用了project\_id和field\_name上的索引。
|
||||
|
||||
* **<2A>箸艶嚗?* 雿輻鍂redcap\_survey\_page\_top<6F>拙<EFBFBD><E68B99>冽說頞單辺隞嗆𧒄<E59786>滚<EFBFBD><E6BB9A>𤑳鍂<F0A491B3>瑯<EFBFBD>?
|
||||
* **<2A>琿𩐠嚗?* 憒<><E68692><EFBFBD>滚<EFBFBD><E6BB9A>煾<EFBFBD>餉<EFBFBD><E9A489>厩撩<E58EA9>瘀<EFBFBD>靘见<E99D98>嚗屸<E59A97>摰𡁜<E691B0><F0A1819C>∩辣<E288A9>函𤌍<E587BD><F0A48C8D>△<EFBFBD>V<EFBFBD>銋煺蛹<E785BA><E89BB9><EFBFBD>嚗𣬚鍂<F0A3AC9A>瑕<EFBFBD>鋡怠撕<E680A0>𧼮<EFBFBD>銝<EFBFBD>憿菟𢒰嚗<F0A292B0>紡<EFBFBD>湔<EFBFBD>閫<EFBFBD>膥<EFBFBD><E886A5>絲<EFBFBD>硋援皞<E68FB4><E79A9E>?
|
||||
* **閫<EFBFBD><EFBFBD><EFBFBD>寞<EFBFBD>嚗?* <20>冽<EFBFBD>銵屸<E98AB5>摰𡁜<E691B0>銋见<E98A8B>嚗峕<E59A97><E5B395>亙<EFBFBD><E4BA99>䔛RL<52>臬炏撌脩<E6928C><E884A9>舐𤌍<E88890>䱗RL<52>?
|
||||
### **8.4 蝘餃𢆡<E9A483>峕郊銝剔<E98A9D><E58994>𨅯迨<F0A885AF>踵㺭<E8B8B5>栽<EFBFBD>?*
|
||||
### **8.3 调查页面死循环(Survey Loop)**
|
||||
|
||||
* **场景:** 使用redcap\_survey\_page\_top钩子在满足条件时重定向用户。
|
||||
* **陷阱:** 如果重定向逻辑有缺陷(例如,重定向条件在目标页面上也为真),用户将被弹回同一页面,导致浏览器挂起或崩溃。
|
||||
* **解决方案:** 在执行重定向之前,检查当前URL是否已经是目标URL。
|
||||
|
||||
### **8.4 移动同步中的“孤儿数据”**
|
||||
|
||||
* **场景:** 当移动设备检出项目时,管理员更改了项目结构(例如,删除了一个字段)。
|
||||
* **后果:** 移动用户无法将数据同步回来,因为服务器上不再存在该字段。数据被困在设备上。
|
||||
* **规则:** **绝对不要**在项目处于“生产”状态且有活跃移动用户时修改项目设计30。
|
||||
|
||||
* **<2A>箸艶嚗?* 敶梶宏<E6A2B6>刻挽憭<E68CBD><E686AD><EFBFBD>粹★<E7B2B9>格𧒄嚗𣬚恣<F0A3AC9A><E681A3><EFBFBD><EFBFBD>湔㺿鈭<E3BABF>★<EFBFBD>桃<EFBFBD><E6A183><EFBFBD><EFBFBD>靘见<E99D98>嚗<EFBFBD><E59A97><EFBFBD>支<EFBFBD>銝<EFBFBD>銝芸<E98A9D>畾蛛<E795BE><E89B9B>?
|
||||
* **<2A>擧<EFBFBD>嚗?* 蝘餃𢆡<E9A483>冽<EFBFBD><E586BD>䭾<EFBFBD>撠<EFBFBD>㺭<EFBFBD>桀<EFBFBD>甇亙<E79487><E4BA99>伐<EFBFBD><E4BC90>牐蛹<E78990>滚𦛚<E6BB9A>其<EFBFBD>銝滚<E98A9D>摮睃銁霂亙<E99C82>畾萸<E795BE><E890B8>㺭<EFBFBD>株◤<E6A0AA>啣銁霈曉<E99C88>銝𨳍<E98A9D>?
|
||||
* **閫<><E996AB>嚗?* **蝏嘥笆銝滩<E98A9D>**<EFBFBD>券★<EFBFBD>桀<EFBFBD>鈭𢛶<EFBFBD>𦦵<EFBFBD>鈭把<EFBFBD>萘𠶖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>㗇暑頝<EFBFBD>宏<EFBFBD>函鍂<EFBFBD>瑟𧒄靽格㺿憿寧𤌍霈曇恣30<EFBFBD>?
|
||||
## ---
|
||||
|
||||
**9\. 结论**
|
||||
|
||||
REDCap<EFBFBD><EFBFBD><EFBFBD>甈∪<EFBFBD><EFBFBD>穃<EFBFBD>銝<EFBFBD>銝芾◤<EFBFBD>函<EFBFBD><EFBFBD>唳旿摮睃<EFBFBD>摨栞蓮<EFBFBD>䀝蛹銝<EFBFBD>銝芯蜓<EFBFBD>函<EFBFBD><EFBFBD>𠉛弦<EFBFBD>滢<EFBFBD>蝟餌<EFBFBD><EFBFBD><EFBFBD><EFBFBD>銝湔𧒄<EFBFBD>雴辣<EFBFBD>𤑳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>憭㚚<EFBFBD>璅∪<EFBFBD>獢<EFBFBD>沲<EFBFBD><EFBFBD><EFBFBD>蝘颱誨銵其<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>頂蝏毺<EFBFBD><EFBFBD>鞟<EFBFBD>嚗䔶<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鈭<EFBFBD><EFBFBD><EFBFBD>冽<EFBFBD>扼<EFBFBD><EFBFBD>虾蝏湔擪<EFBFBD>批<EFBFBD><EFBFBD>曹澈<EFBFBD>賢<EFBFBD><EFBFBD>?
|
||||
撖嫣<EFBFBD>撘<EFBFBD><EFBFBD>𤏸<EFBFBD><EFBFBD><EFBFBD>諹<EFBFBD>嚗峕<EFBFBD><EFBFBD>毺<EFBFBD>頝臬<EFBFBD><EFBFBD>其<EFBFBD>銝交聢<EFBFBD>萄<EFBFBD>獢<EFBFBD>沲閫<EFBFBD><EFBFBD>嚗帋蝙<EFBFBD>冽𡂝鞊⊥䰻霂X䲮瘜閖俈甇㏎QL瘜典<EFBFBD>嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>箔誑<EFBFBD>脫迫XSS嚗<EFBFBD>僎<EFBFBD>拍鍂撣行<EFBFBD><EFBFBD>𣳇<EFBFBD>敺芰㴓靽脲擪<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>偬摮𣂼<EFBFBD>redcap\_save\_record<72>?
|
||||
<EFBFBD>函宏<EFBFBD>券<EFBFBD><EFBFBD><EFBFBD><EFBFBD>MyCap<EFBFBD>愢obile App<70><70><EFBFBD><EFBFBD>𣂼<EFBFBD>REDCap<61><70>圻閫鍦辣隡詨<E99AA1>鈭<EFBFBD><E988AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>餈𦦵<E9A488>摰𧼮𧑐<F0A7BCAE>啣㦤<E595A3><E3A6A4><EFBFBD><EFBFBD>䕘<EFBFBD>餈嗵<E9A488>餈墧𦻖<E5A2A7>扯<EFBFBD>瘙<EFBFBD>銁API隞斤<E99A9E>蝞∠<E89D9E><E288A0>屸★<E5B1B8>桃<EFBFBD><E6A183>祆綉<E7A586>嗆䲮<E59786>X<EFBFBD>銝交聢<E4BAA4><E881A2><EFBFBD>雿𦦵漯敺页<E695BA>隞仿俈甇X㺭<EFBCB8>桐腺憭晞<E686AD>?
|
||||
<EFBFBD>朞<EFBFBD><EFBFBD>拍鍂餈嗘<EFBFBD>擃条漣<EFBFBD>蠘<EFBFBD><EFBFBD>婙<EFBFBD>𥪜<EFBFBD><EFBFBD>嗅<EFBFBD><EFBFBD>滩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>隞<EFBFBD><EFBFBD><EFBFBD><EFBFBD>沲<EFBFBD><EFBFBD>器<EFBFBD>𢞖<EFBFBD>婙<EFBFBD>娍㦤<EFBFBD><EFBFBD>虾隞仿<EFBFBD>蝵脫𠳿摰匧<EFBFBD><EFBFBD><EFBFBD>虾<EFBFBD>拙<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>䌊<EFBFBD>典<EFBFBD><EFBFBD>𣬚鍂<EFBFBD>瑕<EFBFBD>憟賜<EFBFBD><EFBFBD>𠉛弦<EFBFBD>臬<EFBFBD><EFBFBD>?
|
||||
REDCap的二次开发将一个被动的数据存储库转变为一个主动的研究操作系统。从临时插件向结构化外部模块框架的迁移代表了生态系统的成熟,优先考虑了安全性、可维护性和共享能力。
|
||||
|
||||
对于开发者而言,成功的路径在于严格遵守框架规则:使用抽象查询方法防止SQL注入,清理输出以防止XSS,并利用带有无限循环保护的标准钩子如redcap\_save\_record。
|
||||
|
||||
在移动领域,MyCap和Mobile App的集成将REDCap的触角延伸到了患者的口袋和偏远的实地现场。然而,这种连接性要求在API令牌管理和项目版本控制方面有严格的操作纪律,以防止数据丢失。
|
||||
|
||||
通过利用这些高级功能——同时尊重联盟源代码的架构边界——机构可以部署既安全又可扩展的复杂、自动化和用户友好的研究环境。
|
||||
|
||||
## ---
|
||||
|
||||
**10\. 技术附录:核心源代码参考库**
|
||||
@@ -358,19 +420,19 @@ public function redcap\_save\_record($project\_id, $record, $instrument, $event\
|
||||
// 确保我们在正确的项目上下文中
|
||||
if ($project\_id\!= $this\-\>getProjectSetting('target\_project')) return;
|
||||
|
||||
// <EFBFBD>㰘蝸<EFBFBD>唳旿隞交<EFBFBD><EFBFBD>交辺隞?
|
||||
// 加载数据以检查条件
|
||||
$data \= \\REDCap::getData($project\_id, 'array', $record);
|
||||
|
||||
// 璉<EFBFBD><EFBFBD>?status'摮埈挾<EFBFBD>臬炏銝?complete' (2)
|
||||
// 瘜冽<EFBFBD>嚗帋<EFBFBD>隞嗥<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
|
||||
// 检查'status'字段是否为'complete' (2)
|
||||
// 注意:事件结构处理
|
||||
if ($data\[$record\]\[$event\_id\]\['status'\] \== '2') {
|
||||
// 记录日志
|
||||
$this\-\>log("霈啣<EFBFBD> $record 摰峕<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD><EFBFBD>乓<EFBFBD>?, \[
|
||||
$this\-\>log("记录 $record 完成状态检查。", \[
|
||||
'record' \=\> $record,
|
||||
'status' \=\> 'complete'
|
||||
\]);
|
||||
|
||||
// <EFBFBD>扯<EFBFBD><EFBFBD>芸<EFBFBD>銋厰<EFBFBD>餉<EFBFBD>嚗<EFBFBD><EFBFBD>憒<EFBFBD><EFBFBD>靚<EFBFBD>鍂憭㚚<EFBFBD>API嚗?
|
||||
// 执行自定义逻辑(例如,调用外部API)
|
||||
$this\-\>sendToExternalRegistry($record, $data);
|
||||
}
|
||||
}
|
||||
@@ -379,10 +441,10 @@ public function redcap\_save\_record($project\_id, $record, $instrument, $event\
|
||||
|
||||
PHP
|
||||
|
||||
// <EFBFBD>躰秤<EFBFBD><EFBFBD><EFBFBD>瘜𤏪<EFBFBD>SQL瘜典<EFBFBD>憌𡡞埯嚗?
|
||||
// 错误的写法(SQL注入风险)
|
||||
// $sql \= "select value from redcap\_data where record \= '$record\_id'";
|
||||
|
||||
// 甇<EFBFBD>&<EFBFBD><EFBFBD><EFBFBD>瘜?
|
||||
// 正确的写法
|
||||
$sql \= "select value from redcap\_data where project\_id \=? and record \=? and field\_name \=?";
|
||||
$result \= $this\-\>query($sql, \[$project\_id, $record\_id, 'target\_field'\]);
|
||||
|
||||
@@ -392,13 +454,13 @@ while($row \= $result\-\>fetch\_assoc()){
|
||||
//...处理逻辑
|
||||
}
|
||||
|
||||
### **A.3 API Python 鈭支<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>之<EFBFBD>寥<EFBFBD><EFBFBD>唳旿嚗?*
|
||||
### **A.3 API Python 交互(处理大批量数据)**
|
||||
|
||||
Python
|
||||
|
||||
def export\_large\_project(api\_url, token):
|
||||
"""
|
||||
<EFBFBD><EFBFBD>鸌撖澆枂憭批<EFBFBD>憿寧𤌍<EFBFBD>唳旿隞仿<EFBFBD><EFBFBD>滩<EFBFBD><EFBFBD>?
|
||||
分批导出大型项目数据以避免超时
|
||||
"""
|
||||
\# 1\. 首先获取所有记录ID
|
||||
payload \= {
|
||||
@@ -410,13 +472,13 @@ def export\_large\_project(api\_url, token):
|
||||
r \= requests.post(api\_url, data=payload)
|
||||
records \= \[x\['record\_id'\] for x in r.json()\]
|
||||
|
||||
\# 2\. <EFBFBD><EFBFBD><EFBFBD>憭<EFBFBD><EFBFBD> (靘见<E99D98>瘥誩<E798A5>100<EFBFBD>?
|
||||
\# 2\. 分块处理 (例如每块100条)
|
||||
chunk\_size \= 100
|
||||
all\_data \=
|
||||
|
||||
for i in range(0, len(records), chunk\_size):
|
||||
chunk \= records\[i:i \+ chunk\_size\]
|
||||
\# <EFBFBD><EFBFBD>遣霂瑟<EFBFBD><EFBFBD>孵<EFBFBD><EFBFBD><EFBFBD>扇敶?
|
||||
\# 构建请求特定的记录
|
||||
batch\_payload \= {
|
||||
'token': token,
|
||||
'content': 'record',
|
||||
@@ -429,57 +491,57 @@ def export\_large\_project(api\_url, token):
|
||||
|
||||
r\_batch \= requests.post(api\_url, data=batch\_payload)
|
||||
all\_data.extend(r\_batch.json())
|
||||
print(f"撌脣紡<EFBFBD>?{len(all\_data)} <EFBFBD>∟扇敶?..")
|
||||
print(f"已导出 {len(all\_data)} 条记录...")
|
||||
|
||||
return pd.DataFrame(all\_data)
|
||||
|
||||
#### **撘閧鍂<EFBFBD><EFBFBD><EFBFBD>雿?*
|
||||
#### **引用的著作**
|
||||
|
||||
1. Supporting rapid innovation in research data capture and management: the REDCap external module framework \- PubMed Central, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://pmc.ncbi.nlm.nih.gov/articles/PMC12202089/](https://pmc.ncbi.nlm.nih.gov/articles/PMC12202089/)
|
||||
2. The Process of Installing REDCap, a Web Based Database Supporting Biomedical Research: The First Year \- PubMed Central, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://pmc.ncbi.nlm.nih.gov/articles/PMC4287671/](https://pmc.ncbi.nlm.nih.gov/articles/PMC4287671/)
|
||||
3. Join & Get REDCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/join/](https://projectredcap.org/join/)
|
||||
4. How to Acquire a REDCap License \- NACC Docs, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://docs.naccdata.org/edc/data-capture-development/how-to-acquire-a-redcap-license](https://docs.naccdata.org/edc/data-capture-development/how-to-acquire-a-redcap-license)
|
||||
5. 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/join/\#:\~:text=Although%20REDCap%20is%20available%20at,your%20organization%20must%20be%20executed.](https://projectredcap.org/join/#:~:text=Although%20REDCap%20is%20available%20at,your%20organization%20must%20be%20executed.)
|
||||
6. FAQ \- REDCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/about/faq/](https://projectredcap.org/about/faq/)
|
||||
7. Installation & Technical Requirements \- REDCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/software/requirements/](https://projectredcap.org/software/requirements/)
|
||||
8. REDCap Technical Overview Introduction REDCap Infrastructure: Best Practices and Dependencies, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/wp-content/resources/REDCapTechnicalOverview.pdf](https://projectredcap.org/wp-content/resources/REDCapTechnicalOverview.pdf)
|
||||
9. REDCap External Module Development for REDCap Admins and Developers, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://ctsit.github.io/redcap\_external\_module\_development\_guide/guide\_for\_admins\_and\_devs.html](https://ctsit.github.io/redcap_external_module_development_guide/guide_for_admins_and_devs.html)
|
||||
10. REDCap 'Hello World' external module development guide \- Ayesh Alshukri, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://ayeshalshukri.co.uk/category/guides/redcap-external-module-development-guide-hello-world/](https://ayeshalshukri.co.uk/category/guides/redcap-external-module-development-guide-hello-world/)
|
||||
11. REDCap External Module Development for Developers \- GitHub Pages, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://ctsit.github.io/redcap\_external\_module\_development\_guide/guide\_for\_devs.html](https://ctsit.github.io/redcap_external_module_development_guide/guide_for_devs.html)
|
||||
12. REDCap External Module Development Beginner's Guide \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/vanderbilt-redcap/external-module-framework-docs/blob/main/guide.md](https://github.com/vanderbilt-redcap/external-module-framework-docs/blob/main/guide.md)
|
||||
13. Shazam.php \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/susom/redcap-em-shazam/blob/master/Shazam.php](https://github.com/susom/redcap-em-shazam/blob/master/Shazam.php)
|
||||
14. redcap-copy-data-on-save/CopyDataOnSave.php at main 繚 lsgs ..., 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/lsgs/redcap-copy-data-on-save/blob/main/CopyDataOnSave.php](https://github.com/lsgs/redcap-copy-data-on-save/blob/main/CopyDataOnSave.php)
|
||||
15. README.md 繚 main 繚 BRIC / Epic Hl7 Integration 繚 GitLab, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://gitlab.msu.edu/bric/epic-hl7-integration/-/blob/main/README.md](https://gitlab.msu.edu/bric/epic-hl7-integration/-/blob/main/README.md)
|
||||
16. REDCap-Changelog\_8.1.0.docx, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://www.bu.edu/ctsi/files/2016/02/REDCap-Changelog\_8.1.0.docx](https://www.bu.edu/ctsi/files/2016/02/REDCap-Changelog_8.1.0.docx)
|
||||
17. vanderbilt-redcap/auto-record-generation: Module that allows for a new record to be generated in another project (or the same project) on a flagging field being saved. Allows for data fields to be transferred to the new record as well. \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/vanderbilt-redcap/auto-record-generation](https://github.com/vanderbilt-redcap/auto-record-generation)
|
||||
18. 2018 REDCapCon Poster Competition, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/wp-content/uploads/2018/08/2018-REDCapCon-Posters.pdf](https://projectredcap.org/wp-content/uploads/2018/08/2018-REDCapCon-Posters.pdf)
|
||||
19. vanderbilt-redcap/external-module-framework-docs \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/vanderbilt-redcap/external-module-framework-docs](https://github.com/vanderbilt-redcap/external-module-framework-docs)
|
||||
20. CVE-2017-7351: REDCap 7.0.0 \- 7.0.10 SQL Injection \- LRQA, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://www.lrqa.com/en/cyber-labs/cve-2017-7351-redcap-7-0-0-7-0-10-sql-injection/](https://www.lrqa.com/en/cyber-labs/cve-2017-7351-redcap-7-0-0-7-0-10-sql-injection/)
|
||||
21. ctsit/redcap\_webservices: REDCap external module that provides a way to expose SQL query results to the external world. \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/ctsit/redcap\_webservices](https://github.com/ctsit/redcap_webservices)
|
||||
22. REDCap: Multiple Cross-Site Scripting (XSS) Vulnerabilities \- LevelBlue, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://levelblue.com/blogs/spiderlabs-blog/redcap-multiple-cross-site-scripting-xss-vulnerabilities](https://levelblue.com/blogs/spiderlabs-blog/redcap-multiple-cross-site-scripting-xss-vulnerabilities)
|
||||
23. Yale External Module (EM): Checklist for EM Development \- REDCap@Yale, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://portal.redcap.yale.edu/media/91/download?inline](https://portal.redcap.yale.edu/media/91/download?inline)
|
||||
24. Article \- REDCap Security Information \- TeamDynamix, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://ecu.teamdynamix.com/TDClient/1409/Portal/KB/ArticleDet?ID=67288](https://ecu.teamdynamix.com/TDClient/1409/Portal/KB/ArticleDet?ID=67288)
|
||||
25. Mobile App Guide \- CENTER FOR RESEARCH INFORMATICS, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://cri.uchicago.edu/wp-content/uploads/2015/12/REDCap-Mobile-App-Guide.pdf](https://cri.uchicago.edu/wp-content/uploads/2015/12/REDCap-Mobile-App-Guide.pdf)
|
||||
26. Mobile App User's Guide, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://www.ctsi.ufl.edu/wordpress/files/2023/12/new-REDCap-Mobile-App-Guide-1.pdf](https://www.ctsi.ufl.edu/wordpress/files/2023/12/new-REDCap-Mobile-App-Guide-1.pdf)
|
||||
27. CFRI DM REDCap Mobile App Manual, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/wp-content/uploads/2016/08/CFRI-DM-REDCap-Mobile-App-Manual.pdf](https://projectredcap.org/wp-content/uploads/2016/08/CFRI-DM-REDCap-Mobile-App-Manual.pdf)
|
||||
28. Records \- PyCap \- REDCap-Tools, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[http://redcap-tools.github.io/PyCap/api\_reference/records/](http://redcap-tools.github.io/PyCap/api_reference/records/)
|
||||
29. API-Best-Practices-and-Guide-1.docx \- UConn Health, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://health.uconn.edu/clinical-research-center/wp-content/uploads/sites/50/2024/02/API-Best-Practices-and-Guide-1.docx](https://health.uconn.edu/clinical-research-center/wp-content/uploads/sites/50/2024/02/API-Best-Practices-and-Guide-1.docx)
|
||||
30. REDCap: Updating Mobile App Projects \- SMPH Enterprise Applications \- Research KB, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://kb.wisc.edu/smph/informatics/page.php?id=152765](https://kb.wisc.edu/smph/informatics/page.php?id=152765)
|
||||
31. In-Depth Guide | REDCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectredcap.org/wp-content/uploads/2019/07/In-Depth-Guide2019.pdf](https://projectredcap.org/wp-content/uploads/2019/07/In-Depth-Guide2019.pdf)
|
||||
32. Services | REDCap \- The George Washington University, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://redcap.smhs.gwu.edu/services](https://redcap.smhs.gwu.edu/services)
|
||||
33. MyCap Resources, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectmycap.org/mycap-resources/](https://projectmycap.org/mycap-resources/)
|
||||
34. MyCap <EFBFBD>?Mobilizing the participant voice, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectmycap.org/](https://projectmycap.org/)
|
||||
35. MyCap: a flexible and configurable platform for mobilizing the participant voice \- PMC, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://pmc.ncbi.nlm.nih.gov/articles/PMC9165428/](https://pmc.ncbi.nlm.nih.gov/articles/PMC9165428/)
|
||||
36. MyCap \- REDCap Support \- University of Alberta, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://help.redcap.ualberta.ca/help-and-faq/mycap](https://help.redcap.ualberta.ca/help-and-faq/mycap)
|
||||
37. REDCap: MyCap \- Active Task List \- SMPH Enterprise Applications \- Research KB, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://kb.wisc.edu/smph/informatics/133154](https://kb.wisc.edu/smph/informatics/133154)
|
||||
38. REDCap External Module <EFBFBD>?MyCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://projectmycap.org/tag/redcap-external-module/](https://projectmycap.org/tag/redcap-external-module/)
|
||||
39. MYCAP HELP Table of Contents \- REDCap, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://redcap.med.upenn.edu/redcap\_v14.3.13/Resources/misc/mycap\_help.pdf](https://redcap.med.upenn.edu/redcap_v14.3.13/Resources/misc/mycap_help.pdf)
|
||||
40. How to use exportRecordsTyped function from the redcapAPI package to import the data without factors? \- Stack Overflow, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://stackoverflow.com/questions/76815004/how-to-use-exportrecordstyped-function-from-the-redcapapi-package-to-import-the](https://stackoverflow.com/questions/76815004/how-to-use-exportrecordstyped-function-from-the-redcapapi-package-to-import-the)
|
||||
41. JSONDecodeError 繚 Issue \#265 繚 redcap-tools/PyCap \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/redcap-tools/PyCap/issues/265](https://github.com/redcap-tools/PyCap/issues/265)
|
||||
42. Importing data into REDCap <EFBFBD>?Backup options <EFBFBD>?API Basics \- ITHS, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://www.iths.org/wp-content/uploads/REDCap-Importing-Exporting-302.pdf](https://www.iths.org/wp-content/uploads/REDCap-Importing-Exporting-302.pdf)
|
||||
43. BCCHR-IT/data-entry-trigger-builder: An External Module that provides an interface to create a DET between a source and destination project. \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/BCCHR-IT/data-entry-trigger-builder](https://github.com/BCCHR-IT/data-entry-trigger-builder)
|
||||
44. RedCap API export \- Python Discussions, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://discuss.python.org/t/redcap-api-export/32252](https://discuss.python.org/t/redcap-api-export/32252)
|
||||
45. REDCap External Module for automated generation of record event schedules. \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/lsgs/redcap-autoschedule](https://github.com/lsgs/redcap-autoschedule)
|
||||
46. redcap-autoschedule/README.md at master \- GitHub, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/lsgs/redcap-autoschedule/blob/master/README.md](https://github.com/lsgs/redcap-autoschedule/blob/master/README.md)
|
||||
47. redcap-repo 繚 GitHub Topics, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://github.com/topics/redcap-repo](https://github.com/topics/redcap-repo)
|
||||
48. A Comprehensive Guide to REDCap | UNMC, 霈輸䔮<EFBFBD>園𡢿銝?<3F><><EFBFBD><EFBFBD>?29, 2025嚗?[https://www.unmc.edu/vcr/\_documents/unmc\_redcap\_usage.pdf](https://www.unmc.edu/vcr/_documents/unmc_redcap_usage.pdf)
|
||||
1. Supporting rapid innovation in research data capture and management: the REDCap external module framework \- PubMed Central, 访问时间为 十二月 29, 2025, [https://pmc.ncbi.nlm.nih.gov/articles/PMC12202089/](https://pmc.ncbi.nlm.nih.gov/articles/PMC12202089/)
|
||||
2. The Process of Installing REDCap, a Web Based Database Supporting Biomedical Research: The First Year \- PubMed Central, 访问时间为 十二月 29, 2025, [https://pmc.ncbi.nlm.nih.gov/articles/PMC4287671/](https://pmc.ncbi.nlm.nih.gov/articles/PMC4287671/)
|
||||
3. Join & Get REDCap, 访问时间为 十二月 29, 2025, [https://projectredcap.org/join/](https://projectredcap.org/join/)
|
||||
4. How to Acquire a REDCap License \- NACC Docs, 访问时间为 十二月 29, 2025, [https://docs.naccdata.org/edc/data-capture-development/how-to-acquire-a-redcap-license](https://docs.naccdata.org/edc/data-capture-development/how-to-acquire-a-redcap-license)
|
||||
5. 访问时间为 十二月 29, 2025, [https://projectredcap.org/join/\#:\~:text=Although%20REDCap%20is%20available%20at,your%20organization%20must%20be%20executed.](https://projectredcap.org/join/#:~:text=Although%20REDCap%20is%20available%20at,your%20organization%20must%20be%20executed.)
|
||||
6. FAQ \- REDCap, 访问时间为 十二月 29, 2025, [https://projectredcap.org/about/faq/](https://projectredcap.org/about/faq/)
|
||||
7. Installation & Technical Requirements \- REDCap, 访问时间为 十二月 29, 2025, [https://projectredcap.org/software/requirements/](https://projectredcap.org/software/requirements/)
|
||||
8. REDCap Technical Overview Introduction REDCap Infrastructure: Best Practices and Dependencies, 访问时间为 十二月 29, 2025, [https://projectredcap.org/wp-content/resources/REDCapTechnicalOverview.pdf](https://projectredcap.org/wp-content/resources/REDCapTechnicalOverview.pdf)
|
||||
9. REDCap External Module Development for REDCap Admins and Developers, 访问时间为 十二月 29, 2025, [https://ctsit.github.io/redcap\_external\_module\_development\_guide/guide\_for\_admins\_and\_devs.html](https://ctsit.github.io/redcap_external_module_development_guide/guide_for_admins_and_devs.html)
|
||||
10. REDCap 'Hello World' external module development guide \- Ayesh Alshukri, 访问时间为 十二月 29, 2025, [https://ayeshalshukri.co.uk/category/guides/redcap-external-module-development-guide-hello-world/](https://ayeshalshukri.co.uk/category/guides/redcap-external-module-development-guide-hello-world/)
|
||||
11. REDCap External Module Development for Developers \- GitHub Pages, 访问时间为 十二月 29, 2025, [https://ctsit.github.io/redcap\_external\_module\_development\_guide/guide\_for\_devs.html](https://ctsit.github.io/redcap_external_module_development_guide/guide_for_devs.html)
|
||||
12. REDCap External Module Development Beginner's Guide \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/vanderbilt-redcap/external-module-framework-docs/blob/main/guide.md](https://github.com/vanderbilt-redcap/external-module-framework-docs/blob/main/guide.md)
|
||||
13. Shazam.php \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/susom/redcap-em-shazam/blob/master/Shazam.php](https://github.com/susom/redcap-em-shazam/blob/master/Shazam.php)
|
||||
14. redcap-copy-data-on-save/CopyDataOnSave.php at main · lsgs ..., 访问时间为 十二月 29, 2025, [https://github.com/lsgs/redcap-copy-data-on-save/blob/main/CopyDataOnSave.php](https://github.com/lsgs/redcap-copy-data-on-save/blob/main/CopyDataOnSave.php)
|
||||
15. README.md · main · BRIC / Epic Hl7 Integration · GitLab, 访问时间为 十二月 29, 2025, [https://gitlab.msu.edu/bric/epic-hl7-integration/-/blob/main/README.md](https://gitlab.msu.edu/bric/epic-hl7-integration/-/blob/main/README.md)
|
||||
16. REDCap-Changelog\_8.1.0.docx, 访问时间为 十二月 29, 2025, [https://www.bu.edu/ctsi/files/2016/02/REDCap-Changelog\_8.1.0.docx](https://www.bu.edu/ctsi/files/2016/02/REDCap-Changelog_8.1.0.docx)
|
||||
17. vanderbilt-redcap/auto-record-generation: Module that allows for a new record to be generated in another project (or the same project) on a flagging field being saved. Allows for data fields to be transferred to the new record as well. \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/vanderbilt-redcap/auto-record-generation](https://github.com/vanderbilt-redcap/auto-record-generation)
|
||||
18. 2018 REDCapCon Poster Competition, 访问时间为 十二月 29, 2025, [https://projectredcap.org/wp-content/uploads/2018/08/2018-REDCapCon-Posters.pdf](https://projectredcap.org/wp-content/uploads/2018/08/2018-REDCapCon-Posters.pdf)
|
||||
19. vanderbilt-redcap/external-module-framework-docs \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/vanderbilt-redcap/external-module-framework-docs](https://github.com/vanderbilt-redcap/external-module-framework-docs)
|
||||
20. CVE-2017-7351: REDCap 7.0.0 \- 7.0.10 SQL Injection \- LRQA, 访问时间为 十二月 29, 2025, [https://www.lrqa.com/en/cyber-labs/cve-2017-7351-redcap-7-0-0-7-0-10-sql-injection/](https://www.lrqa.com/en/cyber-labs/cve-2017-7351-redcap-7-0-0-7-0-10-sql-injection/)
|
||||
21. ctsit/redcap\_webservices: REDCap external module that provides a way to expose SQL query results to the external world. \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/ctsit/redcap\_webservices](https://github.com/ctsit/redcap_webservices)
|
||||
22. REDCap: Multiple Cross-Site Scripting (XSS) Vulnerabilities \- LevelBlue, 访问时间为 十二月 29, 2025, [https://levelblue.com/blogs/spiderlabs-blog/redcap-multiple-cross-site-scripting-xss-vulnerabilities](https://levelblue.com/blogs/spiderlabs-blog/redcap-multiple-cross-site-scripting-xss-vulnerabilities)
|
||||
23. Yale External Module (EM): Checklist for EM Development \- REDCap@Yale, 访问时间为 十二月 29, 2025, [https://portal.redcap.yale.edu/media/91/download?inline](https://portal.redcap.yale.edu/media/91/download?inline)
|
||||
24. Article \- REDCap Security Information \- TeamDynamix, 访问时间为 十二月 29, 2025, [https://ecu.teamdynamix.com/TDClient/1409/Portal/KB/ArticleDet?ID=67288](https://ecu.teamdynamix.com/TDClient/1409/Portal/KB/ArticleDet?ID=67288)
|
||||
25. Mobile App Guide \- CENTER FOR RESEARCH INFORMATICS, 访问时间为 十二月 29, 2025, [https://cri.uchicago.edu/wp-content/uploads/2015/12/REDCap-Mobile-App-Guide.pdf](https://cri.uchicago.edu/wp-content/uploads/2015/12/REDCap-Mobile-App-Guide.pdf)
|
||||
26. Mobile App User's Guide, 访问时间为 十二月 29, 2025, [https://www.ctsi.ufl.edu/wordpress/files/2023/12/new-REDCap-Mobile-App-Guide-1.pdf](https://www.ctsi.ufl.edu/wordpress/files/2023/12/new-REDCap-Mobile-App-Guide-1.pdf)
|
||||
27. CFRI DM REDCap Mobile App Manual, 访问时间为 十二月 29, 2025, [https://projectredcap.org/wp-content/uploads/2016/08/CFRI-DM-REDCap-Mobile-App-Manual.pdf](https://projectredcap.org/wp-content/uploads/2016/08/CFRI-DM-REDCap-Mobile-App-Manual.pdf)
|
||||
28. Records \- PyCap \- REDCap-Tools, 访问时间为 十二月 29, 2025, [http://redcap-tools.github.io/PyCap/api\_reference/records/](http://redcap-tools.github.io/PyCap/api_reference/records/)
|
||||
29. API-Best-Practices-and-Guide-1.docx \- UConn Health, 访问时间为 十二月 29, 2025, [https://health.uconn.edu/clinical-research-center/wp-content/uploads/sites/50/2024/02/API-Best-Practices-and-Guide-1.docx](https://health.uconn.edu/clinical-research-center/wp-content/uploads/sites/50/2024/02/API-Best-Practices-and-Guide-1.docx)
|
||||
30. REDCap: Updating Mobile App Projects \- SMPH Enterprise Applications \- Research KB, 访问时间为 十二月 29, 2025, [https://kb.wisc.edu/smph/informatics/page.php?id=152765](https://kb.wisc.edu/smph/informatics/page.php?id=152765)
|
||||
31. In-Depth Guide | REDCap, 访问时间为 十二月 29, 2025, [https://projectredcap.org/wp-content/uploads/2019/07/In-Depth-Guide2019.pdf](https://projectredcap.org/wp-content/uploads/2019/07/In-Depth-Guide2019.pdf)
|
||||
32. Services | REDCap \- The George Washington University, 访问时间为 十二月 29, 2025, [https://redcap.smhs.gwu.edu/services](https://redcap.smhs.gwu.edu/services)
|
||||
33. MyCap Resources, 访问时间为 十二月 29, 2025, [https://projectmycap.org/mycap-resources/](https://projectmycap.org/mycap-resources/)
|
||||
34. MyCap – Mobilizing the participant voice, 访问时间为 十二月 29, 2025, [https://projectmycap.org/](https://projectmycap.org/)
|
||||
35. MyCap: a flexible and configurable platform for mobilizing the participant voice \- PMC, 访问时间为 十二月 29, 2025, [https://pmc.ncbi.nlm.nih.gov/articles/PMC9165428/](https://pmc.ncbi.nlm.nih.gov/articles/PMC9165428/)
|
||||
36. MyCap \- REDCap Support \- University of Alberta, 访问时间为 十二月 29, 2025, [https://help.redcap.ualberta.ca/help-and-faq/mycap](https://help.redcap.ualberta.ca/help-and-faq/mycap)
|
||||
37. REDCap: MyCap \- Active Task List \- SMPH Enterprise Applications \- Research KB, 访问时间为 十二月 29, 2025, [https://kb.wisc.edu/smph/informatics/133154](https://kb.wisc.edu/smph/informatics/133154)
|
||||
38. REDCap External Module – MyCap, 访问时间为 十二月 29, 2025, [https://projectmycap.org/tag/redcap-external-module/](https://projectmycap.org/tag/redcap-external-module/)
|
||||
39. MYCAP HELP Table of Contents \- REDCap, 访问时间为 十二月 29, 2025, [https://redcap.med.upenn.edu/redcap\_v14.3.13/Resources/misc/mycap\_help.pdf](https://redcap.med.upenn.edu/redcap_v14.3.13/Resources/misc/mycap_help.pdf)
|
||||
40. How to use exportRecordsTyped function from the redcapAPI package to import the data without factors? \- Stack Overflow, 访问时间为 十二月 29, 2025, [https://stackoverflow.com/questions/76815004/how-to-use-exportrecordstyped-function-from-the-redcapapi-package-to-import-the](https://stackoverflow.com/questions/76815004/how-to-use-exportrecordstyped-function-from-the-redcapapi-package-to-import-the)
|
||||
41. JSONDecodeError · Issue \#265 · redcap-tools/PyCap \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/redcap-tools/PyCap/issues/265](https://github.com/redcap-tools/PyCap/issues/265)
|
||||
42. Importing data into REDCap • Backup options • API Basics \- ITHS, 访问时间为 十二月 29, 2025, [https://www.iths.org/wp-content/uploads/REDCap-Importing-Exporting-302.pdf](https://www.iths.org/wp-content/uploads/REDCap-Importing-Exporting-302.pdf)
|
||||
43. BCCHR-IT/data-entry-trigger-builder: An External Module that provides an interface to create a DET between a source and destination project. \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/BCCHR-IT/data-entry-trigger-builder](https://github.com/BCCHR-IT/data-entry-trigger-builder)
|
||||
44. RedCap API export \- Python Discussions, 访问时间为 十二月 29, 2025, [https://discuss.python.org/t/redcap-api-export/32252](https://discuss.python.org/t/redcap-api-export/32252)
|
||||
45. REDCap External Module for automated generation of record event schedules. \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/lsgs/redcap-autoschedule](https://github.com/lsgs/redcap-autoschedule)
|
||||
46. redcap-autoschedule/README.md at master \- GitHub, 访问时间为 十二月 29, 2025, [https://github.com/lsgs/redcap-autoschedule/blob/master/README.md](https://github.com/lsgs/redcap-autoschedule/blob/master/README.md)
|
||||
47. redcap-repo · GitHub Topics, 访问时间为 十二月 29, 2025, [https://github.com/topics/redcap-repo](https://github.com/topics/redcap-repo)
|
||||
48. A Comprehensive Guide to REDCap | UNMC, 访问时间为 十二月 29, 2025, [https://www.unmc.edu/vcr/\_documents/unmc\_redcap\_usage.pdf](https://www.unmc.edu/vcr/_documents/unmc_redcap_usage.pdf)
|
||||
Reference in New Issue
Block a user