修改百度地图AK

This commit is contained in:
xuqiuyun
2025-11-04 09:38:19 +08:00
parent 4b6d14a6ec
commit eacb0453dd
52 changed files with 3865 additions and 65 deletions

View File

@@ -0,0 +1,73 @@
---
description: c++ 编码规则和最佳实践。
globs: **/*.cpp, **/*.hpp
alwaysApply: false
---
# C++ 规则
你是一位精通现代 C++ (C++17/20)、STL 和系统级编程的高级 C++ 开发者。
## 代码风格和结构
- 编写简洁、符合习惯的 C++ 代码,提供准确的示例。
- 遵循现代 C++ 约定和最佳实践。
- 根据需要适当使用面向对象、过程式或函数式编程模式。
- 利用 STL 和标准算法进行集合操作。
- 使用描述性的变量和方法名称(例如,'isUserSignedIn''calculateTotal')。
- 将文件结构化为头文件(*.hpp和实现文件*.cpp并进行合理的关注点分离。
## 命名约定
- 类名使用 PascalCase。
- 变量名和方法使用 camelCase。
- 常量和宏使用 SCREAMING_SNAKE_CASE。
- 成员变量前缀使用下划线或 m_例如`_userId``m_userId`)。
- 使用命名空间逻辑地组织代码。
## C++ 特性使用
- 优先使用现代 C++ 特性例如auto、基于范围的循环、智能指针
- 使用 `std::unique_ptr` 和 `std::shared_ptr` 进行内存管理。
- 优先使用 `std::optional`、`std::variant` 和 `std::any` 作为类型安全的替代方案。
- 使用 `constexpr` 和 `const` 优化编译时计算。
- 使用 `std::string_view` 进行只读字符串操作,避免不必要的复制。
## 语法和格式
- 遵循一致的编码风格,如 Google C++ 风格指南或团队标准。
- 控制结构和方法的大括号放在同一行。
- 使用清晰一致的注释实践。
## 错误处理和验证
- 使用异常进行错误处理(例如,`std::runtime_error``std::invalid_argument`)。
- 使用 RAII 进行资源管理,避免内存泄漏。
- 在函数边界验证输入。
- 使用日志库记录错误例如spdlog、Boost.Log
## 性能优化
- 避免不必要的堆分配;尽可能优先使用基于栈的对象。
- 使用 `std::move` 启用移动语义并避免拷贝。
- 使用 `<algorithm>` 中的算法优化循环(例如,`std::sort``std::for_each`)。
- 使用 Valgrind 或 Perf 等工具分析和优化关键部分。
## 关键约定
- 使用智能指针而非原始指针以提高内存安全性。
- 避免全局变量;谨慎使用单例模式。
- 使用 `enum class` 实现强类型枚举。
- 在类中分离接口和实现。
- 明智地使用模板和元编程来实现通用解决方案。
## 测试
- 使用 Google Test (GTest) 或 Catch2 等框架编写单元测试。
- 使用 Google Mock 等库模拟依赖。
- 为系统组件实现集成测试。
## 安全性
- 使用安全编码实践避免漏洞(例如,缓冲区溢出、悬挂指针)。
- 优先使用 `std::array` 或 `std::vector` 而非原始数组。
- 避免 C 风格的类型转换;必要时使用 `static_cast`、`dynamic_cast` 或 `reinterpret_cast`。
- 在函数和成员变量中强制实施常量正确性。
## 文档
- 为类、方法和关键逻辑编写清晰的注释。
- 使用 Doxygen 生成 API 文档。
- 记录代码的假设、约束和预期行为。
遵循官方 ISO C++ 标准和指南,获取现代 C++ 开发的最佳实践。

View File

@@ -0,0 +1,275 @@
---
description: CSS 和样式规范
globs: *.css, *.scss, *.less, *.styled.ts
alwaysApply: false
---
# CSS 和样式规范
## 样式架构原则
- **组件化样式**:每个组件的样式应该封装在组件内部
- **样式隔离**避免全局样式污染使用CSS-in-JS或CSS Modules
- **主题一致性**:使用设计系统和主题变量保持视觉一致性
- **响应式设计**:优先考虑移动端,采用移动优先的响应式设计
- **性能优化**:避免不必要的样式重绘和重排
## Styled Components 规范
- **组件命名**:使用描述性的组件名,以 `Styled` 开头
```typescript
const StyledCard = styled.div`
padding: 16px;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
`;
```
- **主题使用**:通过 `theme` 属性访问主题变量
```typescript
const StyledButton = styled.button`
background-color: ${({ theme }) => theme.colors.primary};
color: ${({ theme }) => theme.colors.white};
`;
```
- **条件样式**:使用 props 进行条件样式设置
```typescript
const StyledButton = styled.button<{ variant: 'primary' | 'secondary' }>`
background-color: ${({ variant, theme }) =>
variant === 'primary' ? theme.colors.primary : theme.colors.secondary
};
`;
```
- **样式继承**:合理使用样式继承减少重复代码
```typescript
const BaseButton = styled.button`
padding: 8px 16px;
border-radius: 4px;
border: none;
`;
const PrimaryButton = styled(BaseButton)`
background-color: ${({ theme }) => theme.colors.primary};
`;
```
## Ant Design 定制规范
- **主题定制**:使用 ConfigProvider 进行全局主题定制
```typescript
const theme = {
token: {
colorPrimary: '#1890ff',
borderRadius: 6,
fontSize: 14,
},
};
```
- **组件样式覆盖**:使用 CSS-in-JS 覆盖 Ant Design 组件样式
```typescript
const StyledTable = styled(Table)`
.ant-table-thead > tr > th {
background-color: #fafafa;
font-weight: 600;
}
`;
```
- **自定义组件**:基于 Ant Design 组件创建自定义组件
```typescript
const CustomCard = styled(Card)`
border-radius: 12px;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
`;
```
## 响应式设计规范
- **断点定义**:使用标准断点进行响应式设计
```typescript
const breakpoints = {
xs: '480px',
sm: '576px',
md: '768px',
lg: '992px',
xl: '1200px',
xxl: '1600px',
};
```
- **媒体查询**:使用 CSS-in-JS 编写媒体查询
```typescript
const ResponsiveContainer = styled.div`
padding: 16px;
@media (min-width: ${({ theme }) => theme.breakpoints.md}) {
padding: 24px;
}
`;
```
- **Flex布局**:优先使用 Flexbox 进行布局
```typescript
const FlexContainer = styled.div`
display: flex;
flex-direction: column;
gap: 16px;
@media (min-width: ${({ theme }) => theme.breakpoints.md}) {
flex-direction: row;
}
`;
```
## 颜色和主题规范
- **颜色系统**:定义完整的颜色系统
```typescript
const colors = {
primary: '#1890ff',
success: '#52c41a',
warning: '#faad14',
error: '#ff4d4f',
text: {
primary: '#262626',
secondary: '#595959',
disabled: '#bfbfbf',
},
background: {
primary: '#ffffff',
secondary: '#fafafa',
disabled: '#f5f5f5',
},
};
```
- **暗色主题**:支持暗色主题切换
```typescript
const darkTheme = {
colors: {
primary: '#1890ff',
background: {
primary: '#141414',
secondary: '#1f1f1f',
},
text: {
primary: '#ffffff',
secondary: '#a6a6a6',
},
},
};
```
## 动画和过渡规范
- **过渡效果**:为交互元素添加适当的过渡效果
```typescript
const AnimatedButton = styled.button`
transition: all 0.3s ease;
&:hover {
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
`;
```
- **加载动画**:使用 CSS 动画创建加载效果
```typescript
const LoadingSpinner = styled.div`
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
animation: spin 1s linear infinite;
`;
```
## 布局规范
- **网格系统**:使用 CSS Grid 或 Flexbox 创建网格布局
```typescript
const GridContainer = styled.div`
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 24px;
`;
```
- **间距系统**:使用统一的间距系统
```typescript
const spacing = {
xs: '4px',
sm: '8px',
md: '16px',
lg: '24px',
xl: '32px',
xxl: '48px',
};
```
## 字体和排版规范
- **字体系统**:定义完整的字体系统
```typescript
const typography = {
fontFamily: {
primary: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto',
mono: '"SFMono-Regular", Consolas, "Liberation Mono", Menlo',
},
fontSize: {
xs: '12px',
sm: '14px',
md: '16px',
lg: '18px',
xl: '20px',
xxl: '24px',
},
fontWeight: {
normal: 400,
medium: 500,
semibold: 600,
bold: 700,
},
};
```
- **行高和字间距**:设置合适的行高和字间距
```typescript
const TextComponent = styled.p`
line-height: 1.6;
letter-spacing: 0.02em;
`;
```
## 性能优化规范
- **CSS优化**:避免深层嵌套和复杂选择器
- **重绘重排**:避免频繁的样式变更导致的重绘重排
- **CSS-in-JS优化**:使用 `shouldForwardProp` 避免不必要的 DOM 属性
```typescript
const StyledDiv = styled.div.withConfig({
shouldForwardProp: (prop) => !['customProp'].includes(prop),
})<{ customProp: boolean }>`
color: ${({ customProp }) => customProp ? 'red' : 'blue'};
`;
```
## 可访问性规范
- **对比度**:确保文本和背景有足够的对比度
- **焦点状态**:为可交互元素提供清晰的焦点状态
```typescript
const AccessibleButton = styled.button`
&:focus {
outline: 2px solid ${({ theme }) => theme.colors.primary};
outline-offset: 2px;
}
`;
```
- **语义化**:使用语义化的 HTML 元素和 ARIA 属性
## 代码组织规范
- **文件结构**:样式文件与组件文件放在同一目录
- **样式分离**:将复杂的样式逻辑提取到单独的样式文件
- **主题文件**:将主题相关的配置集中管理
- **工具函数**:创建样式工具函数提高复用性
```typescript
const getSpacing = (size: keyof typeof spacing) => spacing[size];
const getColor = (color: string) => ({ theme }: { theme: any }) => theme.colors[color];
```

View File

@@ -0,0 +1,36 @@
---
description: golang 编码规则和最佳实践。
globs: **/*.go
alwaysApply: false
---
# Golang 规则
你是一位专业的AI编程助手专门使用Go标准库的net/http包和Go 1.22中新引入的ServeMux构建API。
始终使用最新稳定版本的Go1.22或更新版本并熟悉RESTful API设计原则、最佳实践和Go语言惯用法。
- 严格按照用户的要求一丝不苟地执行。
- 首先逐步思考 - 详细描述你的API结构、端点和数据流计划以伪代码的形式详细写出。
- 确认计划后,开始编写代码!
- 为API编写正确、最新、无bug、功能完整、安全且高效的Go代码。
- 使用标准库的net/http包进行API开发
- 利用Go 1.22中新引入的ServeMux进行路由
- 正确处理不同的HTTP方法GET、POST、PUT、DELETE等
- 使用适当签名的方法处理器例如func(w http.ResponseWriter, r *http.Request)
- 在路由中利用通配符匹配和正则表达式支持等新特性
- 实现适当的错误处理,包括在有益时使用自定义错误类型。
- 使用适当的状态码并正确格式化JSON响应。
- 为API端点实现输入验证。
- 在有利于API性能时利用Go的内置并发特性。
- 遵循RESTful API设计原则和最佳实践。
- 包含必要的导入、包声明和任何所需的设置代码。
- 使用标准库的log包或简单的自定义日志记录器实现适当的日志记录。
- 考虑为横切关注点实现中间件(例如,日志记录、身份验证)。
- 在适当时实现速率限制和认证/授权,使用标准库功能或简单的自定义实现。
- 在API实现中不留todos、占位符或缺失部分。
- 在解释时保持简洁但为复杂逻辑或Go特定惯用法提供简短注释。
- 如果对最佳实践或实现细节不确定,请说明而不是猜测。
- 使用Go的testing包提供测试API端点的建议。
在API设计和实现中始终优先考虑安全性、可扩展性和可维护性。利用Go标准库的强大和简洁创建高效且符合语言习惯的API。

View File

@@ -0,0 +1,188 @@
---
description: 该规则解释了 Java 的约定和最佳实践。
globs: **/*.java
alwaysApply: false
---
# Java 语言规范
## Java 21 特性使用
- **Record类**:用于不可变数据传输对象
```java
public record UserInfo(String name, String email, LocalDateTime createdAt) {}
```
- **Pattern Matching**在switch表达式中使用模式匹配
```java
public String formatValue(Object value) {
return switch (value) {
case String s -> "String: " + s;
case Integer i -> "Number: " + i;
case null -> "null value";
default -> "Unknown: " + value.toString();
};
}
```
- **Text Blocks**用于多行字符串特别是SQL和JSON
```java
String sql = """
SELECT u.name, u.email
FROM users u
WHERE u.status = 'ACTIVE'
ORDER BY u.created_at DESC
""";
```
- **Sealed Classes**:用于受限的类层次结构
```java
public sealed class Result<T> permits Success, Error {
// 基类定义
}
public final class Success<T> extends Result<T> {
private final T data;
// 实现
}
```
- **Virtual Threads**:用于高并发场景
```java
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> {
// 高并发任务
});
}
```
## 命名约定
- **类名**:使用帕斯卡命名法(如 `UserController`、`OrderService`
- **方法和变量名**:使用驼峰命名法(如 `findUserById`、`isOrderValid`
- **常量**:使用全大写下划线分隔(如 `MAX_RETRY_ATTEMPTS`、`DEFAULT_PAGE_SIZE`
- **包名**:使用小写,按功能模块划分(如 `com.example.user.domain`
## 代码风格
- **缩进**使用4个空格不使用Tab
- **行长度**每行不超过120个字符
- **大括号**使用Egyptian风格开括号不换行
- **空行**:方法间使用一个空行分隔,逻辑块间使用空行分隔
## 异常处理
- **检查异常**:谨慎使用检查异常,优先使用运行时异常
- **异常链**:保持异常链,不丢失原始异常信息
```java
try {
// 可能抛出异常的代码
} catch (SpecificException e) {
throw new BusinessException("业务处理失败", e);
}
```
- **资源管理**使用try-with-resources自动管理资源
```java
try (var reader = Files.newBufferedReader(path)) {
// 使用reader
}
```
## 集合和流处理
- **集合选择**:根据使用场景选择合适的集合类型
- `ArrayList`:随机访问频繁
- `LinkedList`:插入删除频繁
- `HashMap`:键值对存储
- `TreeMap`:需要排序的键值对
- **Stream API**充分利用Stream API进行函数式编程
```java
List<String> activeUserNames = users.stream()
.filter(user -> user.isActive())
.map(User::getName)
.sorted()
.toList();
```
## 并发编程
- **线程安全**:优先使用不可变对象和线程安全的集合
- **锁机制**合理使用synchronized、ReentrantLock等锁机制
- **并发集合**使用ConcurrentHashMap、CopyOnWriteArrayList等并发集合
- **CompletableFuture**使用CompletableFuture处理异步操作
```java
CompletableFuture<String> future = CompletableFuture
.supplyAsync(() -> fetchData())
.thenApply(data -> processData(data))
.exceptionally(throwable -> "默认值");
```
## 内存管理
- **对象创建**:避免在循环中创建不必要的对象
- **字符串处理**大量字符串操作使用StringBuilder
- **集合大小**:预估集合大小,避免频繁扩容
- **弱引用**适当使用WeakReference避免内存泄漏
## 泛型使用
- **类型安全**:充分利用泛型提供类型安全
- **通配符**:正确使用上界通配符(? extends和下界通配符? super
- **类型擦除**:理解泛型类型擦除的限制
```java
public <T extends Comparable<T>> T findMax(List<T> list) {
return list.stream().max(Comparable::compareTo).orElse(null);
}
```
## 注解使用
- **标准注解**:正确使用@Override、@Deprecated、@SuppressWarnings等
- **自定义注解**:合理创建自定义注解简化代码
- **注解处理**:了解编译时和运行时注解处理
## 测试规范
- **单元测试**使用JUnit 5编写单元测试
- **测试命名**:测试方法使用描述性命名(如 `shouldReturnUserWhenValidIdProvided`
- **断言**使用AssertJ提供更好的断言体验
```java
@Test
void shouldCalculateCorrectTotal() {
// Given
List<Item> items = List.of(
new Item("item1", 10.0),
new Item("item2", 20.0)
);
// When
double total = calculator.calculateTotal(items);
// Then
assertThat(total).isEqualTo(30.0);
}
```
## 性能优化
- **算法复杂度**:选择合适的算法和数据结构
- **缓存策略**:合理使用缓存减少重复计算
- **懒加载**:对于昂贵的操作使用懒加载
- **批量处理**:批量处理数据库操作和网络请求
## 代码质量
- **单一职责**:每个类和方法只负责一个功能
- **开闭原则**:对扩展开放,对修改关闭
- **依赖倒置**:依赖抽象而不是具体实现
- **接口隔离**:使用小而专一的接口
- **代码复用**:提取公共逻辑,避免重复代码
## 文档和注释
- **JavaDoc**为公共API编写完整的JavaDoc
- **代码注释**:为复杂逻辑添加解释性注释
- **TODO标记**使用TODO标记待完成的工作
```java
/**
* 计算用户积分
*
* @param userId 用户ID
* @param actions 用户行为列表
* @return 计算得出的积分值
* @throws UserNotFoundException 当用户不存在时抛出
*/
public int calculatePoints(Long userId, List<UserAction> actions) {
// TODO: 实现积分计算逻辑
return 0;
}
```

View File

@@ -0,0 +1,120 @@
---
description: Kotlin 开发约定和最佳实践
globs: **/*.kt
alwaysApply: false
---
## Kotlin 开发规范
### 基本原则
- 优先使用类型推断,必要时显式声明类型提高可读性
- 避免使用 `Any`,创建具体的类型定义
- 优先使用 `val` 而非 `var`,保持不可变性
- 使用 Kotlin 的空安全特性,避免显式 null 检查
- 避免魔法数字,定义有意义的常量
### 命名规范
- **类和接口**PascalCase (`UserRepository`, `PaymentService`)
- **函数和变量**camelCase (`getUserById`, `isValid`)
- **常量和枚举值**UPPER_SNAKE_CASE (`MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT`)
- **包名**:全小写,使用点分隔 (`com.example.userservice`)
- **文件名**PascalCase与主要类名一致
- **布尔变量**:使用 `is`、`has`、`can`、`should` 前缀 (`isLoading`, `hasPermission`, `canDelete`)
- 使用完整单词而非缩写,确保拼写正确
- 标准缩写除外API、URL、HTTP、JSON 等
- 常见缩写id、ctx、req、res
### 函数设计
- 编写简短且单一目的的函数(建议 ≤20 行)
- 使用表达式函数简化单行返回:`fun square(x: Int) = x * x`
- 函数名以动词开头,体现其行为
- 优先使用高阶函数和扩展函数
- 使用命名参数提高可读性:`createUser(name = "John", age = 25)`
- 合理使用默认参数值,减少函数重载
- 通过早期返回和提取工具函数避免深层嵌套
- 使用单一抽象级别原则
### 类和数据结构
- **数据类**:用于纯数据承载,自动生成 `equals`、`hashCode`、`toString`
- **密封类**:用于有限状态表示,替代枚举的复杂场景
- **密封接口**Kotlin 1.5+ 用于更灵活的类型层次
- **对象类**:用于单例模式和工具类
- **内联类**:用于类型安全的原始类型包装
- 优先使用组合而非继承
- 遵循 SOLID 原则
- 保持类的职责单一,避免过大的类(建议 ≤200 行≤10 个公共方法)
- 不要滥用原始类型,将相关数据封装在复合类型中
### 空安全和错误处理
- 使用 `?.` 安全调用操作符
- 使用 `?:` Elvis 操作符提供默认值
- 使用 `!!` 操作符需要有充分理由并添加注释
- 优先使用 `Result` 类型处理可能失败的操作
- 对于异常情况使用具体的异常类型而非通用异常
- 避免在函数中进行数据验证,使用具有内部验证的类型
### 协程和异步编程
- 使用 `suspend` 函数处理异步操作
- 在合适的作用域中启动协程 (`viewModelScope`, `lifecycleScope`, `runBlocking`)
- 使用 `Flow` 处理数据流,`StateFlow`/`SharedFlow` 处理状态
- 避免 `GlobalScope`,始终使用结构化并发
- 合理使用协程上下文和调度器
- 使用 `async`/`await` 进行并发操作
- 正确处理协程取消和异常
### 集合和函数式编程
- 优先使用不可变集合 (`listOf`, `setOf`, `mapOf`)
- 使用函数式操作:`map`、`filter`、`reduce`、`fold`
- 合理使用序列 (`Sequence`) 处理大数据集或链式操作
- 使用作用域函数:`let`、`run`、`with`、`apply`、`also`
- 使用 `takeIf`、`takeUnless` 进行条件处理
- 对简单 lambda 使用 `it` 参数,复杂情况使用命名参数
### 泛型和类型系统
- 合理使用泛型约束和变型(`in`、`out`
- 使用 `reified` 参数访问泛型类型信息
- 利用类型别名提高代码可读性:`typealias UserId = String`
- 使用内联函数优化高阶函数性能
### 可见性和封装
- 使用最小必要的可见性修饰符
- 优先使用 `internal` 而非 `public` 用于模块内部 API
- 使用 `private` 限制类内部实现细节
- 合理使用 `protected` 用于继承场景
### 测试规范
- 测试方法使用描述性命名:`should_return_user_when_valid_id_provided`
- 遵循 Arrange-Act-Assert 模式
- 清楚命名测试变量:`given...`、`when...`、`then...` 或 `input...`、`expected...`、`actual...`
- 为每个公共函数编写单元测试
- 使用测试替身Mock、Stub模拟依赖
- 为每个模块编写集成测试
- 遵循 Given-When-Then 约定编写行为测试
### 代码组织和架构
- 按功能而非类型组织包结构
- 将相关的类放在同一文件中(如密封类的子类)
- 合理使用扩展函数增强现有类型
- 声明接口定义契约,面向接口编程
- 使用依赖注入提高代码可测试性
- 遵循领域驱动设计原则
### 性能和资源管理
- 使用 `inline` 关键字优化高阶函数
- 合理使用 `lazy` 延迟初始化
- 注意避免内存泄漏,特别是在协程和回调中
- 使用 `use` 函数自动管理资源

View File

@@ -0,0 +1,20 @@
---
description: 该规则解释了 Python 编码、最佳实践、 整洁高效的代码模式.
globs: **/*.py
alwaysApply: false
---
# Python 规则
- 遵循 PEP 8 风格指南和命名约定
- 使用类型注解增强代码可读性和类型安全性
- 使用虚拟环境管理依赖:
- 优先使用 `venv` 或 `poetry` 进行环境隔离
- 使用 `requirements.txt` 或 `pyproject.toml` 记录依赖
- 使用上下文管理器处理资源(如文件操作)
- 优先使用列表推导式、生成器表达式和字典推导式
- 使用 `pytest` 进行测试,保持高测试覆盖率
- 使用文档字符串docstrings记录函数、类和模块
- 遵循面向对象设计原则SOLID
- 使用异常处理保证程序健壮性
- 使用 `dataclasses` 或 `pydantic` 模型表示数据

View File

@@ -0,0 +1,57 @@
---
description: TypeScript 编码规则和最佳实践
globs: **/*.ts, **/*.tsx, **/*.d.ts
---
# TypeScript 规则
## 类型系统
- 对于对象定义,优先使用接口而非类型
- 对于联合类型、交叉类型和映射类型,使用 type
- 避免使用 `any`,对于未知类型优先使用 `unknown`
- 使用严格的 TypeScript 配置
- 充分利用 TypeScript 的内置工具类型
- 使用泛型实现可复用的类型模式
## 命名约定
- 类型名称和接口使用 PascalCase
- 变量和函数使用 camelCase
- 常量使用 UPPER_CASE
- 使用带有辅助动词的描述性名称例如isLoading, hasError
- React props 的接口前缀使用 'Props'例如ButtonProps
## 代码组织
- 类型定义应靠近使用它们的地方
- 共享的类型和接口从专用类型文件导出
- 使用桶导出index.ts组织导出
- 将共享类型放在 `types` 目录中
- 组件 props 与其组件共同放置
## 函数
- 为公共函数使用显式返回类型
- 回调和方法使用箭头函数
- 实现带有自定义错误类型的适当错误处理
- 复杂类型场景使用函数重载
- 优先使用 async/await 而非 Promises
## 最佳实践
- 在 tsconfig.json 中启用严格模式
- 不可变属性使用 readonly
- 利用可辨识联合类型提高类型安全性
- 使用类型守卫进行运行时类型检查
- 实现适当的空值检查
- 避免不必要的类型断言
## 错误处理
- 为领域特定错误创建自定义错误类型
- 对可能失败的操作使用 Result 类型
- 实现适当的错误边界
- 使用带有类型化 catch 子句的 try-catch 块
- 正确处理 Promise 拒绝
## 模式
- 复杂对象创建使用构建者模式
- 数据访问实现仓储模式
- 对象创建使用工厂模式
- 利用依赖注入
- 使用模块模式实现封装

View File

@@ -0,0 +1,61 @@
---
description: 微信小程序 WXML 编写规范
globs: **/*.wxml
alwaysApply: false
---
# WXML 编写规范
## 基本语法规范
- 使用小写标签名和属性名
- 属性值必须用双引号包围
- 自闭合标签使用 `<tag />` 格式
- 保持标签的正确嵌套和闭合
- 合理使用缩进,保持代码层次清晰
## 数据绑定
- 使用 `{{}}` 进行数据绑定,表达式内避免复杂逻辑
- 布尔属性使用 `attr="{{condition}}"` 格式
- 事件绑定使用 `bind:` 或 `catch:` 前缀
- 避免在模板中进行复杂的数据处理,应在 JS 中预处理
## 条件渲染
- 简单条件使用 `wx:if`,复杂条件在 JS 中处理后绑定布尔值
- `wx:if` 与 `hidden` 的选择:频繁切换用 `hidden`,条件较少变化用 `wx:if`
- 多条件分支使用 `wx:if`、`wx:elif`、`wx:else`
- 避免过深的条件嵌套,考虑拆分为子组件
## 列表渲染
- 必须设置 `wx:key`,优先使用唯一标识符
- `wx:for-item` 和 `wx:for-index` 使用有意义的名称
- 避免在循环中嵌套复杂逻辑,考虑使用子组件
- 长列表考虑使用虚拟列表或分页加载
## 组件使用
- 组件标签名使用 kebab-case 格式
- 属性传递使用描述性名称
- 事件监听使用 `bind:` 前缀,事件名使用 kebab-case
- 合理使用 slot 进行内容分发
## 样式类名
- 类名使用 kebab-case 格式
- 避免使用内联样式,统一在 WXSS 中定义
- 使用 TDesign 提供的工具类和组件类名
- 自定义类名应具有语义化
## 性能优化
- 减少不必要的节点嵌套
- 合理使用 `wx:if` 和 `hidden` 控制渲染
- 避免在模板中使用复杂表达式
- 图片懒加载使用 `lazy-load` 属性
## 无障碍访问
- 为交互元素添加 `aria-label` 属性
- 使用语义化标签,如 `button`、`navigator` 等
- 确保键盘导航的可用性
- 为图片添加 `alt` 属性描述
## 代码组织
- 模板结构应与页面/组件的逻辑结构保持一致
- 相关的元素应当组织在一起
- 使用注释标记复杂的模板区块
- 保持模板的简洁性,复杂逻辑拆分为子组件

View File

@@ -0,0 +1,79 @@
---
description: 微信小程序 WXSS 编写规范
globs: **/*.wxss
alwaysApply: false
---
# WXSS 编写规范
## 基本语法规范
- 使用 2 个空格进行缩进
- 选择器和属性名使用小写字母
- 属性值后必须加分号
- 颜色值使用小写字母,优先使用简写形式
- 0 值不需要单位,如 `margin: 0` 而非 `margin: 0px`
## 选择器规范
- 类名使用 kebab-case 格式,如 `.user-info`
- 避免使用 ID 选择器,优先使用类选择器
- 避免过深的选择器嵌套(不超过 3 层)
- 使用有意义的类名,体现元素的功能而非样式
## 布局规范
- 优先使用 Flexbox 进行布局
- 使用 `rpx` 单位进行响应式设计
- 合理使用 `box-sizing: border-box`
- 避免使用绝对定位,除非必要
## 尺寸单位
- 字体大小使用 `rpx`,参考设计稿 750px 宽度
- 边距和内边距使用 `rpx`
- 边框宽度使用 `px`(通常为 1px
- 百分比用于相对布局
## 颜色和主题
- 使用 TDesign 提供的 CSS 变量
- 自定义颜色应定义为 CSS 变量
- 避免硬编码颜色值
- 支持深色模式时使用主题变量
## 字体规范
- 使用系统默认字体栈
- 字体大小遵循设计规范常用尺寸24rpx、28rpx、32rpx、36rpx
- 行高设置为字体大小的 1.4-1.6 倍
- 合理使用字重,避免过度使用粗体
## 组件样式
- 组件样式应当封装完整,避免依赖外部样式
- 使用 `externalClasses` 允许外部定制样式
- 避免样式污染,使用适当的选择器作用域
- 组件内部样式使用相对单位
## 动画和过渡
- 使用 CSS 过渡而非 JavaScript 动画
- 动画时长控制在 200-300ms
- 使用 `ease-out` 缓动函数
- 避免同时动画过多属性
## 响应式设计
- 使用 `rpx` 实现基本的响应式
- 考虑不同屏幕尺寸的适配
- 使用媒体查询处理特殊情况
- 测试在不同设备上的显示效果
## 性能优化
- 避免使用复杂的选择器
- 减少重绘和重排的样式属性
- 合理使用 `transform` 和 `opacity` 进行动画
- 避免使用 `!important`
## 代码组织
- 样式按功能模块组织
- 使用注释分隔不同的样式区块
- 公共样式提取到全局样式文件
- 保持样式文件的简洁和可读性
## TDesign 集成
- 优先使用 TDesign 提供的样式类
- 通过 CSS 变量定制主题
- 遵循 TDesign 的设计规范
- 避免覆盖组件库的核心样式