This commit is contained in:
25
src/api/system/ipBlack.js
Normal file
25
src/api/system/ipBlack.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function getList(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/ip/list',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doAdd(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/ip',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doRemove(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/ip/remove',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
25
src/api/system/userBlack.js
Normal file
25
src/api/system/userBlack.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
export function getList(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/user/list',
|
||||||
|
method: 'get',
|
||||||
|
params: data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doAdd(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/user',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function doRemove(data) {
|
||||||
|
return request({
|
||||||
|
url: 'management/api/system/blacklist/user/remove',
|
||||||
|
method: 'post',
|
||||||
|
data,
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -378,6 +378,18 @@ export const asyncRoutes = [
|
|||||||
component: () => import('@/views/personnelManagement/suspiciousRequest/index'),
|
component: () => import('@/views/personnelManagement/suspiciousRequest/index'),
|
||||||
meta: { title: '异常请求' },
|
meta: { title: '异常请求' },
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'ipBlacklist',
|
||||||
|
name: 'IPBlacklist',
|
||||||
|
component: () => import('@/views/systemManagement/ipBlack/index'),
|
||||||
|
meta: { title: 'IP 黑名单' },
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: 'userBlacklist',
|
||||||
|
name: 'UserBlacklist',
|
||||||
|
component: () => import('@/views/systemManagement/userBlack/index'),
|
||||||
|
meta: { title: '用户 黑名单' },
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'uploadedFileManagement',
|
path: 'uploadedFileManagement',
|
||||||
name: 'UploadedFileManagement',
|
name: 'UploadedFileManagement',
|
||||||
|
|||||||
@@ -32,9 +32,12 @@
|
|||||||
</vab-query-form>
|
</vab-query-form>
|
||||||
|
|
||||||
<el-table v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText">
|
<el-table v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText">
|
||||||
|
<el-table-column align="center" label="IP" prop="ip" show-overflow-tooltip />
|
||||||
|
<el-table-column align="center" label="地址" prop="address" show-overflow-tooltip />
|
||||||
|
|
||||||
<el-table-column align="center" label="用户" show-overflow-tooltip>
|
<el-table-column align="center" label="用户" show-overflow-tooltip>
|
||||||
<template slot-scope="{ row }">
|
<template slot-scope="{ row }">
|
||||||
{{ row.userName || row.userId }}
|
{{ row.userId }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="应用" show-overflow-tooltip>
|
<el-table-column align="center" label="应用" show-overflow-tooltip>
|
||||||
@@ -42,7 +45,6 @@
|
|||||||
{{ row.appName || row.appId }}
|
{{ row.appName || row.appId }}
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column align="center" label="IP" prop="ip" show-overflow-tooltip />
|
|
||||||
<el-table-column align="center" label="路径" prop="path" show-overflow-tooltip />
|
<el-table-column align="center" label="路径" prop="path" show-overflow-tooltip />
|
||||||
<el-table-column align="center" label="原因" prop="reason" show-overflow-tooltip />
|
<el-table-column align="center" label="原因" prop="reason" show-overflow-tooltip />
|
||||||
<el-table-column align="center" label="UserAgent" prop="userAgent" show-overflow-tooltip />
|
<el-table-column align="center" label="UserAgent" prop="userAgent" show-overflow-tooltip />
|
||||||
|
|||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px" @close="close">
|
||||||
|
<el-form ref="form" label-width="80px" :model="form" :rules="rules">
|
||||||
|
<el-form-item label="IP地址" prop="ip">
|
||||||
|
<el-input v-model.trim="form.ip" autocomplete="off" placeholder="请输入需要拉黑的IP地址" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="close">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="save">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { doAdd } from '@/api/system/ipBlack'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'IPBlacklistEdit',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: {
|
||||||
|
ip: '',
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
ip: [{ required: true, trigger: 'blur', message: '请输入IP地址' }],
|
||||||
|
},
|
||||||
|
title: '新增',
|
||||||
|
dialogFormVisible: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
showEdit() {
|
||||||
|
this.title = '新增'
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
this.dialogFormVisible = true
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
this.$refs['form'].resetFields()
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
this.dialogFormVisible = false
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
this.$refs['form'].validate(async (valid) => {
|
||||||
|
if (valid) {
|
||||||
|
try {
|
||||||
|
const { msg } = await doAdd(this.form)
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.$refs['form'].resetFields()
|
||||||
|
this.dialogFormVisible = false
|
||||||
|
this.$emit('fetch-data')
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
130
src/views/systemManagement/ipBlack/index.vue
Normal file
130
src/views/systemManagement/ipBlack/index.vue
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<template>
|
||||||
|
<div class="ip-blacklist-container">
|
||||||
|
<vab-query-form>
|
||||||
|
<vab-query-form-left-panel :span="12">
|
||||||
|
<el-button icon="el-icon-plus" type="primary" @click="handleAdd">新增</el-button>
|
||||||
|
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">移除选中</el-button>
|
||||||
|
</vab-query-form-left-panel>
|
||||||
|
<vab-query-form-right-panel :span="12">
|
||||||
|
<el-form :inline="true" :model="queryForm" @submit.native.prevent>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model.trim="queryForm.ip" clearable placeholder="请输入查询的IP" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</vab-query-form-right-panel>
|
||||||
|
</vab-query-form>
|
||||||
|
|
||||||
|
<el-table v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText" @selection-change="setSelectRows">
|
||||||
|
<el-table-column align="center" show-overflow-tooltip type="selection" width="55" />
|
||||||
|
<el-table-column align="center" label="IP" prop="ip" show-overflow-tooltip />
|
||||||
|
<el-table-column align="center" label="地址" prop="address" show-overflow-tooltip />
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="200">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="text" @click="handleDelete(row)">移除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<el-pagination
|
||||||
|
background
|
||||||
|
:current-page="queryForm.pageNo"
|
||||||
|
:layout="layout"
|
||||||
|
:page-size="queryForm.pageSize"
|
||||||
|
:total="total"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<edit ref="edit" @fetch-data="fetchData" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getList, doRemove } from '@/api/system/ipBlack'
|
||||||
|
import Edit from './components/IPBlacklistEdit'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'IPBlacklist',
|
||||||
|
components: { Edit },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: [],
|
||||||
|
listLoading: true,
|
||||||
|
layout: 'total, sizes, prev, pager, next, jumper',
|
||||||
|
total: 0,
|
||||||
|
selectRows: [],
|
||||||
|
elementLoadingText: '正在加载...',
|
||||||
|
queryForm: {
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
ip: '',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setSelectRows(val) {
|
||||||
|
this.selectRows = val
|
||||||
|
},
|
||||||
|
handleAdd() {
|
||||||
|
this.$refs['edit'].showEdit()
|
||||||
|
},
|
||||||
|
handleDelete(row) {
|
||||||
|
if (row.ip) {
|
||||||
|
this.$baseConfirm('你确定要将当前IP从黑名单中移除吗?', null, async () => {
|
||||||
|
const { msg } = await doRemove({ ips: [row.ip] })
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.fetchData()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
if (this.selectRows.length > 0) {
|
||||||
|
const ips = this.selectRows.map((item) => item.ip)
|
||||||
|
this.$baseConfirm('你确定要将选中的IP从黑名单中移除吗?', null, async () => {
|
||||||
|
const { msg } = await doRemove({ ips })
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.fetchData()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$baseMessage('未选中任何行', 'error')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleSizeChange(val) {
|
||||||
|
this.queryForm.pageSize = val
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
handleCurrentChange(val) {
|
||||||
|
this.queryForm.pageNo = val
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
queryData() {
|
||||||
|
this.queryForm.pageNo = 1
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
async fetchData() {
|
||||||
|
this.listLoading = true
|
||||||
|
try {
|
||||||
|
const { data } = await getList(this.queryForm)
|
||||||
|
this.list = data.list
|
||||||
|
this.total = data.totalCount
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
} finally {
|
||||||
|
this.listLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.ip-blacklist-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<template>
|
||||||
|
<el-dialog :title="title" :visible.sync="dialogFormVisible" width="500px" @close="close">
|
||||||
|
<el-form ref="form" label-width="80px" :model="form" :rules="rules">
|
||||||
|
<el-form-item label="用户ID" prop="userId">
|
||||||
|
<el-input v-model.trim="form.userId" autocomplete="off" placeholder="请输入需要拉黑的用户ID" />
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<div slot="footer" class="dialog-footer">
|
||||||
|
<el-button @click="close">取 消</el-button>
|
||||||
|
<el-button type="primary" @click="save">确 定</el-button>
|
||||||
|
</div>
|
||||||
|
</el-dialog>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { doAdd } from '@/api/system/userBlack'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'UserBlacklistEdit',
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
form: {
|
||||||
|
userId: '',
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
userId: [{ required: true, trigger: 'blur', message: '请输入用户ID' }],
|
||||||
|
},
|
||||||
|
title: '新增',
|
||||||
|
dialogFormVisible: false,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
showEdit() {
|
||||||
|
this.title = '新增'
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
this.dialogFormVisible = true
|
||||||
|
},
|
||||||
|
close() {
|
||||||
|
this.$refs['form'].resetFields()
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
this.dialogFormVisible = false
|
||||||
|
},
|
||||||
|
save() {
|
||||||
|
this.$refs['form'].validate(async (valid) => {
|
||||||
|
if (valid) {
|
||||||
|
try {
|
||||||
|
const { msg } = await doAdd(this.form)
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.$refs['form'].resetFields()
|
||||||
|
this.dialogFormVisible = false
|
||||||
|
this.$emit('fetch-data')
|
||||||
|
this.form = this.$options.data().form
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
})
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
129
src/views/systemManagement/userBlack/index.vue
Normal file
129
src/views/systemManagement/userBlack/index.vue
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
<template>
|
||||||
|
<div class="user-blacklist-container">
|
||||||
|
<vab-query-form>
|
||||||
|
<vab-query-form-left-panel :span="12">
|
||||||
|
<el-button icon="el-icon-plus" type="primary" @click="handleAdd">新增</el-button>
|
||||||
|
<el-button icon="el-icon-delete" type="danger" @click="handleDelete">移除选中</el-button>
|
||||||
|
</vab-query-form-left-panel>
|
||||||
|
<vab-query-form-right-panel :span="12">
|
||||||
|
<el-form :inline="true" :model="queryForm" @submit.native.prevent>
|
||||||
|
<el-form-item>
|
||||||
|
<el-input v-model.trim="queryForm.userId" clearable placeholder="请输入查询的用户ID" />
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</vab-query-form-right-panel>
|
||||||
|
</vab-query-form>
|
||||||
|
|
||||||
|
<el-table v-loading="listLoading" :data="list" :element-loading-text="elementLoadingText" @selection-change="setSelectRows">
|
||||||
|
<el-table-column align="center" show-overflow-tooltip type="selection" width="55" />
|
||||||
|
<el-table-column align="center" label="用户ID" prop="userId" show-overflow-tooltip />
|
||||||
|
<el-table-column align="center" fixed="right" label="操作" show-overflow-tooltip width="200">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-button type="text" @click="handleDelete(row)">移除</el-button>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<el-pagination
|
||||||
|
background
|
||||||
|
:current-page="queryForm.pageNo"
|
||||||
|
:layout="layout"
|
||||||
|
:page-size="queryForm.pageSize"
|
||||||
|
:total="total"
|
||||||
|
@current-change="handleCurrentChange"
|
||||||
|
@size-change="handleSizeChange"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<edit ref="edit" @fetch-data="fetchData" />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getList, doRemove } from '@/api/system/userBlack'
|
||||||
|
import Edit from './components/UserBlacklistEdit'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: 'UserBlacklist',
|
||||||
|
components: { Edit },
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: [],
|
||||||
|
listLoading: true,
|
||||||
|
layout: 'total, sizes, prev, pager, next, jumper',
|
||||||
|
total: 0,
|
||||||
|
selectRows: [],
|
||||||
|
elementLoadingText: '正在加载...',
|
||||||
|
queryForm: {
|
||||||
|
pageNo: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
userId: '',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
setSelectRows(val) {
|
||||||
|
this.selectRows = val
|
||||||
|
},
|
||||||
|
handleAdd() {
|
||||||
|
this.$refs['edit'].showEdit()
|
||||||
|
},
|
||||||
|
handleDelete(row) {
|
||||||
|
if (row.userId) {
|
||||||
|
this.$baseConfirm('你确定要将当前用户从黑名单中移除吗?', null, async () => {
|
||||||
|
const { msg } = await doRemove({ userIds: [row.userId] })
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.fetchData()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
if (this.selectRows.length > 0) {
|
||||||
|
const userIds = this.selectRows.map((item) => item.userId)
|
||||||
|
this.$baseConfirm('你确定要将选中的用户从黑名单中移除吗?', null, async () => {
|
||||||
|
const { msg } = await doRemove({ userIds })
|
||||||
|
this.$baseMessage(msg, 'success')
|
||||||
|
this.fetchData()
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
this.$baseMessage('未选中任何行', 'error')
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handleSizeChange(val) {
|
||||||
|
this.queryForm.pageSize = val
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
handleCurrentChange(val) {
|
||||||
|
this.queryForm.pageNo = val
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
queryData() {
|
||||||
|
this.queryForm.pageNo = 1
|
||||||
|
this.fetchData()
|
||||||
|
},
|
||||||
|
async fetchData() {
|
||||||
|
this.listLoading = true
|
||||||
|
try {
|
||||||
|
const { data } = await getList(this.queryForm)
|
||||||
|
this.list = data.list
|
||||||
|
this.total = data.totalCount
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
} finally {
|
||||||
|
this.listLoading = false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.user-blacklist-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Reference in New Issue
Block a user