소스 정보
- 저장소
- bage2014/study
- 최근 소스 활동
- 2026년 6월 24일 23:18
- 감지된 SKILL.md 언어
- 중국어
- 스타
- 646
- 포크
- 113
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
SKILL.md 표시 중
SKILL.md
소스 지침 · 읽기 전용 미리보기- name
- personal-backend-coding-standard
- description
- 后端编码规范技能,提供后端开发的编码标准和最佳实践指导
- trigger
- 编写后端代码时需要遵循编码规范
- disable-when
- 团队已有明确的编码规范
- category
- personal
- tags
- ["coding","standard","backend","java"]
# 后端编码规范技能
## 功能描述
提供后端开发的编码标准和最佳实践指导,帮助开发者编写高质量、可维护的后端代码。
## 何时使用
在以下情况调用此技能:
- 需要编写后端代码时
- 需要审查后端代码质量时
- 需要学习后端编码规范时
- 需要培训团队成员时
## 核心功能
- **命名规范**:提供变量、方法、类的命名标准
- **代码结构**:指导代码组织和文件结构
- **错误处理**:规范异常处理和错误返回
- **数据库操作**:提供数据库访问的最佳实践
- **API设计**:指导 RESTful API 的设计规范
- **安全规范**:提供安全编码的最佳实践
## 输入参数
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| language | String | 否 | 目标语言(Java/Python/Go等),默认Java |
| framework | String | 否 | 使用的框架(Spring Boot/Django/Gin等) |
| focusArea | String | 否 | 关注领域(naming/structure/error/db/api/security) |
## 输出格式
```json
{
"status": "SUCCESS",
"language": "Java",
"framework": "Spring Boot",
"focusArea": "naming",
"rules": [
{
"category": "命名规范",
"rules": [
{
"rule": "类名使用 PascalCase",
"example": "class UserService",
"description": "类名应采用大驼峰命名法"
}
]
}
],
"bestPractices": ["最佳实践1", "最佳实践2"]
}
```
## 项目技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| JDK | 21 | 项目默认使用 JDK 21 |
| Spring Boot | 3.x | 项目默认使用 Spring Boot 3.x |
| 日志框架 | SLF4J + Logback | 使用 Lombok @Slf4j 注解 |
## 项目模块结构
```
xx-parent/
├── xx-gateway/ # 网关模块 - 处理请求路由和认证
├── xx-biz/ # 业务模块 - 核心业务逻辑
└── xx-infra/ # 基础设施模块 - 公共组件、工具类
```
## 编码规范分类
### 1. 命名规范
| 元素类型 | 规范 | 示例 |
|----------|------|------|
| 类名 | PascalCase | `UserService`, `OrderRepository` |
| 方法名 | camelCase | `createUser()`, `getOrderById()` |
| 变量名 | camelCase | `userName`, `orderId` |
| 常量名 | UPPER_SNAKE_CASE | `MAX_RETRY_COUNT`, `DEFAULT_TIMEOUT` |
| 包名 | lowercase | `com.bage.xx.service`, `com.bage.xx.repository` |
| 接口名 | PascalCase + 以 Interface 结尾或直接命名 | `UserRepository`, `UserService` |
| 模块名 | kebab-case | `xx-gateway`, `xx-biz`, `xx-infra` |
### 2. 代码结构
```
src/main/java/com/bage/xx/
├── controller/ # REST API 控制层
│ └── UserController.java
├── service/ # 业务逻辑层
│ ├── UserService.java
│ └── impl/
│ └── UserServiceImpl.java
├── repository/ # 数据访问层
│ └── UserRepository.java
├── entity/ # 数据库实体
│ └── User.java
├── dto/ # 数据传输对象
│ ├── request/
│ │ └── UserCreateRequest.java
│ └── response/
│ └── UserResponse.java
├── config/ # 配置类
│ └── WebConfig.java
├── exception/ # 自定义异常
│ ├── BusinessException.java
│ └── GlobalExceptionHandler.java
├── util/ # 工具类
│ └── StringUtils.java
└── Application.java # 启动类
```
### 3. 方法设计
| 原则 | 说明 |
|------|------|
| 单一职责 | 每个方法只做一件事 |
| 方法长度 | 尽量控制在 50 行以内 |
| 参数数量 | 尽量控制在 3-5 个以内 |
| 返回值 | 避免返回 null,使用 Optional |
| 异常处理 | 使用 try-with-resources |
### 4. 日志规范
**统一使用 Lombok @Slf4j 注解**
```java
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
public class UserServiceImpl implements UserService {
@Override
public UserResponse createUser(UserCreateRequest request) {
log.info("开始创建用户,邮箱: {}", request.getEmail());
try {
// 业务逻辑
log.debug("用户创建成功,ID: {}", userId);
return response;
} catch (Exception e) {
log.error("创建用户失败,邮箱: {}", request.getEmail(), e);
throw e;
}
}
}
```
### 5. 错误处理
```java
// 自定义异常
public class BusinessException extends RuntimeException {
private final String errorCode;
public BusinessException(String errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
}
// 全局异常处理
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BusinessException.class)
public ResponseEntity<ErrorResponse> handleBusinessException(BusinessException e) {
return ResponseEntity.badRequest()
.body(new ErrorResponse(e.getErrorCode(), e.getMessage()));
}
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(Exception e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(new ErrorResponse("INTERNAL_ERROR", "系统内部错误"));
}
}
```
### 6. 数据库操作
| 原则 | 说明 |
|------|------|
| 使用 ORM | 使用 Spring Data JPA 或 MyBatis |
| 事务管理 | 使用 `@Transactional` 注解 |
| 查询优化 | 使用索引,避免 N+1 查询 |
| 批量操作 | 使用批量插入/更新 |
| SQL 注入 | 使用参数化查询 |
### 7. API 设计
**HTTP 方法限制**:Controller 只暴露 GET 和 POST 请求,不使用 PUT、PATCH、DELETE 等其他方法
| 原则 | 说明 |
|------|------|
| RESTful | 遵循 REST 原则 |
| 路径命名 | 使用小写连字符 |
| HTTP 方法 | **仅使用 GET 和 POST** |
| 状态码 | 使用标准 HTTP 状态码 |
| 响应格式 | 统一响应结构 |
**Controller 示例**:
```java
@RestController
@RequestMapping("/api/users")
public class UserController {
@Autowired
private UserService userService;
// 查询 - 使用 GET
@GetMapping("/{id}")
public ResponseEntity<UserResponse> getUserById(@PathVariable String id) {
return ResponseEntity.ok(userService.getUserById(id));
}
// 列表查询 - 使用 GET
@GetMapping
public ResponseEntity<List<UserResponse>> listUsers() {
return ResponseEntity.ok(userService.listUsers());
}
// 创建 - 使用 POST
@PostMapping
public ResponseEntity<UserResponse> createUser(@RequestBody UserCreateRequest request) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(userService.createUser(request));
}
// 更新 - 使用 POST(不使用 PUT/PATCH)
@PostMapping("/{id}/update")
public ResponseEntity<UserResponse> updateUser(
@PathVariable String id,
@RequestBody UserUpdateRequest request) {
return ResponseEntity.ok(userService.updateUser(id, request));
}
// 删除 - 使用 POST(不使用 DELETE)
@PostMapping("/{id}/delete")
public ResponseEntity<Void> deleteUser(@PathVariable String id) {
userService.deleteUser(id);
return ResponseEntity.noContent().build();
}
}
```
### 8. 安全规范
| 原则 | 说明 |
|------|------|
| 输入验证 | 使用 `@Valid` 和 `@Validated` |
| 认证授权 | 使用 Spring Security |
| 密码加密 | 使用 BCrypt 或 Argon2 |
| SQL 注入 | 使用参数化查询 |
| XSS 防护 | 对输出进行转义 |
| CSRF 防护 | 启用 CSRF 保护 |
## 最佳实践指南
### Java 后端开发最佳实践
1. **使用 Lombok**:简化样板代码,使用 @Slf4j、@Data、@Builder 等注解
2. **使用 DTO**:分离实体和传输对象
3. **使用 Optional**:避免空指针异常
4. **使用 Stream API**:简化集合操作
5. **使用断言**:验证方法参数
6. **编写单元测试**:保证代码质量
7. **使用日志框架**:使用 @Slf4j 注解(SLF4J + Logback)
8. **配置外部化**:使用配置文件或环境变量
### Spring Boot 最佳实践
```java
@Slf4j
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
public UserServiceImpl(UserRepository userRepository) {
this.userRepository = userRepository;
}
@Override
@Transactional
public UserResponse createUser(UserCreateRequest request) {
log.info("创建用户请求: {}", request.getEmail());
validateRequest(request);
User user = User.builder()
.email(request.getEmail())
.name(request.getName())
.build();
User savedUser = userRepository.save(user);
log.debug("用户创建成功,ID: {}", savedUser.getId());
return UserResponse.fromEntity(savedUser);
}
private void validateRequest(UserCreateRequest request) {
if (request.getEmail() == null || request.getEmail().isEmpty()) {
throw new BusinessException("INVALID_PARAM", "邮箱不能为空");
}
}
}
```
## 代码审查检查清单
| 检查项 | 说明 | 状态 |
|--------|------|------|
| 命名规范 | 变量、方法、类命名是否符合规范 | ✅/❌ |
| 代码格式 | 缩进、空格、换行是否符合规范 | ✅/❌ |
| 注释完整 | 是否有必要的注释说明 | ✅/❌ |
| 异常处理 | 是否正确处理异常情况 | ✅/❌ |
| 代码复用 | 是否避免重复代码 | ✅/❌ |
| 性能优化 | 是否考虑性能问题 | ✅/❌ |
| 安全性 | 是否存在安全隐患 | ✅/❌ |
| 可测试性 | 代码是否易于测试 | ✅/❌ |
| 日志使用 | 是否正确使用 @Slf4j 注解 | ✅/❌ |
| HTTP 方法 | 是否仅使用 GET 和 POST | ✅/❌ |
## 核心组件
| 组件 | 职责 | 描述 |
|------|------|------|
| CodeStyleChecker | 代码风格检查器 | 检查代码是否符合命名规范 |
| CodeStructureAnalyzer | 代码结构分析器 | 分析代码组织和文件结构 |
| SecurityScanner | 安全扫描器 | 检测安全隐患 |
| BestPracticeRecommender | 最佳实践推荐器 | 提供最佳实践建议 |
## 配置要求
### 环境变量
| 变量名 | 说明 | 默认值 |
|--------|------|--------|
| JAVA_HOME | JDK 21 路径 | - |
### Maven 依赖
```xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0</version>
</parent>
<properties>
<java.version>21</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
```
## 扩展指南
### 添加新的编码规则
1. 在规则引擎中添加新规则
2. 定义规则的检查逻辑
3. 更新代码审查检查清单
### 添加新语言支持
1. 创建对应语言的规则定义
2. 添加语言特定的最佳实践
3. 更新技能文档
## 触发条件
GitHub에서 보기