Skip to content

Commit 4ed667b

Browse files
author
shijiashuai
committed
docs: rewrite 6 low-quality rule files with specific actionable guidance
Replace vague patterns with concrete tools, libraries, commands and code patterns: - fastapi.mdc: Pydantic models, Depends(), async SQLAlchemy, uvicorn - node-express.mdc: helmet, cors, JWT, supertest, PM2 - database.mdc: Prisma schema/queries, Supabase RLS, EXPLAIN ANALYZE - svelte.mdc: reactivity, SvelteKit routing, use:enhance forms - vue.mdc: script setup, Pinia storeToRefs, defineAsyncComponent - tailwind.mdc: CVA variants, cn() utility, JIT engine, WCAG a11y
1 parent bd0dba3 commit 4ed667b

6 files changed

Lines changed: 322 additions & 370 deletions

File tree

database.mdc

Lines changed: 47 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -6,81 +6,64 @@ globs: prisma/**/*, src/db/**/*, **/*.prisma, supabase/**/*
66
# 数据库最佳实践
77

88
## Prisma 设置
9-
- 使用正确的模式设计
10-
- 实现正确的迁移
11-
- 使用正确的关​​系定义
12-
- 配置正确的连接
13-
- 实现正确的种子数据填充
14-
- 使用正确的客户端设置
9+
- 在 `prisma/schema.prisma` 中定义数据模型,使用 `datasource` 和 `generator` 块
10+
- 使用 `npx prisma migrate dev --name <名称>` 创建迁移
11+
- 使用 `@relation` 显式定义模型间的一对多、多对多关系
12+
- 在 `DATABASE_URL` 中配置连接字符串,使用连接池参数(如 `?connection_limit=5`)
13+
- 在 `prisma/seed.ts` 中编写种子脚本,使用 `prisma db seed` 填充初始数据
14+
- 使用单例模式创建 `PrismaClient` 实例,避免开发环境中热重载导致的连接泄漏
1515

1616
## Prisma 模型
17-
- 使用正确的模型命名
18-
- 实现正确的关​​系
19-
- 使用正确的字段类型
20-
- 定义正确的索引
21-
- 实现正确的约束
22-
- 使用正确的枚举
17+
- 模型名使用 PascalCase 单数形式(`User`, `Order`, `Product`)
18+
- 使用 `@id` 和 `@default(cuid())` 或 `@default(uuid())` 定义主键
19+
- 选择合适的字段类型:`String`, `Int`, `Float`, `Boolean`, `DateTime`, `Json`
20+
- 使用 `@@index([fieldName])` 为高频查询字段创建索引
21+
- 使用 `@@unique([field1, field2])` 创建联合唯一约束
22+
- 使用 `enum` 定义状态等有限值集合(如 `enum OrderStatus { PENDING SHIPPED DELIVERED }`)
2323

2424
## Prisma 查询
25-
- 使用正确的查询优化
26-
- 实现正确的过滤
27-
- 使用正确的关​​系加载
28-
- 正确处理事务
29-
- 实现正确的分页
30-
- 使用正确的聚合
25+
- 使用 `select` 或 `include` 精确控制返回字段,避免过度获取数据
26+
- 使用 `where` 条件组合 `AND`, `OR`, `NOT` 进行复杂过滤
27+
- 使用 `include` 加载关联数据,避免手动多次查询(N+1 问题)
28+
- 使用 `prisma.$transaction()` 包裹需要原子性的多步操作
29+
- 使用 `skip` + `take` 实现分页,配合 `orderBy` 排序
30+
- 使用 `_count`, `_sum`, `_avg`, `_min`, `_max` 进行聚合查询
3131

3232
## Supabase 设置
33-
- 配置正确的项目设置
34-
- 实现正确的身份验证
35-
- 使用正确的数据库设置
36-
- 配置正确的存储
37-
- 实现正确的策略
38-
- 使用正确的客户端设置
33+
- 使用 `@supabase/supabase-js` 客户端库连接 Supabase 项目
34+
- 使用 Supabase Auth 内置的邮箱/密码、OAuth、Magic Link 认证
35+
- 在 Supabase Dashboard 或通过 SQL 迁移管理表结构
36+
- 使用 Supabase Storage 存储文件,配置 Bucket 的公开/私有策略
37+
- 通过 SQL 编辑器创建数据库函数和触发器
38+
- 使用 `SUPABASE_URL` 和 `SUPABASE_ANON_KEY` 环境变量初始化客户端
3939

4040
## Supabase 安全
41-
- 实现正确的 RLS 策略
42-
- 使用正确的身份验证
43-
- 配置正确的权限
44-
- 正确处理敏感数据
45-
- 实现正确的备份
46-
- 使用正确的加密
47-
48-
## Supabase 查询
49-
- 使用正确的查询优化
50-
- 实现正确的过滤
51-
- 使用正确的连接
52-
- 正确处理实时数据
53-
- 实现正确的分页
54-
- 使用正确的函数
41+
- 为每张表启用行级安全策略(RLS),使用 `auth.uid()` 限制数据访问
42+
- 使用 `USING` 子句控制 SELECT 权限,`WITH CHECK` 子句控制写入权限
43+
- 区分 `anon` 和 `service_role` 密钥的使用场景,前端仅使用 `anon` 密钥
44+
- 使用 `pgcrypto` 扩展对敏感字段进行加密存储
45+
- 配置每日自动备份,定期测试备份恢复流程
5546

5647
## 数据库设计
57-
- 使用正确的规范化
58-
- 实现正确的索引
59-
- 使用正确的约束
60-
- 定义正确的关​​系
61-
- 实现正确的级联操作
62-
- 使用正确的数据类型
48+
- 遵循第三范式(3NF),在性能需要时适当反规范化
49+
- 为 WHERE、JOIN、ORDER BY 中频繁使用的列创建 B-tree 索引
50+
- 使用 `NOT NULL`、`CHECK`、`UNIQUE`、`FOREIGN KEY` 约束保证数据完整性
51+
- 使用外键定义表间关系,配合 `ON DELETE CASCADE` 或 `ON DELETE SET NULL`
52+
- 选择合适的数据类型:`UUID` 作为主键、`TIMESTAMPTZ` 存储时间、`JSONB` 存储非结构化数据
53+
- 为每张表添加 `created_at` 和 `updated_at` 审计字段
6354

6455
## 性能
65-
- 使用正确的连接池
66-
- 实现正确的缓存
67-
- 使用正确的查询优化
68-
- 正确处理 N+1 查询问题
69-
- 实现正确的批处理
70-
- 监控性能指标
56+
- 配置连接池(PgBouncer 或 Prisma 内置连接池),避免连接耗尽
57+
- 使用 Redis 缓存热点查询结果,设置合理的 TTL
58+
- 使用 `EXPLAIN ANALYZE` 分析慢查询,根据执行计划添加索引
59+
- 使用 `include` / `JOIN` 一次性加载关联数据,消除 N+1 查询
60+
- 使用 `createMany` / `updateMany` 批量操作替代循环中的单条操作
61+
- 监控慢查询日志和连接池使用率
7162

7263
## 安全
73-
- 使用正确的身份验证
74-
- 实现正确的授权
75-
- 正确处理敏感数据
76-
- 使用正确的加密
77-
- 实现正确的备份
78-
- 监控安全问题
79-
80-
## 最佳实践
81-
- 遵循数据库约定
82-
- 使用正确的迁移
83-
- 实现正确的版本控制
84-
- 正确处理错误
85-
- 正确记录模式文档
86-
- 监控数据库健康状况
64+
- 使用参数化查询防止 SQL 注入,切勿拼接用户输入到 SQL 中
65+
- 在应用层实现基于角色的访问控制(RBAC),在数据库层配合 RLS
66+
- 对密码使用 bcrypt 哈希,对敏感数据使用 AES-256 加密
67+
- 使用 SSL/TLS 加密数据库连接
68+
- 实施定期自动备份策略,存储在异地冗余位置
69+
- 使用最小权限原则为应用创建专用数据库用户

fastapi.mdc

Lines changed: 57 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -6,81 +6,75 @@ globs: **/*.py, app/**/*.py, api/**/*.py
66
# FastAPI 最佳实践
77

88
## 项目结构
9-
- 使用正确的目录结构
10-
- 实现正确的模块组织
11-
- 使用正确的依赖注入
12-
- 按域组织路由
13-
- 实现正确的中间件
14-
- 使用正确的配置管理
9+
- 按领域(domain)组织代码:`app/users/`, `app/orders/`, `app/products/`
10+
- 每个领域包含 `router.py`, `schemas.py`, `service.py`, `models.py`
11+
- 将依赖项放在 `app/dependencies/` 中
12+
- 将配置放在 `app/core/config.py`,使用 Pydantic `BaseSettings`
13+
- 使用 `app/middleware/` 存放自定义中间件
14+
- 使用 `app/core/exceptions.py` 集中定义异常处理器
1515

1616
## API 设计
17-
- 使用正确的 HTTP 方法
18-
- 实现正确的状态码
19-
- 使用正确的请求/响应模型
20-
- 实现正确的验证
21-
- 使用正确的错误处理
22-
- 使用 OpenAPI 记录 API
17+
- GET 获取资源、POST 创建、PUT/PATCH 更新、DELETE 删除
18+
- 使用 `status.HTTP_201_CREATED` 等语义化状态码常量
19+
- 使用 Pydantic 模型定义 `response_model`,不要直接返回 ORM 对象
20+
- 使用 `Query()`, `Path()`, `Body()` 添加参数验证和描述
21+
- 使用 `HTTPException` 返回标准化错误响应
22+
- 利用 FastAPI 自动生成的 `/docs` (Swagger) 和 `/redoc` 文档
2323

24-
## 模型
25-
- 使用 Pydantic 模型
26-
- 实现正确的验证
27-
- 使用正确的类型提示
28-
- 保持模型井然有序
29-
- 使用正确的继承
30-
- 实现正确的序列化
24+
## Pydantic 模型
25+
- 为创建、更新、响应分别定义模型:`UserCreate`, `UserUpdate`, `UserResponse`
26+
- 使用 `Field()` 添加验证规则和示例值
27+
- 使用严格的类型提示:`str`, `int`, `Optional[str]`, `list[str]`
28+
- 使用模型继承减少重复:`UserBase` -> `UserCreate` / `UserResponse`
29+
- 使用 `model_config = ConfigDict(from_attributes=True)` 启用 ORM 模式
30+
- 使用自定义验证器 `@field_validator` 处理复杂校验逻辑
3131

3232
## 数据库
33-
- 使用正确的 ORM (SQLAlchemy)
34-
- 实现正确的迁移
35-
- 使用正确的连接池
36-
- 实现正确的事务
37-
- 使用正确的查询优化
38-
- 正确处理数据库错误
33+
- 使用 SQLAlchemy 2.0+ 风格的异步引擎(`create_async_engine`)
34+
- 使用 Alembic 管理数据库迁移
35+
- 使用 `asyncpg` 或 `aiosqlite` 作为异步数据库驱动
36+
- 使用 `async with session.begin()` 管理事务
37+
- 使用 `selectinload()` 或 `joinedload()` 避免 N+1 查询
38+
- 在 `finally` 块或上下文管理器中确保连接释放
39+
40+
## 依赖注入
41+
- 使用 `Depends()` 注入数据库会话、当前用户等公共依赖
42+
- 使用 `yield` 依赖来管理资源的创建和清理
43+
- 将认证逻辑封装为可复用的依赖(如 `get_current_user`)
44+
- 使用依赖覆盖(`app.dependency_overrides`)进行测试
3945

4046
## 认证
41-
- 实现正确的 JWT 认证
42-
- 使用正确的密码哈希
43-
- 实现正确的基于角色的访问控制
44-
- 使用正确的会话管理
45-
- 实现正确的 OAuth2
46-
- 正确处理认证错误
47+
- 使用 `python-jose` 实现 JWT 令牌签发和验证
48+
- 使用 `passlib[bcrypt]` 进行密码哈希
49+
- 实现 `OAuth2PasswordBearer` 作为认证方案
50+
- 使用 Scopes 实现细粒度的权限控制
51+
- 将敏感配置(SECRET_KEY 等)存入环境变量
4752

4853
## 安全
49-
- 实现正确的 CORS
50-
- 使用正确的速率限制
51-
- 实现正确的输入验证
52-
- 使用正确的安全头
53-
- 正确处理安全错误
54-
- 实现正确的日志记录
54+
- 使用 `CORSMiddleware` 配置允许的源、方法和头
55+
- 使用 `slowapi` 或自定义中间件实现速率限制
56+
- 对所有用户输入通过 Pydantic 模型自动验证
57+
- 使用 `starlette.middleware.trustedhost` 限制可信主机
58+
- 使用 `python-multipart` 处理文件上传时限制文件大小和类型
5559

5660
## 性能
57-
- 使用正确的缓存
58-
- 实现正确的异步操作
59-
- 使用正确的后台任务
60-
- 实现正确的连接池
61-
- 使用正确的查询优化
62-
- 监控性能指标
61+
- 路由处理函数使用 `async def`,数据库操作使用异步驱动
62+
- 使用 `BackgroundTasks` 处理邮件发送、日志记录等耗时操作
63+
- 使用 `redis` 或 `aiocache` 实现响应缓存
64+
- 配置数据库连接池大小(`pool_size`, `max_overflow`)
65+
- 使用 `orjson` 或 `ujson` 替代默认 JSON 序列化器以提升性能
6366

6467
## 测试
65-
- 编写正确的单元测试
66-
- 实现正确的集成测试
67-
- 使用正确的测试夹具
68-
- 实现正确的模拟
69-
- 测试错误场景
70-
- 使用正确的测试覆盖率
68+
- 使用 `pytest` + `httpx.AsyncClient` 测试异步端点
69+
- 使用 `pytest-asyncio` 支持异步测试函数
70+
- 使用 `TestClient` (同步) 或 `AsyncClient` (异步) 发送请求
71+
- 使用 `conftest.py` 定义可复用的 fixtures(测试数据库、测试客户端等)
72+
- 使用 `app.dependency_overrides` 注入模拟依赖
73+
- 使用 `pytest-cov` 确保核心业务逻辑的测试覆盖率
7174

7275
## 部署
73-
- 使用正确的 Docker 配置
74-
- 实现正确的 CI/CD
75-
- 使用正确的环境变量
76-
- 实现正确的日志记录
77-
- 使用正确的监控
78-
- 正确处理部署错误
79-
80-
## 文档
81-
- 使用正确的文档字符串
82-
- 实现正确的 API 文档
83-
- 使用正确的类型提示
84-
- 保持文档更新
85-
- 记录错误场景
86-
- 使用正确的版本控制
76+
- 使用 `uvicorn` 作为 ASGI 服务器,生产环境配合 `gunicorn` 使用
77+
- 使用多阶段 Docker 构建减小镜像体积
78+
- 通过 `.env` 文件和 `python-dotenv` 管理环境变量
79+
- 使用结构化日志(`structlog` 或 `loguru`)
80+
- 配置健康检查端点 `/health` 用于容器编排

0 commit comments

Comments
 (0)