快速开始
- 在 GitHub 上 Fork 仓库
- 克隆你的 fork 到本地:
- 安装依赖:
- 创建功能分支:
- 启动开发服务器:
代码风格与规范
本项目遵循特定的模式以保持一致性: TypeScript- 启用严格类型检查,尽量避免使用
any - 数据结构使用 interface,联合类型使用 type
- 优先使用
const而非let,绝不使用var
- Services(
src/services/)处理数据获取与业务逻辑 - Components(
src/components/)处理 UI 渲染 - Config(
src/config/)包含静态数据与常量 - Utils(
src/utils/)包含共享的辅助函数
- 耗时计算应放在 Web Worker 中运行
- 列表项超过 50 条时使用虚拟滚动
- 对外部 API 调用实现熔断器
- 代码应通过清晰的命名实现自文档化
- 仅在算法或变通方案不明显时才添加注释
- 永远不要提交被注释掉的代码
安全与输入校验
仪表盘处理来自数十个外部来源的不可信数据。纵深防御措施可防止注入攻击与 API 滥用。XSS 防护
所有对用户可见的内容在插入 DOM 之前都会被净化:- 新闻标题与来源(RSS feeds)
- 搜索结果与高亮
- 监控关键词(用户输入)
- 地图弹窗内容
- 紧张关系配对标签
mark 元素高亮在包裹匹配项之前先对文本进行转义,防止通过构造恶意搜索查询进行注入。
代理端点校验
公开 API 入口对所有参数进行校验与限幅:| 端点 | 校验规则 |
|---|---|
GET /api/market/v1/list-market-quotes | 股票/指数 symbols 列表;为空则返回默认值 |
GET /api/market/v1/list-crypto-quotes | CoinGecko ids 列表;为空则返回默认值 |
GET /api/polymarket | 遗留 Polymarket 代理:排序字段白名单,limit 限制在 1-100 |
内容安全
- URL 通过
URL()构造函数校验,仅允许http:与https:协议 - 外部链接使用
rel="noopener"以防止反向标签劫持 - 没有内联脚本或
eval(),所有代码在构建时打包
安全相关贡献
- 渲染用户可控或外部数据时始终使用
escapeHtml() - 对来自外部来源的 URL 使用
sanitizeUrl() - 在 API 代理端点中校验并限幅参数
提交 Pull Request
-
确保代码可构建:
- 在浏览器中手动测试你的改动
-
编写清晰的提交信息:
-
推送到你的 fork:
-
提交 Pull Request,需包含:
- 清晰描述改动的标题
- PR 做了什么以及为什么的说明
- UI 改动的截图
- 任何破坏性变更或迁移说明
优秀的 PR 应具备什么
| 应该做 | 不应该做 |
|---|---|
| 聚焦于单一功能或修复 | 把不相关的改动捆绑在一起 |
| 遵循现有代码模式 | 未经讨论就引入新框架 |
| 保持改动最小且聚焦 | 不必要地重构周边代码 |
| 添加功能时更新 README | 添加功能却不写文档 |
| 测试边界情况 | 只考虑正常流程 |
贡献类型
Bug 修复- 发现问题?修复它并提交 PR
- 在 PR 描述中提供复现步骤
- 新的数据图层(需有公开 API 来源)
- UI/UX 改进
- 性能优化
- 新的信号检测算法
- 用于新闻聚合的额外 RSS feeds
- 新的地理空间数据集(基地、基础设施等)
- 现有数据的替代 API
- 澄清现有文档
- 添加示例与用例
- 修复错别字并提升可读性
- 通过 GitHub Issues(非关键)或邮件(关键)报告漏洞
- XSS 防护改进
- 输入校验增强
评审流程
- 提交 PR 时运行自动化检查
- 数日内进行维护者评审
- 通过向同一分支提交 commit 来处理反馈
- 批准后合并
