ソースを参照

feat[litemall-admin, litemall-admin-api]: 专题支持批量删除

Junling Bu 6 年 前
コミット
1aa9f87d7d

+ 10 - 0
litemall-admin-api/src/main/java/org/linlinjava/litemall/admin/web/AdminTopicController.java

@@ -1,9 +1,11 @@
 package org.linlinjava.litemall.admin.web;
 package org.linlinjava.litemall.admin.web;
 
 
+import io.swagger.models.auth.In;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.commons.logging.LogFactory;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc;
 import org.linlinjava.litemall.admin.annotation.RequiresPermissionsDesc;
+import org.linlinjava.litemall.core.util.JacksonUtil;
 import org.linlinjava.litemall.core.util.ResponseUtil;
 import org.linlinjava.litemall.core.util.ResponseUtil;
 import org.linlinjava.litemall.core.validator.Order;
 import org.linlinjava.litemall.core.validator.Order;
 import org.linlinjava.litemall.core.validator.Sort;
 import org.linlinjava.litemall.core.validator.Sort;
@@ -114,4 +116,12 @@ public class AdminTopicController {
         return ResponseUtil.ok();
         return ResponseUtil.ok();
     }
     }
 
 
+    @RequiresPermissions("admin:topic:batch-delete")
+    @RequiresPermissionsDesc(menu = {"推广管理", "专题管理"}, button = "批量删除")
+    @PostMapping("/batch-delete")
+    public Object batchDelete(@RequestBody String body) {
+        List<Integer> ids = JacksonUtil.parseIntegerList(body, "ids");
+        topicService.deleteByIds(ids);
+        return ResponseUtil.ok();
+    }
 }
 }

+ 1 - 2
litemall-admin/package.json

@@ -44,6 +44,7 @@
   },
   },
   "dependencies": {
   "dependencies": {
     "@tinymce/tinymce-vue": "3.0.1",
     "@tinymce/tinymce-vue": "3.0.1",
+    "lodash": "^4.17.11",
     "v-charts": "1.19.0",
     "v-charts": "1.19.0",
     "axios": "0.18.1",
     "axios": "0.18.1",
     "clipboard": "2.0.4",
     "clipboard": "2.0.4",
@@ -83,9 +84,7 @@
     "html-webpack-plugin": "3.2.0",
     "html-webpack-plugin": "3.2.0",
     "husky": "1.3.1",
     "husky": "1.3.1",
     "lint-staged": "8.1.5",
     "lint-staged": "8.1.5",
-    "mockjs": "1.0.1-beta3",
     "node-sass": "^4.9.0",
     "node-sass": "^4.9.0",
-    "plop": "2.3.0",
     "runjs": "^4.3.2",
     "runjs": "^4.3.2",
     "sass-loader": "^7.1.0",
     "sass-loader": "^7.1.0",
     "script-ext-html-webpack-plugin": "2.1.3",
     "script-ext-html-webpack-plugin": "2.1.3",

+ 8 - 0
litemall-admin/src/api/topic.js

@@ -39,3 +39,11 @@ export function deleteTopic(data) {
     data
     data
   })
   })
 }
 }
+
+export function batchDeleteTopic(data) {
+  return request({
+    url: '/topic/batch-delete',
+    method: 'post',
+    data
+  })
+}

+ 6 - 0
litemall-admin/src/styles/index.scss

@@ -181,6 +181,12 @@ aside {
   }
   }
 }
 }
 
 
+.operator-container {
+  padding-bottom: 10px;
+  display: flex;
+  justify-content: flex-end;
+}
+
 //refine vue-multiselect plugin
 //refine vue-multiselect plugin
 .multiselect {
 .multiselect {
   line-height: 16px;
   line-height: 16px;

+ 44 - 9
litemall-admin/src/views/promotion/topic.vue

@@ -3,18 +3,24 @@
 
 
     <!-- 查询和其他操作 -->
     <!-- 查询和其他操作 -->
     <div class="filter-container">
     <div class="filter-container">
-      <el-input v-model="listQuery.title" clearable class="filter-item" style="width: 200px;" placeholder="请输入专题标题"/>
-      <el-input v-model="listQuery.subtitle" clearable class="filter-item" style="width: 200px;" placeholder="请输入专题子标题"/>
+      <el-input v-model="listQuery.title" clearable class="filter-item" style="width: 200px;" placeholder="请输入专题标题" />
+      <el-input v-model="listQuery.subtitle" clearable class="filter-item" style="width: 200px;" placeholder="请输入专题子标题" />
       <el-button v-permission="['GET /admin/topic/list']" class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">查找</el-button>
       <el-button v-permission="['GET /admin/topic/list']" class="filter-item" type="primary" icon="el-icon-search" @click="handleFilter">查找</el-button>
       <el-button v-permission="['POST /admin/topic/create']" class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加</el-button>
       <el-button v-permission="['POST /admin/topic/create']" class="filter-item" type="primary" icon="el-icon-edit" @click="handleCreate">添加</el-button>
       <el-button :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">导出</el-button>
       <el-button :loading="downloadLoading" class="filter-item" type="primary" icon="el-icon-download" @click="handleDownload">导出</el-button>
     </div>
     </div>
 
 
+    <div class="operator-container">
+      <el-button v-permission="['GET /admin/topic/list']" class="filter-item" type="danger" icon="el-icon-delete" @click="handleBatchDelete">批量删除</el-button>
+    </div>
+
     <!-- 查询结果 -->
     <!-- 查询结果 -->
-    <el-table v-loading="listLoading" :data="list" element-loading-text="正在查询中。。。" border fit highlight-current-row>
-      <el-table-column align="center" label="专题标题" prop="title"/>
+    <el-table v-loading="listLoading" :data="list" element-loading-text="正在查询中。。。" border fit highlight-current-row @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" />
+
+      <el-table-column align="center" label="专题标题" prop="title" />
 
 
-      <el-table-column align="center" label="专题子标题" min-width="200" prop="subtitle"/>
+      <el-table-column align="center" label="专题子标题" min-width="200" prop="subtitle" />
 
 
       <el-table-column align="center" property="picUrl" label="图片">
       <el-table-column align="center" property="picUrl" label="图片">
         <template slot-scope="scope">
         <template slot-scope="scope">
@@ -25,15 +31,15 @@
       <el-table-column align="center" label="专题详情" prop="content">
       <el-table-column align="center" label="专题详情" prop="content">
         <template slot-scope="scope">
         <template slot-scope="scope">
           <el-dialog :visible.sync="contentDialogVisible" title="专题详情">
           <el-dialog :visible.sync="contentDialogVisible" title="专题详情">
-            <div v-html="contentDetail"/>
+            <div v-html="contentDetail" />
           </el-dialog>
           </el-dialog>
           <el-button type="primary" size="mini" @click="showContent(scope.row.content)">查看</el-button>
           <el-button type="primary" size="mini" @click="showContent(scope.row.content)">查看</el-button>
         </template>
         </template>
       </el-table-column>
       </el-table-column>
 
 
-      <el-table-column align="center" label="底价" prop="price"/>
+      <el-table-column align="center" label="底价" prop="price" />
 
 
-      <el-table-column align="center" label="阅读数量" prop="readCount"/>
+      <el-table-column align="center" label="阅读数量" prop="readCount" />
 
 
       <el-table-column align="center" label="操作" min-width="100" class-name="small-padding fixed-width">
       <el-table-column align="center" label="操作" min-width="100" class-name="small-padding fixed-width">
         <template slot-scope="scope">
         <template slot-scope="scope">
@@ -82,9 +88,10 @@
 </style>
 </style>
 
 
 <script>
 <script>
-import { listTopic, deleteTopic } from '@/api/topic'
+import { listTopic, deleteTopic, batchDeleteTopic } from '@/api/topic'
 import BackToTop from '@/components/BackToTop'
 import BackToTop from '@/components/BackToTop'
 import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
 import Pagination from '@/components/Pagination' // Secondary package based on el-pagination
+import _ from 'lodash'
 
 
 export default {
 export default {
   name: 'Topic',
   name: 'Topic',
@@ -102,6 +109,7 @@ export default {
         sort: 'add_time',
         sort: 'add_time',
         order: 'desc'
         order: 'desc'
       },
       },
+      multipleSelection: [],
       contentDetail: '',
       contentDetail: '',
       contentDialogVisible: false,
       contentDialogVisible: false,
       downloadLoading: false
       downloadLoading: false
@@ -152,10 +160,37 @@ export default {
           })
           })
         })
         })
     },
     },
+    handleSelectionChange(val) {
+      this.multipleSelection = val
+    },
     showContent(content) {
     showContent(content) {
       this.contentDetail = content
       this.contentDetail = content
       this.contentDialogVisible = true
       this.contentDialogVisible = true
     },
     },
+    handleBatchDelete() {
+      if (this.multipleSelection.length === 0) {
+        this.$message.error('请选择至少一条记录')
+        return
+      }
+      const ids = []
+      _.forEach(this.multipleSelection, function(item) {
+        ids.push(item.id)
+      })
+      batchDeleteTopic({ ids: ids })
+        .then(response => {
+          this.$notify.success({
+            title: '成功',
+            message: '批量删除专题成功'
+          })
+          this.getList()
+        })
+        .catch(response => {
+          this.$notify.error({
+            title: '失败',
+            message: response.data.errmsg
+          })
+        })
+    },
     handleDownload() {
     handleDownload() {
       this.downloadLoading = true
       this.downloadLoading = true
       import('@/vendor/Export2Excel').then(excel => {
       import('@/vendor/Export2Excel').then(excel => {

+ 9 - 0
litemall-db/src/main/java/org/linlinjava/litemall/db/service/LitemallTopicService.java

@@ -2,6 +2,7 @@ package org.linlinjava.litemall.db.service;
 
 
 import com.github.pagehelper.PageHelper;
 import com.github.pagehelper.PageHelper;
 import org.linlinjava.litemall.db.dao.LitemallTopicMapper;
 import org.linlinjava.litemall.db.dao.LitemallTopicMapper;
+import org.linlinjava.litemall.db.domain.LitemallGroupon;
 import org.linlinjava.litemall.db.domain.LitemallTopic;
 import org.linlinjava.litemall.db.domain.LitemallTopic;
 import org.linlinjava.litemall.db.domain.LitemallTopic.Column;
 import org.linlinjava.litemall.db.domain.LitemallTopic.Column;
 import org.linlinjava.litemall.db.domain.LitemallTopicExample;
 import org.linlinjava.litemall.db.domain.LitemallTopicExample;
@@ -100,4 +101,12 @@ public class LitemallTopicService {
     }
     }
 
 
 
 
+    public void deleteByIds(List<Integer> ids) {
+        LitemallTopicExample example = new LitemallTopicExample();
+        example.or().andIdIn(ids).andDeletedEqualTo(false);
+        LitemallTopic topic = new LitemallTopic();
+        topic.setUpdateTime(LocalDateTime.now());
+        topic.setDeleted(true);
+        topicMapper.updateByExampleSelective(topic, example);
+    }
 }
 }