Commit 1aa9f87d authored by Junling Bu's avatar Junling Bu
Browse files

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

parent ba34d881
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 { ...@@ -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();
}
} }
...@@ -44,6 +44,7 @@ ...@@ -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 @@ ...@@ -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",
......
...@@ -39,3 +39,11 @@ export function deleteTopic(data) { ...@@ -39,3 +39,11 @@ export function deleteTopic(data) {
data data
}) })
} }
export function batchDeleteTopic(data) {
return request({
url: '/topic/batch-delete',
method: 'post',
data
})
}
...@@ -181,6 +181,12 @@ aside { ...@@ -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;
......
...@@ -3,18 +3,24 @@ ...@@ -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.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.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 v-loading="listLoading" :data="list" element-loading-text="正在查询中。。。" border fit highlight-current-row @selection-change="handleSelectionChange">
<el-table-column align="center" label="专题标题" prop="title"/> <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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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 { ...@@ -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 => {
......
...@@ -2,6 +2,7 @@ package org.linlinjava.litemall.db.service; ...@@ -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 { ...@@ -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);
}
} }
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment