Browse Source

fix(主子表格): 修复删除和导出功能中的 selectObjs 引用,确保正确处理选中项

PIGCLOUD 1 month ago
parent
commit
d5b734ea6b
3 changed files with 86 additions and 4 deletions
  1. 82 0
      CLAUDE.md
  2. 2 2
      multiple/主子表格.vue
  3. 2 2
      single/表格.vue

+ 82 - 0
CLAUDE.md

@@ -0,0 +1,82 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## 项目概述
+
+CGTM(代码生成模板市场)是基于 Apache Velocity 的代码生成模板仓库,为 PIGX 框架提供后端(Java/Spring Boot)和前端(Vue 3/TypeScript)的 CRUD 代码生成模板。本仓库不包含可构建的应用代码,仅包含 Velocity 模板文件(`.java`, `.vue`, `.ts`, `.xml`, `.sql`)。
+
+许可证:AGPL 3.0,仅对 PIGX 用户免费。
+
+## 仓库结构
+
+```
+single/       # 单表增删改查模板(Controller, Service, Mapper, Entity, 表格.vue, 表单.vue)
+multiple/     # 主子表增删改查模板(主子Controller, 主子Service, 主/子实体, 主子表格/表单.vue)
+common/       # 共享模板(api.ts, 权限菜单.sql, i18n模板, vform)
+config.json   # 模板组配置 — 定义模板名称、源文件路径和生成输出路径的映射
+```
+
+## 无构建/测试命令
+
+本仓库是纯模板仓库,没有 package.json、pom.xml 或任何构建系统。无需运行 build、lint 或 test 命令。修改后直接 git commit 即可。
+
+## 模板引擎:Velocity 语法
+
+- 变量:`$ClassName`、`${field.attrName}`
+- 指令:`#foreach ($field in $fieldList)` ... `#end`、`#if($condition)` ... `#end`、`#set($var = value)`
+- 注释:`##` 行注释
+- 工具对象:`$str`(字符串工具)、`$dateTool`(日期工具)、`$math`(数学工具)
+
+## 关键上下文变量
+
+模板在代码生成时可使用以下变量:
+
+**路径与模块:** `backendPath`, `frontendPath`, `packagePath`, `moduleName`, `functionName`
+
+**类与表:** `ClassName`/`className`, `tableName`, `tableComment`, `pk`(主键字段)
+
+**字段列表:** `fieldList`(全部字段)、`primaryList`、`formList`、`gridList`、`queryList`
+
+**字段属性:** `fieldName`(SQL列名)、`attrName`/`attrType`(Java属性)、`fieldComment`、`primaryPk`、`autoFill`、`baseField`、`formItem`、`formRequired`、`formType`、`formValidator`、`gridItem`、`gridSort`、`queryItem`、`queryType`、`fieldDict`、`hidden`
+
+**主子表专用:** `childFieldList`、`childTableName`、`mainField`、`childField`、`ChildClassName`/`childClassName`
+
+**环境标志:** `isSpringBoot3`(Spring Boot 3.x 兼容)、`isTenant`(多租户支持)
+
+## 架构模式
+
+### 后端(Java)生成层次
+Controller(REST + 权限 + 审计日志)→ Service 接口 → ServiceImpl → Mapper(MyBatis-Plus)→ Entity(Active Record 模式)
+
+关键特性:
+- Entity 继承 `Model<T>`,使用 `@TableId(ASSIGN_ID)`、`@TableField(fill=...)`、`@TableLogic`
+- Controller 使用 `@PreAuthorize("@pms.hasPermission(...)")`、`@SysLog`、`@ResponseExcel`/`@RequestExcel`
+- 主子表 ServiceImpl 使用 `MPJDeepService` 处理关联查询,`@Transactional` 管理事务
+- 多租户通过 `@TenantTable` 注解条件启用
+
+### 前端(Vue 3)生成结构
+表格组件(index.vue,数据展示+查询+导出)+ 表单组件(form.vue,Dialog 新增/编辑)+ API 客户端(api.ts)
+
+关键特性:
+- `<script setup lang="ts">` + Element Plus 组件
+- 自定义 hooks:`useTable`、`useDict`、`useMessage`
+- 权限指令:`v-auth`
+- 支持字典绑定(select/radio/checkbox)、文件上传、富文本编辑器
+
+## config.json 结构
+
+config.json 定义两个模板组,每项包含:
+- `templateName`:模板显示名称
+- `generatorPath`:生成输出路径(使用 `${backendPath}`、`${packagePath}` 等变量)
+- `templateFile`:模板源文件相对路径
+
+修改或新增模板时,必须同步更新 config.json 中对应的映射关系。
+
+## 编辑模板注意事项
+
+- Velocity 指令(`#if`、`#foreach` 等)必须正确闭合 `#end`
+- `$field.xxx` 引用的属性必须是上下文变量中存在的字段属性
+- 注意 `isSpringBoot3` 条件分支:Spring Boot 2.x 和 3.x 的 import 路径不同(如 `javax.validation` vs `jakarta.validation`)
+- 主子表模板中 `childFieldList` 和 `fieldList` 是不同的列表,分别对应子表和主表字段
+- 文件名支持中文(如 `表格.vue`、`主子表单.vue`),这是项目约定,不要重命名

+ 2 - 2
multiple/主子表格.vue

@@ -89,7 +89,7 @@
             icon="Delete" 
             type="primary"
             v-auth="'${moduleName}_${functionName}_del'" 
-            @click="handleDelete(selectObjs)">
+            @click="handleDelete(selectObjs.value)">
             删除
           </el-button>
           <right-toolbar 
@@ -233,7 +233,7 @@ const resetQuery = () => {
 
 // 导出excel
 const exportExcel = () => {
-  downBlobFile('/${moduleName}/${functionName}/export', Object.assign(state.queryForm, { ids: selectObjs }), '${functionName}.xlsx');
+  downBlobFile('/${moduleName}/${functionName}/export', Object.assign(state.queryForm, { ids: selectObjs.value }), '${functionName}.xlsx');
 };
 
 // 多选事件

+ 2 - 2
single/表格.vue

@@ -105,7 +105,7 @@
             icon="Delete" 
             type="primary"
             v-auth="'${moduleName}_${functionName}_del'" 
-            @click="handleDelete(selectObjs)"
+            @click="handleDelete(selectObjs.value)"
           >
             删除
           </el-button>
@@ -270,7 +270,7 @@ const resetQuery = () => {
 const exportExcel = () => {
   downBlobFile(
     '/${moduleName}/${functionName}/export',
-    Object.assign(state.queryForm, { ids: selectObjs }),
+    Object.assign(state.queryForm, { ids: selectObjs.value }),
     '${functionName}.xlsx'
   );
 };