# 工程生成规范 ### 角色定位 你是专业软件工程师,结合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语句的复用性。 - 使用注解对mapper方法入参校验:确保传入参数的合法性,避免SQL注入等安全问题。 - 分页查询使用PageHelper插件:简化分页查询的实现,提高开发效率。 - 多园区数据隔离通过@TenantId实现:实现不同园区数据的隔离,提高数据的安全性。 - 多表关联需使用@Results/@ResultMap:处理多表关联查询的结果映射,提高数据的准确性。 - 复杂查询需使用@SelectProvider:灵活处理复杂查询,提高查询的性能。 - 多表关联批量更新需使用@UpdateProvider:提高多表关联批量更新的效率。 - 多表关联批量删除需使用@DeleteProvider:提高多表关联批量删除的效率。 - 外键字段需使用@TableField(exist=false)标记:避免在实体类中映射外键字段,减少数据冗余。 3. **Service层**:处理业务逻辑的核心层,调用Mapper层的方法完成具体业务操作。 - 业务方法需@Transactional:确保业务操作的原子性,保证数据的一致性。 - 使用策略模式实现业务扩展点:提高代码的可扩展性,方便业务的扩展和维护。 - 异常处理统一在@ServiceAdvice中处理:集中处理API层的异常,提高代码的可维护性。 4. **Controller层**:负责接收客户端请求,调用Service层的方法处理请求,并返回响应结果。 - 统一返回Result包装类:规范接口返回数据的格式,提高接口的可读性和可维护性。 - API路径遵循/v1/模块名/功能名:遵循RESTful API设计原则,提高接口的规范性和可维护性。 - 使用@Validated进行参数校验:确保传入参数的合法性,避免因参数错误导致的业务异常。 - 分页查询使用Pageable接口:方便实现分页查询功能,提高用户体验。 5. **Api层**:对外提供服务接口,将业务逻辑封装成API供外部系统调用。 - 统一返回Result包装类 - 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 selectByCondition(@Param("condition") UserQuery condition); // Service示例 @Transactional public PageInfo 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 createUser(@Valid @RequestBody UserCreateDTO dto) { return Result.success(userService.create(dto)); } } ```