mirror of
https://github.com/jeecgboot/JeecgBoot.git
synced 2025-12-08 17:12:28 +08:00
272 lines
6.7 KiB
Vue
272 lines
6.7 KiB
Vue
<template>
|
|
<a-spin :spinning="confirmLoading">
|
|
<a-row :span="24" style="margin-bottom: 10px">
|
|
<a-col :span="12" v-for="item in apiList" @click="handleSelect(item)">
|
|
<a-card :style="item.checked ? { border: '1px solid #3370ff' } : {}" hoverable class="checkbox-card" :body-style="{ width: '100%', padding: '10px' }">
|
|
<div class="checkbox-name" style="display: flex; width: 100%; justify-content: space-between">
|
|
<span>接口名称: {{ item.name }}</span>
|
|
<a-checkbox v-model:checked="item.checked" @click.stop class="quantum-checker" @change="(e) => handleChange(e, item)"> </a-checkbox>
|
|
</div>
|
|
<div class="checkbox-name" style="margin-top: 4px">
|
|
请求方式: <span>{{item.requestMethod}}</span>
|
|
</div>
|
|
</a-card>
|
|
</a-col>
|
|
</a-row>
|
|
<Pagination
|
|
v-if="apiList.length > 0"
|
|
:current="pageNo"
|
|
:page-size="pageSize"
|
|
:page-size-options="pageSizeOptions"
|
|
:total="total"
|
|
:showQuickJumper="true"
|
|
:showSizeChanger="true"
|
|
@change="handlePageChange"
|
|
class="list-footer"
|
|
size="small"
|
|
/>
|
|
</a-spin>
|
|
</template>
|
|
|
|
<script lang="ts" setup>
|
|
import { computed, defineExpose, defineProps, nextTick, reactive, ref } from "vue";
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|
import { getApiList, getPermissionList, permissionAddFunction } from '../OpenApiAuth.api';
|
|
import { Form, Pagination } from 'ant-design-vue';
|
|
|
|
const props = defineProps({
|
|
formDisabled: { type: Boolean, default: false },
|
|
formData: { type: Object, default: () => ({}) },
|
|
formBpm: { type: Boolean, default: true },
|
|
});
|
|
const useForm = Form.useForm;
|
|
const emit = defineEmits(['register', 'ok']);
|
|
const { createMessage } = useMessage();
|
|
const confirmLoading = ref<boolean>(false);
|
|
//认证ID
|
|
const apiAuthId = ref<string>('');
|
|
//表单验证
|
|
const validatorRules = reactive({});
|
|
//api列表
|
|
const apiList = ref<any>([]);
|
|
//选中的值
|
|
const selectedRowKeys = ref<any>([]);
|
|
//选中的数据
|
|
const selectedRows = ref<any>([]);
|
|
//当前页数
|
|
const pageNo = ref<number>(1);
|
|
//每页条数
|
|
const pageSize = ref<number>(10);
|
|
//总条数
|
|
const total = ref<number>(0);
|
|
//可选择的页数
|
|
const pageSizeOptions = ref<any>(['10', '20', '30']);
|
|
|
|
// 表单禁用
|
|
const disabled = computed(() => {
|
|
if (props.formBpm === true) {
|
|
if (props.formData.disabled === false) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
return props.formDisabled;
|
|
});
|
|
|
|
/**
|
|
* 加载数据
|
|
*/
|
|
function reload() {
|
|
getApiList({ pageNo: pageNo.value, pageSize: pageSize.value, column: 'createTime', order: 'desc'}).then((res)=>{
|
|
if (res.success) {
|
|
for (const item of res.result.records) {
|
|
item.checked = false;
|
|
}
|
|
apiList.value = res.result.records;
|
|
total.value = res.result.total;
|
|
setChecked();
|
|
} else {
|
|
apiList.value = [];
|
|
total.value = 0;
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 新增
|
|
*/
|
|
function add() {
|
|
edit({});
|
|
}
|
|
|
|
/**
|
|
* 编辑
|
|
*/
|
|
async function edit(record) {
|
|
selectedRowKeys.value = [];
|
|
selectedRows.value = [];
|
|
pageNo.value = 1;
|
|
pageSize.value = 10;
|
|
apiAuthId.value = record.id;
|
|
await nextTick(() => {
|
|
// 获取当前已授权的项目
|
|
getPermissionList({ apiAuthId: record.id }).then((res) => {
|
|
if (res.length > 0) {
|
|
res.forEach((item) => {
|
|
if(item.ifCheckBox == "1"){
|
|
selectedRowKeys.value.push(item.id);
|
|
selectedRows.value.push(item);
|
|
}
|
|
});
|
|
//设置选中
|
|
setChecked();
|
|
}
|
|
});
|
|
reload();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 提交数据
|
|
*/
|
|
async function submitForm() {
|
|
confirmLoading.value = true;
|
|
//时间格式化
|
|
let model = {};
|
|
let apiId = ""
|
|
selectedRowKeys.value.forEach((item) => {
|
|
apiId += item +",";
|
|
})
|
|
model['apiId'] = apiId;
|
|
model['apiAuthId'] = apiAuthId.value;
|
|
await permissionAddFunction(model)
|
|
.then((res) => {
|
|
if (res.success) {
|
|
createMessage.success(res.message);
|
|
emit('ok');
|
|
cleanData()
|
|
} else {
|
|
createMessage.warning(res.message);
|
|
}
|
|
})
|
|
.finally(() => {
|
|
confirmLoading.value = false;
|
|
});
|
|
}
|
|
const cleanData = () => {
|
|
selectedRows.value = []
|
|
selectedRowKeys.value = []
|
|
};
|
|
|
|
/**
|
|
* 复选框选中事件
|
|
* @param item
|
|
*/
|
|
function handleSelect(item) {
|
|
let id = item.id;
|
|
const target = apiList.value.find((item) => item.id === id);
|
|
if (target) {
|
|
target.checked = !target.checked;
|
|
}
|
|
//存放选中的知识库的id
|
|
if (!selectedRowKeys.value || selectedRowKeys.value.length == 0) {
|
|
selectedRowKeys.value.push(id);
|
|
selectedRows.value.push(item);
|
|
return;
|
|
}
|
|
let findIndex = selectedRowKeys.value.findIndex((item) => item === id);
|
|
if (findIndex === -1) {
|
|
selectedRowKeys.value.push(id);
|
|
selectedRows.value.push(item);
|
|
} else {
|
|
selectedRowKeys.value.splice(findIndex, 1);
|
|
selectedRows.value.splice(findIndex, 1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 复选框选中事件
|
|
*
|
|
* @param e
|
|
* @param item
|
|
*/
|
|
function handleChange(e, item: any) {
|
|
if (e.target.checked) {
|
|
selectedRowKeys.value.push(item.id);
|
|
selectedRows.value.push(item);
|
|
} else {
|
|
let findIndex = selectedRowKeys.value.findIndex((val) => val === item.id);
|
|
if (findIndex != -1) {
|
|
selectedRowKeys.value.splice(findIndex, 1);
|
|
selectedRows.value.splice(findIndex, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 分页改变事件
|
|
* @param page
|
|
* @param current
|
|
*/
|
|
function handlePageChange(page, current) {
|
|
pageNo.value = page;
|
|
pageSize.value = current;
|
|
reload();
|
|
}
|
|
|
|
/**
|
|
* 设置选装状态
|
|
*/
|
|
function setChecked() {
|
|
if (apiList.value && apiList.value.length > 0){
|
|
let value = selectedRowKeys.value.join(',');
|
|
apiList.value = apiList.value.map((item) => {
|
|
if (value.indexOf(item.id) !== -1) {
|
|
item.checked = true;
|
|
} else {
|
|
item.checked = false;
|
|
}
|
|
return item;
|
|
});
|
|
}
|
|
}
|
|
|
|
defineExpose({
|
|
add,
|
|
edit,
|
|
submitForm,
|
|
cleanData
|
|
});
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.antd-modal-form {
|
|
padding: 14px;
|
|
}
|
|
.list-footer {
|
|
position: absolute;
|
|
bottom: -22px;
|
|
right: 10px;
|
|
text-align: center;
|
|
}
|
|
.checkbox-card {
|
|
margin-bottom: 10px;
|
|
margin-right: 10px;
|
|
}
|
|
.checkbox-img {
|
|
width: 30px;
|
|
height: 30px;
|
|
}
|
|
.checkbox-name {
|
|
margin-left: 4px;
|
|
font-size: 13px;
|
|
}
|
|
.use-select {
|
|
color: #646a73;
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 20px;
|
|
}
|
|
</style>
|