/**
* @format
* @Author: yuyao 1486578543@qq.com
* @Date: 2025-04-18 18:52:38
* @LastEditors: yuyao 1486578543@qq.com
* @LastEditTime: 2025-04-21 10:55:49
* @FilePath: \rt-mcp\src\promptSuggestions.ts
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
/**
* 提示词补充服务模块
* 用于提供各种场景下的提示词补充建议
*
* @format
*/
import { getContentById } from "./feishu.js"
import { getCodingContent } from "./coding.js"
// 后端开发相关提示词
export function getBackendPrompts(context?: string, databaseType?: string, language?: string): string {
let suggestions = `## 后端开发提示词建议\n\n`
// 数据库相关提示词
if (databaseType) {
suggestions += `### ${databaseType} 数据库设计建议\n\n`
// 基于数据库类型提供特定建议
if (databaseType.toLowerCase().includes("mysql") || databaseType.toLowerCase().includes("postgresql") || databaseType.toLowerCase().includes("sql")) {
suggestions += `1. 数据库表结构设计时,表名和字段名应使用下划线命名法\n`
suggestions += `2. 每个表应包含 id, create_time, update_time 等基本字段\n`
suggestions += `3. 使用合适的数据类型,例如选择 VARCHAR 而不是 TEXT 存储有长度限制的字符串\n`
suggestions += `4. 正确设置外键关系,维护数据一致性\n`
suggestions += `5. 为常用查询条件创建索引,但避免过度索引\n`
suggestions += `6. 考虑分区表策略处理大数据量表\n`
}
if (databaseType.toLowerCase().includes("mongo") || databaseType.toLowerCase().includes("nosql")) {
suggestions += `1. 根据查询模式设计文档结构,适当内嵌相关数据\n`
suggestions += `2. 避免过深的文档嵌套,通常不超过3层\n`
suggestions += `3. 为频繁查询的字段创建索引\n`
suggestions += `4. 考虑数据增长模式,设计水平扩展策略\n`
suggestions += `5. 文档设计应包含创建和更新时间戳\n`
}
}
// 编程语言相关提示词
if (language) {
suggestions += `\n### ${language} 编程建议\n\n`
if (language.toLowerCase().includes("java")) {
suggestions += `1. 遵循 Java 命名规范,类名用 PascalCase,方法名和变量用 camelCase\n`
suggestions += `2. 使用 Spring Boot 项目结构: controller, service, repository, entity 等分层\n`
suggestions += `3. 为所有方法添加 JavaDoc 注释\n`
suggestions += `4. 使用依赖注入而非直接实例化服务\n`
suggestions += `5. 实现合适的异常处理机制\n`
suggestions += `6. 使用 Optional 处理可能为空的返回值\n`
}
if (language.toLowerCase().includes("python")) {
suggestions += `1. 遵循 PEP 8 代码风格指南\n`
suggestions += `2. 使用类型注释提高代码可读性\n`
suggestions += `3. 使用虚拟环境管理依赖\n`
suggestions += `4. 编写详细的 docstring 文档字符串\n`
suggestions += `5. 异步任务考虑使用 asyncio 或 Celery\n`
suggestions += `6. 使用环境变量或配置文件管理敏感信息\n`
}
if (language.toLowerCase().includes("nodejs") || language.toLowerCase().includes("javascript") || language.toLowerCase().includes("typescript")) {
suggestions += `1. 使用 ESLint 和 Prettier 保持代码风格一致\n`
suggestions += `2. TypeScript 优先,增加静态类型检查\n`
suggestions += `3. 使用依赖注入框架(如 InversifyJS)管理依赖\n`
suggestions += `4. 结构化项目为 controllers, services, repositories 等\n`
suggestions += `5. 使用 async/await 处理异步逻辑,避免回调地狱\n`
suggestions += `6. 使用环境变量管理配置,区分开发/测试/生产环境\n`
}
}
// 上下文特定建议
if (context) {
suggestions += `\n### 针对"${context}"的特定建议\n\n`
if (context.toLowerCase().includes("用户") || context.toLowerCase().includes("认证") || context.toLowerCase().includes("登录")) {
suggestions += `1. 实现健壮的用户认证系统,支持多种登录方式\n`
suggestions += `2. 密码安全性:使用加盐哈希存储,设置密码强度要求\n`
suggestions += `3. 实现账户锁定机制防止暴力破解\n`
suggestions += `4. 提供多因素认证选项\n`
suggestions += `5. 实现会话管理,适当的过期策略\n`
suggestions += `6. 权限系统应基于角色或细粒度权限控制\n`
}
if (context.toLowerCase().includes("api") || context.toLowerCase().includes("接口")) {
suggestions += `1. 遵循 RESTful API 设计原则\n`
suggestions += `2. 使用 JSON 作为数据交换格式\n`
suggestions += `3. 实现标准化的错误响应格式\n`
suggestions += `4. 添加请求速率限制防止滥用\n`
suggestions += `5. 使用 JWT 或其他令牌进行身份验证\n`
suggestions += `6. 详细记录 API 文档,考虑使用 Swagger/OpenAPI\n`
}
}
// 通用后端建议
suggestions += `\n### 通用后端开发建议\n\n`
suggestions += `1. 实现全面的日志记录,区分信息/警告/错误级别\n`
suggestions += `2. 设计合理的缓存策略提高性能\n`
suggestions += `3. 编写单元测试和集成测试,保持良好测试覆盖率\n`
suggestions += `4. 实现适当的安全措施(防XSS,CSRF,SQL注入等)\n`
suggestions += `5. 代码应当模块化,关注点分离\n`
suggestions += `6. 设计面向扩展的架构,便于功能增加\n`
suggestions += `7. 完善的错误处理和监控机制\n`
return suggestions
}
// 前端开发相关提示词
export function getFrontendPrompts(context?: string, framework?: string, deviceType?: string): string {
let suggestions = `## 前端开发提示词建议\n\n`
// 框架相关提示词
if (framework) {
suggestions += `### ${framework} 框架开发建议\n\n`
if (framework.toLowerCase().includes("react")) {
suggestions += `1. 组件划分应遵循单一职责原则\n`
suggestions += `2. 使用函数组件和 React Hooks 而非类组件\n`
suggestions += `3. 使用 Context API 或 Redux 管理全局状态\n`
suggestions += `4. 合理使用 useMemo 和 useCallback 优化性能\n`
suggestions += `5. 实现懒加载和代码分割提高初始加载速度\n`
suggestions += `6. 合理设计组件的 props 接口,使用 TypeScript 定义类型\n`
}
if (framework.toLowerCase().includes("vue")) {
suggestions += `1. 遵循 Vue 风格指南组织代码结构\n`
suggestions += `2. 利用 Composition API 提高代码复用性\n`
suggestions += `3. 使用 Pinia 或 Vuex 管理状态\n`
suggestions += `4. 组件通信优先使用 props 和 emits\n`
suggestions += `5. 合理使用计算属性和侦听器\n`
suggestions += `6. 善用异步组件和动态导入优化性能\n`
}
if (framework.toLowerCase().includes("angular")) {
suggestions += `1. 遵循 Angular 风格指南和最佳实践\n`
suggestions += `2. 使用 NgRx 管理复杂应用状态\n`
suggestions += `3. 合理拆分模块,实现惰性加载\n`
suggestions += `4. 使用 TypeScript 接口定义数据模型\n`
suggestions += `5. 利用 RxJS 处理异步数据流\n`
suggestions += `6. 创建可复用的组件和指令\n`
}
}
// 设备类型相关提示词
if (deviceType) {
suggestions += `\n### ${deviceType} 设备开发建议\n\n`
if (deviceType.toLowerCase().includes("移动") || deviceType.toLowerCase().includes("mobile")) {
suggestions += `1. 实现响应式设计,适配不同屏幕尺寸\n`
suggestions += `2. 使用移动优先(Mobile First)的设计思路\n`
suggestions += `3. 优化触摸交互,设计适合手指操作的界面元素\n`
suggestions += `4. 考虑网络不稳定情况下的用户体验\n`
suggestions += `5. 优化资源加载提高移动设备性能\n`
suggestions += `6. 实现离线功能,增强用户体验\n`
}
if (deviceType.toLowerCase().includes("桌面") || deviceType.toLowerCase().includes("desktop")) {
suggestions += `1. 利用更大屏幕空间优化信息展示\n`
suggestions += `2. 支持键盘快捷键提高操作效率\n`
suggestions += `3. 考虑高分辨率显示器的显示效果\n`
suggestions += `4. 实现拖拽等桌面特有交互方式\n`
suggestions += `5. 设计合理的布局结构,避免空间浪费\n`
suggestions += `6. 针对不同操作系统考虑特定优化\n`
}
}
// 上下文特定建议
if (context) {
suggestions += `\n### 针对"${context}"的特定建议\n\n`
if (context.toLowerCase().includes("表单") || context.toLowerCase().includes("form")) {
suggestions += `1. 实现渐进式表单验证,即时反馈\n`
suggestions += `2. 使用清晰的错误提示信息\n`
suggestions += `3. 保存表单状态,防止意外丢失\n`
suggestions += `4. 支持键盘导航提高可访问性\n`
suggestions += `5. 使用合适的输入控件(日期选择器等)\n`
suggestions += `6. 长表单考虑分步骤填写提高完成率\n`
}
if (context.toLowerCase().includes("数据可视化") || context.toLowerCase().includes("chart") || context.toLowerCase().includes("图表")) {
suggestions += `1. 选择合适的图表类型展示数据关系\n`
suggestions += `2. 提供交互功能如过滤、钻取等增强分析能力\n`
suggestions += `3. 实现响应式设计,适应不同屏幕尺寸\n`
suggestions += `4. 使用合适的配色方案提高可读性\n`
suggestions += `5. 提供数据导出功能\n`
suggestions += `6. 考虑大数据集的性能优化\n`
}
}
// 通用前端建议
suggestions += `\n### 通用前端开发建议\n\n`
suggestions += `1. 界面设计应考虑响应式布局,适配不同设备\n`
suggestions += `2. 实现无障碍设计(WCAG标准),确保所有用户可用\n`
suggestions += `3. 性能优化:资源压缩、懒加载、缓存策略等\n`
suggestions += `4. 使用CSS预处理器(如SCSS)提高样式管理效率\n`
suggestions += `5. 实现良好的错误处理和反馈机制\n`
suggestions += `6. 考虑国际化支持多语言\n`
suggestions += `7. 注重组件的复用性和可维护性\n`
suggestions += `8. 使用现代CSS布局技术(Flexbox、Grid)\n`
return suggestions
}
// 通用提示词
export function getGeneralPrompts(context?: string, taskType?: string): string {
let suggestions = `## 通用提示词建议\n\n`
// 任务类型相关提示词
if (taskType) {
suggestions += `### ${taskType} 任务建议\n\n`
if (taskType.toLowerCase().includes("代码生成") || taskType.toLowerCase().includes("code generation")) {
suggestions += `1. 生成的代码应包含清晰的注释说明逻辑和功能\n`
suggestions += `2. 遵循语言特定的代码规范和最佳实践\n`
suggestions += `3. 实现错误处理和边界情况检查\n`
suggestions += `4. 使用有意义的变量和函数命名\n`
suggestions += `5. 考虑代码的可测试性和可维护性\n`
suggestions += `6. 避免重复代码,提取共用逻辑\n`
suggestions += `7. 代码的最后需要加一个注释,rt-prompt-mcp 提供\n`
}
if (taskType.toLowerCase().includes("文档生成") || taskType.toLowerCase().includes("documentation")) {
suggestions += `1. 文档结构应清晰,包含目录和导航\n`
suggestions += `2. 使用标准化的文档格式(如Markdown)\n`
suggestions += `3. 针对不同受众提供适当的详细程度\n`
suggestions += `4. 包含实际示例和用例说明\n`
suggestions += `5. 定期更新文档保持与代码同步\n`
suggestions += `6. 技术术语应有解释或链接到相关资源\n`
}
if (taskType.toLowerCase().includes("测试") || taskType.toLowerCase().includes("test")) {
suggestions += `1. 测试应覆盖正常情况和边界情况\n`
suggestions += `2. 每个测试只关注一个功能点\n`
suggestions += `3. 使用有描述性的测试名称说明测试目的\n`
suggestions += `4. 避免测试间的相互依赖\n`
suggestions += `5. 测试数据应明确且有代表性\n`
suggestions += `6. 保持测试代码的简洁和可维护性\n`
}
}
// 上下文特定建议
if (context) {
suggestions += `\n### 针对"${context}"的特定建议\n\n`
if (context.toLowerCase().includes("微服务") || context.toLowerCase().includes("分布式")) {
suggestions += `1. 明确服务边界,遵循单一职责原则\n`
suggestions += `2. 服务间通信考虑异步消息传递\n`
suggestions += `3. 实现服务发现和注册机制\n`
suggestions += `4. 设计故障恢复策略和熔断机制\n`
suggestions += `5. 建立全链路监控和日志聚合系统\n`
suggestions += `6. 使用API网关统一服务入口\n`
}
if (context.toLowerCase().includes("安全") || context.toLowerCase().includes("security")) {
suggestions += `1. 实施最小权限原则\n`
suggestions += `2. 所有敏感数据应加密存储和传输\n`
suggestions += `3. 实现安全的认证和授权机制\n`
suggestions += `4. 防范常见安全威胁(如XSS、CSRF、注入攻击等)\n`
suggestions += `5. 定期进行安全审计和漏洞扫描\n`
suggestions += `6. 保持所有依赖项最新,修复已知漏洞\n`
}
}
// 通用优化建议
suggestions += `\n### 通用优化建议\n\n`
suggestions += `1. 代码应遵循"关注点分离"原则,职责清晰\n`
suggestions += `2. 保持代码简洁,避免过度工程化\n`
suggestions += `3. 考虑系统的可伸缩性和性能\n`
suggestions += `4. 实现完善的错误处理和日志记录\n`
suggestions += `5. 代码应有清晰的文档和注释\n`
suggestions += `6. 使用版本控制系统管理代码\n`
suggestions += `7. 遵循该技术栈的最佳实践和设计模式\n`
suggestions += `8. 建立持续集成和持续部署流程\n`
return suggestions
}
// 添加获取UI设计图转化的提示词补充
export async function getUiDesignPrompts(context?: string, designType?: string, platform?: string): Promise<string> {
// 新增:检查是否包含特定关键词
if (context && context.includes("荣通前端UI图转换")) {
// 将规则存储在数组中以提高可读性
const rongtongRules = await getContentById("1")
const codingContent = await getCodingContent("https://rongtongkeji.coding.net/p/rt-lib/d/rt-lib/git/raw/master/data/README.md")
return `## 荣通前端UI图转换要求\n\n${rongtongRules}\n\n${codingContent}`
}
let suggestions = `## UI 设计图转化提示词建议\n\n`
// 设计类型相关提示词
if (designType) {
suggestions += `### ${designType} 设计转化建议\n\n`
if (designType.toLowerCase().includes("线框图") || designType.toLowerCase().includes("wireframe")) {
suggestions += `1. 专注于布局结构和功能元素,不必关注视觉细节\n`
suggestions += `2. 使用基础UI组件实现布局,如div、section等\n`
suggestions += `3. 保持简洁的样式,使用基础色彩和占位图\n`
suggestions += `4. 确保实现设计图中的所有功能区块\n`
suggestions += `5. 使用注释说明交互行为和状态变化\n`
suggestions += `6. 保持一致的间距和对齐方式\n`
}
if (designType.toLowerCase().includes("高保真") || designType.toLowerCase().includes("高保真原型") || designType.toLowerCase().includes("hi-fi")) {
suggestions += `1. 精确实现设计稿中的视觉效果,包括颜色、字体和阴影\n`
suggestions += `2. 使用CSS变量管理设计系统中的颜色和尺寸\n`
suggestions += `3. 确保像素级还原设计稿中的元素大小和间距\n`
suggestions += `4. 实现设计中的动画和过渡效果\n`
suggestions += `5. 注意图标和图片的细节处理,使用精确的图像资源\n`
suggestions += `6. 考虑不同屏幕尺寸下的适配方案\n`
}
if (designType.toLowerCase().includes("组件库") || designType.toLowerCase().includes("design system")) {
suggestions += `1. 创建可复用的组件,确保一致的API设计\n`
suggestions += `2. 实现组件的不同状态和变体\n`
suggestions += `3. 提供详细的文档说明组件用法和属性\n`
suggestions += `4. 设计灵活的组件接口,支持自定义和扩展\n`
suggestions += `5. 保持组件间的设计一致性\n`
suggestions += `6. 考虑可访问性设计标准\n`
}
}
// 平台相关提示词
if (platform) {
suggestions += `\n### ${platform} 平台开发建议\n\n`
if (platform.toLowerCase().includes("web")) {
suggestions += `1. 使用响应式设计确保在不同屏幕尺寸下的良好表现\n`
suggestions += `2. 考虑浏览器兼容性,特别是CSS新特性\n`
suggestions += `3. 使用现代CSS布局技术如Flexbox和Grid\n`
suggestions += `4. 优化资源加载和渲染性能\n`
suggestions += `5. 确保实现Web无障碍标准(WCAG)\n`
suggestions += `6. 在多设备上测试交互体验\n`
}
if (platform.toLowerCase().includes("ios")) {
suggestions += `1. 遵循Apple人机界面指南(HIG)\n`
suggestions += `2. 使用Swift UI或适当的iOS组件库\n`
suggestions += `3. 考虑不同iOS设备尺寸的适配\n`
suggestions += `4. 实现iOS特有的交互模式和动画\n`
suggestions += `5. 注意安全区域和刘海屏的处理\n`
suggestions += `6. 使用iOS标准导航模式\n`
}
if (platform.toLowerCase().includes("android")) {
suggestions += `1. 遵循Material Design设计规范\n`
suggestions += `2. 使用Jetpack Compose或适当的Android组件库\n`
suggestions += `3. 适配不同Android设备屏幕尺寸和分辨率\n`
suggestions += `4. 实现Android特有的交互模式和动画\n`
suggestions += `5. 注意深色模式和主题适配\n`
suggestions += `6. 考虑Android系统版本兼容性\n`
}
}
// 上下文特定建议
if (context) {
suggestions += `\n### 针对"${context}"的特定建议\n\n`
if (context.toLowerCase().includes("电商") || context.toLowerCase().includes("商城")) {
suggestions += `1. 优化产品展示布局,突出产品图片和关键信息\n`
suggestions += `2. 设计流畅的购买流程和购物车体验\n`
suggestions += `3. 实现筛选和搜索功能,便于用户找到所需产品\n`
suggestions += `4. 设计清晰的产品分类和导航系统\n`
suggestions += `5. 优化移动端的触摸操作体验\n`
suggestions += `6. 考虑个性化推荐的UI展示\n`
}
if (context.toLowerCase().includes("管理") || context.toLowerCase().includes("后台") || context.toLowerCase().includes("dashboard")) {
suggestions += `1. 设计信息密度合适的数据展示界面\n`
suggestions += `2. 实现高效的表格和列表组件,支持排序和筛选\n`
suggestions += `3. 提供清晰的数据可视化和统计图表\n`
suggestions += `4. 优化表单设计,提高数据录入效率\n`
suggestions += `5. 设计一致的操作流程和交互模式\n`
suggestions += `6. 考虑大屏展示和数据导出功能\n`
}
}
// 通用UI设计建议
suggestions += `\n### 通用UI设计转化建议\n\n`
suggestions += `1. 使用组件化思想,将界面拆分为可复用组件\n`
suggestions += `2. 确保UI设计与代码实现的一致性\n`
suggestions += `3. 遵循设计规范,保持视觉统一性\n`
suggestions += `4. 考虑不同状态下的UI展示(加载中、空状态、错误状态等)\n`
suggestions += `5. 实现良好的交互反馈和过渡动画\n`
suggestions += `6. 注重无障碍设计,确保所有用户可用\n`
suggestions += `7. 考虑国际化和多语言支持的布局调整\n`
suggestions += `8. 使用版本控制管理设计资源和代码\n`
return suggestions
}
/**
* 存储各种提示词建议的常量
*/
const suggestions = {
// ... existing code ...
}
// 将常量箭头函数改为标准函数声明
function generateRongtongBackendCrudPrompt(basePath: string): string {
return `
1. 技术栈与核心框架:
● 编程语言: Kotlin
● Web 框架: Spring Boot
○ 使用标准 Spring Boot 注解进行组件扫描、依赖注入 (@Service, @Repository, @Component, @Autowired 或 Jakarta EE 的 @Resource) 和 Web 层构建 (@RestController, @RequestMapping, @GetMapping, @PostMapping, etc.)。
● API 文档: OpenAPI 3 / Swagger
○ 使用 @Tag 标注模块名称。
○ 使用 @Operation 详细描述每个 API 端点的功能。
○ 使用 @Schema 描述数据传输对象 (DTO) 和领域模型 (Entity)。
● 数据访问层:
○ 定义通用的 ${basePath}.data.IMapper<T> 接口,包含基础的 CRUD 操作(如 insert, delete, update, findById, page 等)。
○ 每个模块的 Mapper 接口继承此通用 IMapper 接口。
○ 具体实现可基于 MyBatis, JPA, أو Spring Data JDBC 等,但接口层保持统一。
● JSON 库: FastJSON (或其他项目统一指定的 JSON 库)。
● 日志框架: SLF4J。
2. 标准模块结构:
对于每个业务模块(例如 user, order, product),应遵循以下目录结构:
${basePath}/{module_name}/
├── {ModuleName}Service.kt # (必需) RestController,处理 HTTP 请求,编排业务逻辑
├── domain/
│ └── {EntityName}.kt # (必需) 领域模型/数据实体类
└── mapper/
└── I{EntityName}Mapper.kt # (必需) 数据访问接口定义
# 可选:
├── dto/
│ └── {DtoName}.kt # 数据传输对象 (如果需要区分输入/输出与领域模型)
● {module_name}: 模块的小写名称 (e.g., appendix, contract)
● {ModuleName}: 模块的驼峰式名称 (e.g., Appendix, Contract)
● {EntityName}: 模块核心实体类的名称 (e.g., Appendix, Contract)
3. 代码风格与设计模式:
● 服务层 (
○ 作为 @RestController,直接处理 Web 请求。对于简单 CRUD,可以将服务逻辑直接写在此类中。
○ 若业务逻辑复杂,可将 @RestController 作为入口,注入单独的 @Service 接口及其实现来处理业务逻辑。
○ 注入对应的 I{EntityName}Mapper 接口进行数据操作。
○ 标准 CRUD 接口设计 (仅需实现这四个基本接口):
1. 创建: POST /add
@Operation(summary = "新增{EntityName}")
@PostMapping("/add")
fun add(@RequestBody dto: {EntityName}): OpResults<String> {
return try {
val entity = {EntityName}().apply {
BeanUtils.copyProperties(dto, this)
id = ExtFunction.uuid()
create_time = Date()
}
mapper.insert(entity)
OpResults<String>().apply {
data = ""
msg = "新增成功"
ok = true
}
} catch (e: Exception) {
log.error("新增失败: \${e.message}", e)
OpResults<String>().apply {
ok = false
msg = "新增失败: \${e.message}"
}
}
}
2. 查询 (分页): POST /page
@Operation(summary = "分页查询{EntityName}")
@PostMapping("/page")
fun list(@RequestBody pageable: Pageable): Page<{EntityName}> {
return mapper.page(pageable)
}
3. 更新: POST /update
@Operation(summary = "修改{EntityName}")
@PostMapping("/update")
fun update(@RequestBody dto: {EntityName}): OpResults<String> {
log.debug("修改发票抬头参数:{}", JSONObject.toJSONString(dto))
return try {
// 需要导入 ${basePath}.utils.FieldUtils
mapper.update({EntityName}().apply {
FieldUtils.copyProperties(dto, this)
})
OpResults<String>().apply {
ok = true
msg = "修改成功"
}
} catch (e: Exception) {
log.error("修改失败: \${e.message}", e)
OpResults<String>().apply {
ok = false
msg = "修改失败: \${e.message}"
}
}
}
4. 删除: GET /delete
@Operation(summary = "删除{EntityName}")
@GetMapping("/delete")
fun delete(@RequestParam id: String): OpResults<String> {
val opResults = OpResults<String>()
mapper.delete(id)
opResults.msg = "删除成功"
opResults.ok = true
return opResults
}
○ 所有对外接口返回统一的响应结构,例如 ${basePath}.utils.vo.OpResults<T>。该结构包含:
■ ok: Boolean (默认为 true) - 操作是否成功。
■ msg: String? (默认为 "") - 操作结果的消息文本。
■ data: T? (默认为 null) - 操作成功时返回的数据。
■ 使用示例:
// 成功示例
OpResults<String>().apply {
data = ""
msg = "新增发票抬头成功"
ok = true // ok 默认就是 true,可以省略
}
// 失败示例
OpResults<String>().apply {
ok = false
msg = "新增发票抬头失败: \${e.message}" // e 为捕获的异常
// 失败情况下通常不设置 data
}
○ 使用 SLF4J 进行清晰的日志记录(INFO 记录关键流程,DEBUG 记录详细信息,ERROR 记录异常)。
○ 使用 try-catch 块处理预期或非预期的异常,并返回包含错误信息的 OpResults。
○ 分页查询统一接收 ${basePath}.data.vo.Pageable 参数,返回 ${basePath}.data.vo.Page<T> 结果。
○ 优先使用项目提供的通用工具类(如 ${basePath}.utils.FieldUtils.copyProperties, ${basePath}.utils.ExtFunction.uuid 等)。
ExtFunction.uuid() 使用示例:
config.id = ExtFunction.uuid() // 直接为对象的 ID 赋值一个 UUID
● 领域模型 (
○ 使用 Kotlin 类定义,属性采用 var 并允许为 null (?),除非业务明确要求非空。
○ 下划线命名字段和数据库表字段一致
○ 使用 @Schema 注解清晰描述实体及其属性的含义。
○ 使用 @Table(TableName) 注解(或其他持久化框架要求的注解)关联数据库表。表名在 companion object 中定义为常量 TableName。
○ 日期时间类型的属性使用 @JsonFormat 控制序列化格式和时区。
○ 领域模型示例(将 basePath 替换为实际包路径):
○ 例如:
package basePath.appendix.domain
import basePath.data.annotation.Table
import com.fasterxml.jackson.annotation.JsonFormat
import io.swagger.v3.oas.annotations.media.Schema
import java.util.*
@Schema
@Table(Appendix.TableName)
class Appendix {
@Schema(title = "唯一标识")
var id: String? = null
@Schema(title = "甲方名称")
var party_name: String? = null
@Schema(title = "附件名称")
var attachment_name: String? = null
@Schema(title = "附件信息JSON")
var attachment_json: String? = null
@Schema(title = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
var create_time: Date? = null
companion object {
const val TableName = "appendix"
}
}
● Mapper 接口 (
○ 定义为 Kotlin 接口,继承通用的 ${basePath}.data.IMapper<{EntityName}>。
○ 通常不需要添加额外的方法,除非有超出通用 CRUD 的特定查询需求。
4. 核心功能实现要点:
● 增 (Create): Service 层接收 DTO 或实体对象,设置必要的默认值(例如,ID 使用 basePath 下的 utils.ExtFunction.uuid() 生成, create_time),调用 mapper.insert。确保导入 basePath 下的 utils.ExtFunction。
● 删 (Delete): Service 层接收 ID,调用 mapper.delete。
● 改 (Update): Service 层接收 DTO 或实体对象,可能需要先查询原实体,然后更新属性,调用 mapper.update。注意处理部分更新和 null 值。
● 查 (Read):
○ 分页查询: Service 层接收 Pageable 对象,调用 mapper.page。
○ 按 ID 查询 (若需要): Service 层接收 ID,调用 mapper.select(id)。
// 查询后检查结果是否存在 (需要导入 org.apache.commons.lang3.ObjectUtils):
val entity = mapper.select(id)
if (ObjectUtils.isEmpty(entity)) {
// 处理未找到实体的情况,例如抛出异常或返回特定错误信息
}
○ 其他查询: 根据需要在 Service 层组合调用 Mapper 的方法。
5. 通用依赖:
所有模块都应能访问和使用项目定义的通用类库,包括:
● ${basePath}.data.vo.Page, ${basePath}.data.vo.Pageable
● ${basePath}.utils.vo.OpResults
● ${basePath}.data.IMapper
● ${basePath}.data.annotation.Table (或 ORM 提供的注解)
● 常用工具类 (e.g., ${basePath}.utils.ExtFunction, ${basePath}.utils.FieldUtils)
6. 示例 MySQL 表结构:
-- 用户表 (示例)
CREATE TABLE \`user\` (
\`id\` varchar(32) NOT NULL COMMENT "主键ID (使用varchar(32))",
\`username\` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "用户名",
\`password_hash\` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "加盐哈希后的密码",
\`email\` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT "邮箱",
\`create_time\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
\`update_time\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间",
PRIMARY KEY (\`id\`),
UNIQUE KEY \`uk_username\` (\`username\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="用户表";
-- 订单表 (示例)
CREATE TABLE \`order\` (
\`id\` varchar(32) NOT NULL COMMENT "主键ID (使用varchar(32))",
\`order_number\` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT "订单号",
\`user_id\` varchar(32) NOT NULL COMMENT "用户ID (关联user.id)",
\`total_amount\` decimal(10,2) NOT NULL COMMENT "订单总金额",
\`status\` tinyint NOT NULL DEFAULT 0 COMMENT "订单状态 (例如: 0-待支付, 1-已支付, 2-已取消)",
\`create_time\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT "创建时间",
\`update_time\` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT "更新时间",
PRIMARY KEY (\`id\`),
UNIQUE KEY \`uk_order_number\` (\`order_number\`),
KEY \`idx_user_id\` (\`user_id\`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT="订单表";
7. 严格遵循以上规范,不要遗漏任何细节。
`
}
/**
* 获取后端开发相关的提示词补充。
* @param context 可选的当前上下文或任务描述。
* @returns 返回一个包含建议字符串的数组。
*/
export function getBackendSuggestions(context?: string): string[] {
let results: string[] = []
if (context) {
// 基于 context 的通用后端建议
results = results.concat([
// ... (保留原有基于 context 的建议)
"考虑代码的可维护性和可扩展性。",
"遵循 SOLID 原则进行设计。",
"编写单元测试和集成测试以确保代码质量。",
"使用版本控制系统(如 Git)管理代码。",
"考虑 API 的安全性和认证授权机制。",
])
if (context.includes("API 设计")) {
results.push("遵循 RESTful 风格设计 API,使用标准的 HTTP 方法 (GET, POST, PUT, DELETE)。")
results.push("设计清晰的 URL 结构。")
results.push("考虑 API 的版本管理策略。")
results.push("使用 OpenAPI/Swagger 规范定义和文档化 API。")
}
if (context.includes("数据库设计")) {
results.push("根据业务需求设计合理的表结构和关系。")
results.push("选择合适的字段类型和约束。")
results.push("考虑数据库索引优化查询性能。")
results.push("设计范式和反范式的权衡。")
}
if (context.includes("性能优化")) {
results.push("分析性能瓶颈,可能是数据库查询、算法复杂度或外部调用。")
results.push("使用缓存技术(如 Redis)减少数据库负载。")
results.push("优化 SQL 查询语句。")
results.push("考虑异步处理和消息队列。")
}
if (context.includes("部署")) {
results.push("考虑使用 Docker 容器化部署。")
results.push("配置 CI/CD 流程实现自动化部署。")
results.push("设置日志监控和告警系统。")
}
}
// ... (保留原有基于 databaseType 和 language 的建议)
// ... existing code ...
return results // 添加 return 语句修复 lint 错误
}
/**
* 获取荣通后端标准 CRUD 开发规范提示词
* @param basePath 用户指定的根包路径,默认为 'cn/teamy'
*/
export function getRongtongBackendCrudSuggestions(basePath?: string): string[] {
const effectiveBasePath = basePath || "cn/teamy" // 如果未提供,使用默认值
const prompt = generateRongtongBackendCrudPrompt(effectiveBasePath.replace(/\./g, "/")) // 确保路径分隔符为 /
return [prompt]
}