Skip to content

BestBlogs.dev - Development Conventions

版本: v2.1 最后更新: 2026-03-27 状态: 活文档,持续补充


1. 代码风格

1.1 TypeScript / React

规则要求
导出方式具名导出,禁止使用 export default
Props 类型每个组件必须定义 Props interface
样式优先Tailwind CSS,所有组件支持 dark: 变体
条件类使用 clsx + tailwind-merge
图标Lucide React
typescript
// ✅ 正确
interface ButtonProps {
  variant: 'primary' | 'secondary';
  onClick?: () => void;
}

export function Button({ variant, onClick }: ButtonProps) { }

// ❌ 错误
export default function Button(props) { }

1.2 Java

规则要求
版本特性优先使用 Java 21: Record、Pattern Matching、Virtual Threads
命名PascalCase 类名,camelCase 方法/变量
注释中文注释,说明"为什么"而非"是什么"
嵌套限制超过 3 层缩进视为设计问题
java
// ✅ 使用 Record
public record UserDTO(String id, String name) { }

// ✅ 使用 Pattern Matching
if (obj instanceof String s && s.length() > 10) { }

// ✅ 提前 return 减少嵌套
if (user == null) return;
if (!user.isActive()) return;

1.3 命名规范

层级JavaTypeScript
组件/类*Controller, *Service, *ModelPascalCase 组件名
Hooks-use* 前缀
工具函数camelCasecamelCase
常量UPPER_SNAKE_CASEUPPER_SNAKE_CASE
类型/接口PascalCasePascalCase

2. 关键约束(Critical)

2.1 金额字段

要求: 必须使用 BigDecimal,禁止 Double/Float

java
// ❌ 错误
private Double amount;

// ✅ 正确
private BigDecimal amount;

2.2 多语言处理

要求: Controller 必须使用 LanguageHelper.getEffectiveLanguage()

java
// ❌ 错误
LanguageEnum lang = LanguageEnum.parseLanguage(request.getHeader("Accept-Language"));

// ✅ 正确
LanguageEnum lang = LanguageHelper.getEffectiveLanguage(request.getHeader("Accept-Language"));

2.3 MongoDB 查询

要求: 大批量查询必须分页,禁止无限制 findAll()

java
// ❌ 错误
List<Article> articles = articleRepository.findAll();

// ✅ 正确
Pageable pageable = PageRequest.of(0, 20);
Page<Article> articles = articleRepository.findAll(pageable);

2.4 环境变量安全

要求: 前端只能访问 NEXT_PUBLIC_* 前缀变量

typescript
// ❌ 错误
const API_KEY = "sk-1234567890abcdef";

// ✅ 正确
const API_KEY = process.env.NEXT_PUBLIC_API_KEY;

2.5 API 响应格式

要求: 所有响应使用 ApiResponse<T> 格式

json
{
  "success": true,
  "message": "操作成功",
  "data": { },
  "errorCode": null
}

3. 模块边界

3.1 后端分层依赖

Controller 层(API 入口)

Application 层(应用服务)

Domain 层(领域模型 + 领域服务)

Infrastructure 层(Repository + Adapter)

禁止:

  • Controller 直接操作 Repository
  • Domain 层依赖 Infrastructure
  • 跨层直接使用对象

3.2 文件大小限制

类型限制超过时行动
单文件≤ 800 行拆分为多个类/模块
单包≤ 8 个文件拆分为子包

3.3 内容工作流边界

  • 前台仅消费 COMPLETED 状态数据
  • 状态转移必须通过 ResourceModel 行为方法
  • 禁止 Controller 直接修改状态

4. 安全规范

4.1 JWT 认证

  • Token 30 分钟过期,自动刷新
  • 敏感操作验证 adminFlag
  • 禁止日志记录完整 token

4.2 输入校验

  • 所有外部输入必须校验
  • 使用 Optional 或显式 null 检查
  • 单元测试覆盖 null/空字符串场景

4.3 SQL/NoSQL 注入防护

  • 禁止拼接查询语句
  • 使用 Spring Data Repository
  • 用户可配置 URL 需校验合法性

5. 测试规范

5.1 覆盖率要求

层级覆盖率
核心业务逻辑> 80%
Domain 层> 80%
重构前后不能降低

5.2 测试命名

格式: test{场景}{期望结果}

java
@Test
void testFirstCheckInSuccess() { }

@Test
void testDuplicateCheckInReturnsZeroPoints() { }

5.3 测试数据库

  • 使用 Testcontainers MongoDB(无需本地 MongoDB)
  • 功能开关变更后必须调用 parameterReadService.refreshCache()
  • 错误码断言使用数字字符串(如 "101003"

6. Git 规范

6.1 Issue 关联(必须)

每次提交必须关联一个 GitHub Issue。 无 Issue 的工作先创建 Issue 再提交。

Issue 管理原则:

  • 所有功能、Bug Fix、运营任务均在 GitHub Issues 中跟踪
  • Issue 使用 Labels 分类:p0/p1/p2/p3(优先级)+ type:*(类型)+ area:*(组件)
  • 功能 Issue 需写明验收标准(Acceptance Criteria)

6.2 Commit Message

遵循 Conventional Commits,footer 必须包含 Issue 引用

<type>(<scope>): <subject>

[可选 body:说明为什么这样做,而非做了什么]

Closes #<issue-number>

Type 说明:

Type用途
feat新功能
fixBug 修复
refactor重构(不改变行为)
perf性能优化
docs文档变更
test测试补充
style样式/格式(不影响逻辑)
ops运维/配置/开关变更
chore构建工具、依赖升级等杂项

Scope 说明(选填,建议使用):

Scope对应模块
brief每日早报
review每日回顾
recommend为你推荐
copilotAI 伴读
subscription订阅源管理
proPro 订阅
search搜索
openapiOpenAPI
landingLanding 页面
settings设置页
auth鉴权
infra基础设施

原子提交原则: 每个 commit 只做一件事,便于 git bisect、changelog 生成和 PR review。

示例:

feat(brief): implement UserBriefPreference settings API

Adds GET/PUT /api/users/me/brief/preferences endpoint and connects
the Settings brief section form to persist user customization.

Closes #101
fix(copilot): prevent auto-open on first visit during beta

During testing period, copilot panel should not auto-open
to avoid interrupting users before the feature is stable.

Closes #98
ops(infra): enable ElasticSearch and vector search in production

Configure ES connection pool, verify index health,
and enable FEATURE_VECTOR_SEARCH ConfigKey.

Closes #96

6.3 禁止操作

  • ❌ 更新 git config
  • push --force 到 main/master
  • git reset --hard 除非明确要求
  • --no-verify 跳过 hooks
  • ❌ 提交不关联 Issue(紧急 hotfix 除外,事后补充)

6.5 可观测性约定(IMPORTANT)

新增/修改代码涉及外部调用、定时任务、告警规则时,必须遵守以下硬约束(详细条款见 bestblogs-docs/11-OPERATIONS.md §开发时的监控与告警要求):

  • 事件常量集中:后端事件名引用统一常量类,禁止硬编码字符串;新增事件先更新 bestblogs-docs/specs/observability-event-catalog.md
  • 外部调用双埋:AI / TTS / HTTP 入口 try-finally 同时上报 Micrometer Counter/Timer + 分析平台事件;失败分支区分 SUCCESS/FAILED/TIMEOUT/RATELIMITED
  • Job 自动三写:标准 Job 基类和 Job 锁注解自动写 MongoDB 执行日志 + Meter + 分析平台事件;日级/周级 Job 必须在健康检查 Job 中登记宽松阈值
  • 告警统一入口:通过统一告警分发服务触发,禁止绕过直接调通知适配层;deduplicateKey{source}:{alertName}:{granularity|param} 命名
  • 告警级别语义CRITICAL=任意一次告警(用户已受影响)、WARNING=阈值/滑窗触发、INFO=仅日志不触达
  • 内部端点/api/internal/* 内部端点必须从公网限流过滤器跳过,避免告警洪峰被 503 误触
  • 敏感字段:禁止把完整 userId/email/连接字符串写入告警内容;errMsg 上报前截断并做白名单净化
  • Meter 命名bestblogs.{module}.{action}.{result};分析平台事件命名:{domain}_{action}[_outcome] snake_case
  • 告警阈值:全部走 ALERT_* ConfigKey 动态调整;代码内仅保留 fallback 默认值

7. 性能规范

7.1 接口响应时间

指标要求
P95< 200ms
P99< 500ms

超过限制必须优化(加索引、加缓存、异步处理)

7.2 大列表处理

  • 超过 100 条使用虚拟滚动(react-window
  • 分页从 1 开始(currentPage=1

8. 文档规范

8.1 新增功能

  1. 更新 2-PRODUCT.md 产品能力地图
  2. 如需架构变更,更新 4-ARCHITECTURE.md
  3. 关键决策记录到 2-PRODUCT.md4-ARCHITECTURE.md(不再单独维护 DECISIONS.md)

8.2 代码注释

  • 说明"为什么"(Why),而非"是什么"(What)
  • 中文注释
java
// ❌ 错误
// Check if user is null
if (user == null) { }

// ✅ 正确
// 未登录用户不能操作,直接返回 401
if (user == null) { }

9. AI 协作技巧

9.1 Bug 报告模板

必须提供三要素:

  1. 如何复现:具体操作步骤
  2. 期望结果:正常应该看到什么
  3. 实际结果:当前错误(含日志)

9.2 代码审查提示

Grill me on these changes and don't make a PR until I pass your test.
Prove to me this works.

9.3 规则更新

当 AI 犯错被纠正后:

Update the relevant CLAUDE.md so you don't make that mistake again.

10. 相关文档

文档路径说明
产品蓝图2-PRODUCT.md产品策略、能力矩阵、路线
技术架构4-ARCHITECTURE.md系统架构、数据流
设计原则5-DESIGN.md视觉与交互规范
UI 执行规范6-UI-SPEC.mdUI 组件与交互细则
术语规范10-TERMINOLOGY.md中英术语与统一表达
当前状态8-CURRENT_STATE.md里程碑状态与待办

11. 更新日志

日期变更
2026-03-27更新文档引用,对齐新文档体系(编号前缀命名)
2026-03-23创建 CONVENTIONS.md,整合 SKILL.md 内容
2026-02-05初始化团队规则库

基于 MIT 协议发布