diff --git a/controller/channel.go b/controller/channel.go index f57c4d7..4725bf0 100644 --- a/controller/channel.go +++ b/controller/channel.go @@ -151,6 +151,36 @@ func DeleteDisabledChannel(c *gin.Context) { return } +type ChannelBatch struct { + Ids []int `json:"ids"` +} + +func DeleteChannelBatch(c *gin.Context) { + channelBatch := ChannelBatch{} + err := c.ShouldBindJSON(&channelBatch) + if err != nil || len(channelBatch.Ids) == 0 { + c.JSON(http.StatusOK, gin.H{ + "success": false, + "message": "参数错误", + }) + return + } + err = model.BatchDeleteChannels(channelBatch.Ids) + if err != nil { + c.JSON(http.StatusOK, gin.H{ + "success": false, + "message": err.Error(), + }) + return + } + c.JSON(http.StatusOK, gin.H{ + "success": true, + "message": "", + "data": len(channelBatch.Ids), + }) + return +} + func UpdateChannel(c *gin.Context) { channel := model.Channel{} err := c.ShouldBindJSON(&channel) diff --git a/model/channel.go b/model/channel.go index ae69734..8b37f18 100644 --- a/model/channel.go +++ b/model/channel.go @@ -86,6 +86,25 @@ func BatchInsertChannels(channels []Channel) error { return nil } +func BatchDeleteChannels(ids []int) error { + //使用事务 删除channel表和channel_ability表 + tx := DB.Begin() + err := tx.Where("id in (?)", ids).Delete(&Channel{}).Error + if err != nil { + // 回滚事务 + tx.Rollback() + return err + } + err = tx.Where("channel_id in (?)", ids).Delete(&Ability{}).Error + if err != nil { + // 回滚事务 + tx.Rollback() + } + // 提交事务 + tx.Commit() + return err +} + func (channel *Channel) GetPriority() int64 { if channel.Priority == nil { return 0 diff --git a/router/api-router.go b/router/api-router.go index 038b750..b9f4602 100644 --- a/router/api-router.go +++ b/router/api-router.go @@ -83,6 +83,7 @@ func SetApiRouter(router *gin.Engine) { channelRoute.PUT("/", controller.UpdateChannel) channelRoute.DELETE("/disabled", controller.DeleteDisabledChannel) channelRoute.DELETE("/:id", controller.DeleteChannel) + channelRoute.POST("/batch", controller.DeleteChannelBatch) } tokenRoute := apiRouter.Group("/token") tokenRoute.Use(middleware.UserAuth()) diff --git a/web/src/components/ChannelsTable.js b/web/src/components/ChannelsTable.js index 02a78da..ec7640c 100644 --- a/web/src/components/ChannelsTable.js +++ b/web/src/components/ChannelsTable.js @@ -74,6 +74,11 @@ function renderBalance(type, balance) { const ChannelsTable = () => { const columns = [ + // { + // title: '', + // dataIndex: 'checkbox', + // className: 'checkbox', + // }, { title: 'ID', dataIndex: 'id', @@ -235,9 +240,11 @@ const ChannelsTable = () => { const [channelCount, setChannelCount] = useState(pageSize); const [groupOptions, setGroupOptions] = useState([]); const [showEdit, setShowEdit] = useState(false); + const [enableBatchDelete, setEnableBatchDelete] = useState(false); const [editingChannel, setEditingChannel] = useState({ id: undefined, }); + const [selectedChannels, setSelectedChannels] = useState([]); const removeRecord = id => { let newDataSource = [...channels]; @@ -484,6 +491,27 @@ const ChannelsTable = () => { setUpdatingBalance(false); }; + const batchDeleteChannels = async () => { + if (selectedChannels.length === 0) { + showError('请先选择要删除的通道!'); + return; + } + setLoading(true); + let ids = []; + selectedChannels.forEach((channel) => { + ids.push(channel.id); + }); + const res = await API.post(`/api/channel/batch`, {ids: ids}); + const {success, message, data} = res.data; + if (success) { + showSuccess(`已删除 ${data} 个通道!`); + await refresh(); + } else { + showError(message); + } + setLoading(false); + } + const sortChannel = (key) => { if (channels.length === 0) return; setLoading(true); @@ -557,6 +585,7 @@ const ChannelsTable = () => { } }; + return ( <> @@ -583,16 +612,18 @@ const ChannelsTable = () => {
- 使用ID排序 - { - localStorage.setItem('id-sort', v + '') - setIdSort(v) - loadChannels(0, pageSize, v) - .then() - .catch((reason) => { - showError(reason); - }) - }}> + + 使用ID排序 + { + localStorage.setItem('id-sort', v + '') + setIdSort(v) + loadChannels(0, pageSize, v) + .then() + .catch((reason) => { + showError(reason); + }) + }}> +
@@ -607,7 +638,15 @@ const ChannelsTable = () => { handlePageSizeChange(size).then() }, onPageChange: handlePageChange, - }} loading={loading} onRow={handleRow}/> + }} loading={loading} onRow={handleRow} rowSelection={ + enableBatchDelete ? + { + onChange: (selectedRowKeys, selectedRows) => { + // console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows); + setSelectedChannels(selectedRows); + }, + } : null + }/>
*/} +
+ + 开启批量删除 + { + setEnableBatchDelete(v) + }}> + + + + +
); };