Sfoglia il codice sorgente

feat: 代码生成新增批量删除接口

喵你个旺呀 1 anno fa
parent
commit
3a41737519

+ 12 - 1
Admin.NET/Admin.NET.Core/Service/CodeGen/SysCodeGenService.cs

@@ -623,6 +623,17 @@ public class SysCodeGenService : IDynamicApiController, ITransient
             OrderNo = menuOrder
         };
         menuOrder += 10;
+        
+        // 按钮-batchDelete
+        var menuTypeBatchDelete = new SysMenu
+        {
+            Pid = menuPid,
+            Title = "批量删除",
+            Type = MenuTypeEnum.Btn,
+            Permission = className[..1].ToLower() + className[1..] + ":batchDelete",
+            OrderNo = menuOrder
+        };
+        menuOrder += 10;
 
         // 按钮-print
         var menuTypePrint = new SysMenu
@@ -657,7 +668,7 @@ public class SysCodeGenService : IDynamicApiController, ITransient
         };
         menuOrder += 10;
 
-        var menuList = new List<SysMenu>() { menuTypePage, menuTypeDetail, menuTypeAdd, menuTypeStatus, menuTypeDelete, menuTypeUpdate, menuTypePrint, menuTypeImport, menuTypeExport };
+        var menuList = new List<SysMenu> { menuTypePage, menuTypeDetail, menuTypeAdd, menuTypeStatus, menuTypeDelete, menuTypeBatchDelete, menuTypeUpdate, menuTypePrint, menuTypeImport, menuTypeExport };
         // 加入fk、Upload、ApiTreeSelect 等接口的权限
         // 在生成表格时,有些字段只是查询时显示,不需要填写(WhetherAddUpdate),所以这些字段没必要生成相应接口
         var fkTableList = tableFieldList.Where(u => u.EffectType == "fk" && (u.WhetherAddUpdate == "Y" || u.QueryWhether == "Y")).ToList();

+ 19 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Input.cs.vm

@@ -102,6 +102,25 @@ if (Regex.IsMatch(@column.NetType, "(.*?Enum|int|long|double|float|bool)[?]?")){
 }
 }
 
+/// <summary>
+/// @(@Model.BusName)批量删除输入参数
+/// </summary>
+public class BatchDelete@(@Model.ClassName)Input
+{
+@foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")){
+    @:/// <summary>
+    @:/// @column.ColumnComment
+    @:/// </summary>
+    @:[Required(ErrorMessage = "@(@column.ColumnComment)列表不能为空")]
+if (Regex.IsMatch(@column.NetType, "(.*?Enum|int|long|double|float|bool)[?]?")){
+    @:public List<@column.NetType.TrimEnd('?')?> @(@column.PropertyName)List { get; set; }
+}else{
+    @:public List<@column.NetType> @(@column.PropertyName)List { get; set; }
+}
+    @:
+}
+}
+
 /// <summary>
 /// @(@Model.BusName)更新输入参数
 /// </summary>

+ 9 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Manage.js.vm

@@ -6,6 +6,7 @@ import request from '/@@/utils/request';
 enum Api {
   Add@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/add',
   Delete@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/delete',
+  BatchDelete@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/batchDelete',
   Update@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/update',
   Page@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/page',
   Detail@(@Model.ClassName) = '/api/@(@Model.LowerClassName)/detail',
@@ -42,6 +43,14 @@ export const delete@(@Model.ClassName) = (params?: any) =>
 			data: params,
 		});
 
+// 批量删除@(@Model.BusName)
+export const batchDelete@(@Model.ClassName) = (params?: any) =>
+	request({
+		url: Api.BatchDelete@(@Model.ClassName),
+		method: 'post',
+		data: params,
+	});
+
 // 编辑@(@Model.BusName)
 export const update@(@Model.ClassName) = (params?: any) => 
 	request({

+ 17 - 0
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/Service.cs.vm

@@ -157,6 +157,23 @@ if (@column.QueryWhether == "Y"){
         //await _@(@Model.LowerClassName)Rep.DeleteAsync(entity);   //真删除
     }
 
+    /// <summary>
+    /// 批量删除@(@Model.BusName)
+    /// </summary>
+    /// <param name="input"></param>
+    /// <returns></returns>
+    [HttpPost]
+    [ApiDescriptionSettings(Name = "BatchDelete")]
+    [DisplayName("批量删除@(@Model.BusName)")]
+    public async Task<int> BatchDelete(BatchDelete@(@Model.ClassName)Input input)
+    {
+@foreach (var column in Model.TableField.Where(u => u.ColumnKey == "True")){
+        @:var list = await _@(@Model.LowerClassName)Rep.Where(u => input.@(@column.PropertyName)List.Contains(u.@(@column.PropertyName))).ToListAsync() ?? throw Oops.Oh(ErrorCodeEnum.D1002);
+}
+        return await _@(@Model.LowerClassName)Rep.FakeDeleteAsync(list);   //假删除
+        //return await _@(@Model.LowerClassName)Rep.DeleteAsync(list);   //真删除
+    }
+
     /// <summary>
     /// 更新@(@Model.BusName)
     /// </summary>

+ 20 - 2
Admin.NET/Admin.NET.Web.Entry/wwwroot/template/index.vue.vm

@@ -82,6 +82,7 @@
                 @:<el-button icon="ele-ZoomOut" @@click="changeAdvanceQueryUI" v-if="showAdvanceQueryUI" style="margin-left:5px;"> 隐藏 </el-button>
                 }
                 }
+                <el-button type="danger" style="margin-left:5px;" icon="ele-Delete" @@click="batchDel@(@Model.ClassName)" :disabled="selectData.length == 0" v-auth="'@(@Model.LowerClassName):batchDelete'"> 删除 </el-button>
                 <el-button type="primary" style="margin-left:5px;" icon="ele-Plus" @@click="openAdd@(@Model.ClassName)" v-auth="'@(@Model.LowerClassName):add'"> 新增 </el-button>
                 @if (hasImport) {
                 @:<el-button type="warning" icon="ele-MostlyCloudy" @@click="importDataRef.openDialog()" v-auth="'@(@Model.LowerClassName):import'"> 导入 </el-button>
@@ -102,7 +103,8 @@
       </el-form>
     </el-card>
     <el-card class="full-table" shadow="hover" style="margin-top: 5px">
-      <el-table :data="tableData" style="width: 100%" v-loading="loading" tooltip-effect="light" @(@pkFieldName != null ? $"row-key=\"{@pkFieldName}\"" : "") @@sort-change="sortChange" border="">
+      <el-table :data="tableData" @@selection-change="(val: any[]) => { selectData = val; }" style="width: 100%" v-loading="loading" tooltip-effect="light" @(@pkFieldName != null ? $"row-key=\"{@pkFieldName}\"" : "") @@sort-change="sortChange" border="">
+        <el-table-column type="selection" width="40" align="center" v-auth="'@(@Model.LowerClassName):batchDelete'" />
         <el-table-column type="index" label="序号" width="55" align="center"/>
         @foreach (var column in Model.TableField.Where(u => u.WhetherTable == "Y")){
         if(@column.EffectType == "Upload"||@column.EffectType == "fk"||@column.EffectType == "ApiTreeSelect"||@column.EffectType == "Switch"||@column.EffectType == "ConstSelector"){
@@ -223,7 +225,7 @@
   }
   import editDialog from '/@@/views/@(@Model.PagePath)/@(@Model.LowerClassName)/component/editDialog.vue'
   import printDialog from '/@@/views/system/print/component/hiprint/preview.vue'
-  import { page@(@Model.ClassName), delete@(@Model.ClassName) @(hasImport ? $", download{@Model.ClassName}Template, import{@Model.ClassName}Data" : "")@(hasSetStatus ? $", set{@Model.ClassName}Status" : "") } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)';
+  import { page@(@Model.ClassName), delete@(@Model.ClassName), batchDelete@(@Model.ClassName) @(hasImport ? $", download{@Model.ClassName}Template, import{@Model.ClassName}Data" : "")@(hasSetStatus ? $", set{@Model.ClassName}Status" : "") } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)';
   @foreach (var column in Model.QueryWhetherList.Where(u => u.EffectType == "fk")) {
   @:import { get@(@column.FkEntityName)@(@column.PropertyName)Dropdown } from '/@@/api/@(@Model.PagePath)/@(@Model.LowerClassName)';
   }
@@ -236,6 +238,7 @@
   }
   const loading = ref(false);
   const tableData = ref<any>([]);
+  const selectData = ref<any>([]);
   const queryParams = ref<any>({});
   const tableParams = ref({
     page: 1,
@@ -324,6 +327,21 @@
   .catch(() => {});
   };
 
+  // 批量删除
+  const batchDel@(@Model.ClassName) = () => {
+    ElMessageBox.confirm(`确定要删除${selectData.length}条记录吗?`, "提示", {
+      confirmButtonText: "确定",
+      cancelButtonText: "取消",
+      type: "warning",
+    }).then(async () => {
+      @foreach (var column in @Model.TableField.Where(u => u.ColumnKey == "True")) {
+      @:const count = await batchDelete@(@Model.ClassName)({ @(@column.LowerPropertyName)List: selectData.map(u => u.@(@column.LowerPropertyName)) });
+      }
+      handleQuery();
+      ElMessage.success(`成功批量删除${count}条记录`);
+    }).catch(() => {});
+  };
+
   // 改变页面容量
   const handleSizeChange = (val: number) => {
     tableParams.value.pageSize = val;