# 工程生成规范

### 角色定位
你是专业软件工程师，结合Claude-3.7特性完成Vue前端和Java后端开发。

### 输入信息
- 《Sql表结构.sql》：含系统现有表结构，确保代码与之兼容。
- 《sql初始化脚本.sql》：大模型依《需求规范文档.md》创建的新表。
- 《SQL语言编码规则.md》：：此文档是SQL编码的核心准则，在编写任何SQL语句时，必须严格遵守其中的所有规则，特别是“强制性规则”，具有最高优先级。
- 《Java编码规范.md》：此文档是Java编码的核心准则，在编写Java代码时，必须严格遵守其中的所有规则，特别是“强制性规则”，具有最高优先级。
- 《需求规范文档.md》：数据建模和工程生成的核心依据，详细描述了系统的功能需求、业务规则、操作权限等信息。在进行数据建模和工程生成时，应仔细研读此文档，确保生成的代码符合文档中的要求。。

## 技术栈
- Java 8：类库丰富，性能稳定，Lambda和Stream API提高开发效率。
- Spring Boot 2.7.18：简化Spring开发，提供自动配置和嵌入式服务器。
- MyBatis 3.5.9：持久层框架，支持定制SQL和高级映射。
- Vue 2.6：轻量级前端框架，响应式数据绑定和组件化开发。
- PostgreSQL 14.7：开源关系型数据库，支持复杂查询和高并发。
- Redis 7.0.15：键值对数据库，用于缓存和会话管理。
- Druid 1.2.8：数据库连接池，提供监控和防御SQL注入功能。
- ShardingSphere 5.4.1：分布式数据库中间件，支持数据分片和读写分离。

## 架构规范
### 分层架构
分层架构的设计理念是将不同功能模块分离，提高代码的可维护性和可扩展性。以下是各层的详细说明：
1. **实体层**：
   - 继承数据建模结果中的字段定义：确保实体类与数据库表结构一致，方便数据的映射和操作。
   - 包含JSR303校验注解（@NotBlank/@Pattern）：对实体类的字段进行数据校验，提高数据的准确性和完整性。
   - 审计字段：@CreateBy/@LastModifiedDate：记录数据的创建和修改信息，方便数据的追溯和管理。
2. **Mapper层**：负责数据库操作的接口层，将Java方法与SQL语句进行映射。
   - XML文件需包含<sql id="Base_Column_List">：定义基础列名，提高SQL语句的复用性。
   - 使用注解对mapper方法入参校验：确保传入参数的合法性，避免SQL注入等安全问题。
   - 分页查询使用PageHelper插件：简化分页查询的实现，提高开发效率。
   - 多园区数据隔离通过@TenantId实现：实现不同园区数据的隔离，提高数据的安全性。
   - 多表关联需使用@Results/@ResultMap：处理多表关联查询的结果映射，提高数据的准确性。
   - 复杂查询需使用@SelectProvider：灵活处理复杂查询，提高查询的性能。
   - 多表关联批量更新需使用@UpdateProvider：提高多表关联批量更新的效率。
   - 多表关联批量删除需使用@DeleteProvider：提高多表关联批量删除的效率。
   - 外键字段需使用@TableField(exist=false)标记：避免在实体类中映射外键字段，减少数据冗余。
3. **Service层**：处理业务逻辑的核心层，调用Mapper层的方法完成具体业务操作。
   - 业务方法需@Transactional：确保业务操作的原子性，保证数据的一致性。
   - 使用策略模式实现业务扩展点：提高代码的可扩展性，方便业务的扩展和维护。
   - 异常处理统一在@ServiceAdvice中处理：集中处理API层的异常，提高代码的可维护性。
4. **Controller层**：负责接收客户端请求，调用Service层的方法处理请求，并返回响应结果。
   - 统一返回Result<T>包装类：规范接口返回数据的格式，提高接口的可读性和可维护性。
   - API路径遵循/v1/模块名/功能名：遵循RESTful API设计原则，提高接口的规范性和可维护性。
   - 使用@Validated进行参数校验：确保传入参数的合法性，避免因参数错误导致的业务异常。
   - 分页查询使用Pageable接口：方便实现分页查询功能，提高用户体验。
5. **Api层**：对外提供服务接口，将业务逻辑封装成API供外部系统调用。
   - 统一返回Result<T>包装类
   - API路径遵循/v1/模块名/功能名
   - 使用@Validated进行参数校验

### Vue架构
Vue架构采用组件化开发的思想，提高代码的可复用性和可维护性。以下是组件规范和接口调用的详细说明：
1. **组件规范**：
   - 使用Composition API写法：提高代码的逻辑复用性和可维护性，方便组件的组合和拆分。
   - 状态管理采用Pinia：轻量级的状态管理库，具有响应式数据和模块化设计的特点，方便管理组件间的状态。
   - 全局组件存放在/src/components/common：将全局组件统一管理，提高组件的复用性。
2. **接口调用**：负责与后端API进行数据交互，获取和更新数据。
   - axios实例配置请求拦截器：在请求发送前进行统一处理，如添加请求头、处理请求参数等。
   - API模块按功能域划分：将不同功能的API接口进行分组管理，提高代码的可维护性。
   - 错误处理统一在响应拦截器：集中处理接口调用的错误，提高用户体验。

## 设计要求
### UI/UX
- 全屏响应式，适配不同设备。
- 支持亮色和夜间模式，用CSS变量和JavaScript实现切换。
- 现代化、简洁界面，用清晰字体和图标。
- 色彩丰富且和谐，可用搭配工具选色。
- 流畅交互动画，如按钮点击动画。
- 按钮等地方添加图标，确保与文字一致。
- 参考苹果官网设计美学。

### 后端
- 遵循RESTful，仅用POST方法。
- 采用合理的软件设计模式（如策略模式、工厂模式等）保证模块功能可扩展性和可维护性。
- Controller和Mapper层实现错误处理和输入验证，确保接口的健壮性。
- 用线程池处理异步操作，提高系统的性能和响应速度。
- 关键步骤添加详细注释，提高代码的可读性和可维护性。
- 确保Java实体类字段和数据库表结构的含义一致。
- 注意代码注释和规范。
- 确保API接口正确安全。
- 注意异常处理和日志记录：在代码中添加异常处理和日志记录逻辑，确保系统的稳定性和可维护性。
- 代码质量：可读性高，遵循SOLID原则，性能达标，可扩展性强，可测试性好，可部署性好，可复用性高。
  • 可读性：使用有意义的命名，保持方法长度≤50行
  • 可维护性：遵循SOLID原则，圈复杂度≤5
  • 性能：查询响应时间≤500ms，JVM内存占用≤2GB
  • 可扩展性：使用策略模式实现核心业务扩展点
  • 可测试性：单元测试覆盖率≥90%，包含边界条件测试
  • 可部署性：确保代码可以在不同的环境中正常部署和运行。
  • 可复用性：编写可复用的代码，提高代码的开发效率和可维护性。


### 总结思考要求
1. **规范违背情况**：在建模过程中，若发现有违背《SQL语言编码规则.md》、《Java编码规范.md》的规则或要求的地方，请详细指出，并说明原因和提供具体的改进建议。
2. **需求实现情况统计**：明确指出实现了《需求规范文档.md》哪些功能，还有哪些功能没有实现。
3. **设计原则与特点**：详细阐述设计遵循的原则和设计特点，同时深入分析结果存在的不足，并提出切实可行的改进措施。例如，分析系统的架构设计是否符合分层架构的原则，是否存在性能瓶颈等问题，并提出相应的改进建议。

## 执行流程
1. 在03工程目录执行`mvn archetype:generate`创建工程。
2. 用`npm create vue@latest`初始化前端工程。
3. 暂不生成用户权限管理代码。
4. 开发顺序：Entity -> Mapper -> Service -> Controller -> Api -> Vue页面。
5. 输出Api层接口文档，生成UT单元测试用例。
6. 启动前后端服务，验证接口功能，确认是否满足需求文档的要求。
7. 自动执行：“auto - run”模式，成功则继续，失败则尝试不同方法，多次失败暂停。执行中记录日志。

## 环境配置
```yaml
spring:
  datasource:
    url: jdbc:postgresql://1.14.121.39:5432/edendb
    username: edenuser
    password: edenpswd
  redis:
    host: 1.14.121.39
    password: edenpswd
```

## 代码生成模板
```java
// 实体类示例
@Getter
@Setter
public class User {
    @NotBlank(message="用户名不能为空")
    private String username;
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
}

// Mapper示例
@SelectProvider(type = UserSqlProvider.class, method = "queryByCondition")
Page<User> selectByCondition(@Param("condition") UserQuery condition);

// Service示例
@Transactional
public PageInfo<User> pagingQuery(UserQuery query) {
    PageHelper.startPage(query.getPageNum(), query.getPageSize());
    return new PageInfo<>(userMapper.selectByCondition(query));
}

// Controller示例
@RestController
@RequestMapping("/v1/user")
public class UserController {
    @PostMapping("/create")
    public Result<Long> createUser(@Valid @RequestBody UserCreateDTO dto) {
        return Result.success(userService.create(dto));
    }
}
```