5.8 KiB
5.8 KiB
AGENTS.md - XGT Project Development Guide
Project Overview
- Project Name: XGT (效果图业务系统)
- Framework: RuoYi-Vue-Plus (Spring Boot 3.3.5 + MyBatis-Plus)
- Java Version: 22
- Build Tool: Maven
Build Commands
Environment Setup
# Set Java 22 and Maven
export JAVA_HOME=/usr/local/opt/amazon-corretto-22.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:/usr/local/Cellar/maven/3.9.12/bin:$PATH
Build & Run
# Compile project
mvn clean compile -DskipTests
# Install to local repository
mvn clean install -DskipTests
# Run application (dev profile)
cd ruoyi-admin
mvn spring-boot:run -Dspring-boot.run.profiles=dev
# Run with hot reload (DevTools)
mvn spring-boot:run -Dspring-boot.run.profiles=dev
# Press Ctrl+F10 to reload changed classes
Test Commands
# Run all tests
mvn test
# Run single test class
mvn test -Dtest=DemoUnitTest
# Run single test method
mvn test -Dtest=DemoUnitTest#testTest
# Run tests with specific tag (based on profile)
mvn test -Dgroups=dev
# Skip tests
mvn clean install -DskipTests
Code Style Guidelines
EditorConfig
The project uses .editorconfig for consistent formatting:
- Indentation: 4 spaces for Java, 2 spaces for YAML/JSON
- Charset: UTF-8
- Line endings: LF
- Trailing whitespace: Trimmed
Java Conventions
Package & Import Organization
// 1. Package declaration
package org.dromara.web.controller;
// 2. Third-party imports (alphabetical)
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
// 3. Spring imports
import org.springframework.web.bind.annotation.*;
// 4. Project common imports
import org.dromara.common.core.domain.R;
import org.dromara.common.satoken.utils.LoginHelper;
// 5. Module imports
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.work.domain.TpOrder;
// 6. Java standard library
import java.util.List;
import java.util.Map;
Naming Conventions
| Element | Convention | Example |
|---|---|---|
| Packages | lowercase | org.dromara.work.service |
| Classes | PascalCase | IndexController, TpOrderService |
| Methods | camelCase | queryPageList(), selectById() |
| Variables | camelCase | loginUser, pageQuery |
| Constants | UPPER_SNAKE_CASE | MAX_RETRY_COUNT, DEFAULT_PAGE_SIZE |
| BO/VO/DAO | PascalCase + suffix | SysUserBo, TpOrderVo |
Class Structure
/**
* Class description
*
* @author AuthorName
*/
@RequiredArgsConstructor
@RestController
@RequestMapping("/api/path")
public class ExampleController {
// 1. Static constants (if any)
private static final String PREFIX = "prefix:";
// 2. Dependencies (private final)
private final UserService userService;
private final OrderService orderService;
// 3. Public methods (API endpoints)
@GetMapping("/list")
public R<TableDataInfo<Vo>> list(Bo bo, PageQuery query) {
return R.ok(service.queryPageList(bo, query));
}
// 4. Private methods
private void validateParams(Bo bo) {
// validation logic
}
}
Error Handling
// Use R.fail() for business errors
return R.fail("Error message");
// Use try-catch for external calls
try {
result = externalService.call();
} catch (Exception e) {
log.error("Failed to call external service", e);
return R.fail("Service unavailable");
}
// Use ServiceException for framework errors
throw new ServiceException("Validation failed");
Logging
// Use Lombok's @Slf4j
@Slf4j
public class ExampleService {
// Appropriate log levels
log.debug("Debug info: {}", data);
log.info("Operation completed: {}", result);
log.warn("Potential issue: {}", warning);
log.error("Error occurred", exception);
}
Database (MyBatis-Plus)
// Query examples
LambdaQueryWrapper<TpOrder> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TpOrder::getStatus, 1)
.like(TpOrder::getName, keyword)
.orderByDesc(TpOrder::getCreateTime);
// Use service methods
return R.ok(service.queryPageList(bo, pageQuery));
// Pagination
PageQuery pageQuery = new PageQuery();
pageQuery.setPageNum(1);
pageQuery.setPageSize(10);
Security Guidelines
Sensitive Data
- NEVER hardcode credentials in source code
- Use environment variables or config center for secrets
- Never log passwords or sensitive information
API Security
- Use
@SaCheckPermissionfor permission control - Use
@SaIgnorefor public endpoints - Validate all input parameters
- Use
@RepeatSubmitfor idempotent requests
Common Patterns
REST Controller
@GetMapping("/list")
public R<TableDataInfo<Vo>> list(Bo bo, PageQuery pageQuery) {
return R.ok(service.queryPageList(bo, pageQuery));
}
@PostMapping
public R<Boolean> add(@Validated @RequestBody Bo bo) {
return R.ok(service.insertByBo(bo));
}
@PutMapping
public R<Boolean> edit(@Validated @RequestBody Bo bo) {
return R.ok(service.updateByBo(bo));
}
@DeleteMapping("/{id}")
public R<Boolean> remove(@PathVariable Long id) {
return R.ok(service.deleteWithValidByIds(List.of(id)));
}
Service Layer
public interface IExampleService {
TableDataInfo<Vo> queryPageList(Bo bo, PageQuery pageQuery);
Vo queryById(Long id);
Boolean insertByBo(Bo bo);
Boolean updateByBo(Bo bo);
Boolean deleteWithValidByIds(Collection<Long> ids);
}
Common Issues
Database Connection
If encountering connection issues:
- Check firewall settings
- Verify database credentials
- Ensure MySQL connector version compatibility (8.4.0 recommended)
Hot Reload
For DevTools hot reload in IDEA:
- Enable
Build project automatically - Add VM option:
-agentlib:jdbprefindock=on,server=y,suspend=n - Press
Ctrl+F10to reload changes