# MEMORY.md - 长期记忆 ## 项目背景 - 用户在腾讯从事 WorkBuddy 需求分析和 Vue 前端设计与重构工作 - 同时负责 ECS 电子班牌系统和 ykt_server 项目开发 - ECS 模块位于 `ruoyi-modules/ruoyi-ecs` 下 - 技术栈:RuoYi-Cloud-Plus 框架、Dubbo 微服务、多租户架构 - 数据库:达梦、人大金仓、OceanBase 等国产方案 - 开发工具:WebStorm、DataGrip、IDEA - 用户偏好轻量软件,使用中文交流,Windows 系统 ## 技术规范 - **字典命名规范**:字典是全局的,命名不加模块前缀(如 `course_type` 而非 `ecs_course_type`) - **DTO 命名规范**:统一使用 `Dto` 后缀 - **关联表处理**:多对多关系通过中间表实现,列表显示时需 SQL 拼接关联字段(如讲师姓名拼接串) - **数据库类型**:默认人大金仓(kingbase),支持 --db 选项指定 mysql/dm/oceanbase - **三个技能文件均已添加语言要求**:所有对话、说明、注释均使用中文 - **通用字段规范**:所有表统一包含 del_flag(char(1))/create_dept(bigint)/create_by(bigint)/create_time(timestamp)/update_by(bigint)/update_time(timestamp),多租户表额外含 tenant_id(varchar(20))。建表DDL自动追加,字段清单中无需重复声明 - **前端导入导出规范**:导出/下载模板用 `proxy?.download(url, params, fileName)` 方式,导入用 `el-upload` 的 `action` 属性 + `globalHeaders()` + `ImportOption` reactive。api/index.ts 中不需要 exportTemplate/importData/export 函数 - **前端表格列宽规范**:`el-table-column` 必须使用 `min-width` 而非 `width`。固定 `width` 不会自动扩展,导致右侧空白;`min-width` 设最小宽度后自动分配剩余空间填满表格 - **操作锁定规则 lockRule**:当某字段值决定行级操作权限时使用 lockRule。格式:`{ lockValue: 值, lockActions: [edit/delete], tip: 提示文案 }`。字段需 `inDb=true`,通常 `inTable=false`/`inQuery=false`,但必须包含在 VO 中供前端判断。典型场景:dataSource=1 时禁止编辑删除 - **ServiceImpl 查询规范**:必须使用 `LambdaQueryWrapper` + `buildQueryWrapper` 私有方法,**禁止**直接传 Bo 给 Mapper。分页查询用 `baseMapper.selectVoPage(pageQuery.build(), lqw)` + `TableDataInfo.build(result)`。insertByBo 需回填主键 + `validEntityBeforeSave` 校验。Mapper 不引入 Bo,Service 接口不引入 Domain。 - **模板变量**:`${queryWrapperConditions}` 用于 buildQueryWrapper 中的条件代码块,`${PkCapField}` 用于主键首字母大写的 getter/setter 调用 - **字典字段类型规范**:数据字典(dictType)对应的数据库表字段类型为 `varchar(16)`,Java 实体/Bo/Vo 中对应类型为 `String`(而非 `Integer`)。字典值虽然常为数字,但存储和传输统一使用字符串 - **主键不导出 Excel**:主键字段(Long 类型)不加 `@ExcelProperty` 注解,不参与 Excel 导出。Vo 中主键仅作为标识字段,需求文档中主键默认 `excelExport: false` - **日期类型规范**:日期和时间字段的 Java 类型统一使用 `java.util.Date`(而非 `LocalDateTime`),数据库类型为 `datetime`。与 BaseEntity 基类保持一致(createTime/updateTime 均为 Date)。ServiceImpl 中使用 `new Date()` 而非 `LocalDateTime.now()` ## 技能体系 ### 指令规范 - 指令规范文件:`D:\dt_ykt\ykt_server\.workbuddy\CMD.md` - 定义 `/require` 和 `/dev` 双指令系统 ### /require 指令 → require 技能 - 触发:`/require [模块] [功能名] [简要需求] [选项]` - 技能位置:`D:\dt_ykt\ykt_server\.workbuddy\skills\require\` - 输出:`doc/[模块]-[功能名]-requirements.md`(需求规格说明书) - 流程:分析简要需求 → 加载需求模板 → 生成需求文档 → 用户确认 - **`--db` 选项**:指定数据库类型(kingbase/mysql/dm/oceanbase),默认 kingbase,影响建表语句生成 - 需求文档包含9个章节:基础信息、接口清单、字段属性速查表、字段清单、VO结构、特殊需求、字典项、建表语句、备注 ### /dev 指令 → ruoyi-backend + ykt-web-dev 技能 - 触发:`/dev [模块] [功能名] [选项]` - 输入:读取 `doc/[模块]-[功能名]-requirements.md` - 后端技能:`D:\dt_ykt\ykt_server\.workbuddy\skills\ruoyi-backend\`(已新增需求驱动章节) - 前端技能:`D:\dt_ykt\ykt_web\.workbuddy\skills\ykt-web-dev\`(已新增需求驱动章节) - 输出:后端 Java 文件 + 前端 Vue/TS 文件 ### 路径约定 - 需求文档:`d:/dt_ykt/ykt_server/doc/[模块]-[功能名]-requirements.md` - 后端代码:`d:/dt_ykt/ykt_server/ruoyi-modules/ruoyi-[模块]/` - 前端代码:`d:/dt_ykt/ykt_web/src/` - 可通过 `--backend=` 和 `--frontend=` 参数手工指定项目路径 ### 完整开发流程 ``` 1. /require [模块] [功能名] [简要需求] → 生成需求规格说明书 2. 反复沟通/人工调整需求文档 → 确认最终需求规格说明书 3. /dev [模块] [功能名] → 读取需求文档,生成前后端代码 4. 用户确认代码 → 写入文件 ``` ### 技能清单 | 技能 | 位置 | 职责 | |------|------|------| | require | `ykt_server/.workbuddy/skills/require/` | 需求分析 + 规格说明书生成 | | ruoyi-backend | `ykt_server/.workbuddy/skills/ruoyi-backend/` | 后端代码生成(模板驱动 + 需求驱动) | | ykt-web-dev | `ykt_web/.workbuddy/skills/ykt-web-dev/` | 前端代码生成(模板驱动 + 需求驱动) |