Files
Docker/WebVue/src/views/security/FunctionEnquiry.vue
T
2026-09-05 23:08:56 +08:00

346 lines
13 KiB
Vue

<template>
<search @on-submit="onSubmit" @on-print="onPrint" @on-reset="onReset" @use-pagination="onPagination"
:is-modal="isModal" :loading="loading" :pagination="result" :rowSelectionType="selectionType"
@on-row-dblclick="onRowDblclick" @on-select-change="onSelectChange">
<template #control>
<a-button type="primary" v-if="canCreate && !isModal" :icon="h(FileAddOutlined)"
@click.prevent="onCreate">新增</a-button>
</template>
<template #bodyCell="{ column, record, index }">
<template v-if="column.dataIndex === SecurityFunctionDisplayData.FUNCTION_INDC">
<template v-if="record.FunctionIndc == 'Y'">
<span>是</span>
</template>
<template v-else> <span>否</span></template>
</template>
</template>
<template #footer>
<div v-if="!isModal" class="page-footer">
<a-row :gutter="24">
<a-col :lg="24" :sm="24">
<a-row :gutter="[16, 8]">
<a-space>
<a-button type="primary" v-if="canView" :icon="h(FileTextOutlined)"
:disabled="!(keys && keys.length ==1)" @click.prevent="onView">查看</a-button>
<a-button type="primary" v-if="canAmend" :icon="h(EditOutlined)"
:disabled="!(keys && keys.length ==1)" @click.prevent="onAmend">修改</a-button>
<a-popconfirm title="确定是否删除这条记录?" ok-text="是" cancel-text="否" @confirm="onDelete">
<a-button type="primary" danger :icon="h(DeleteOutlined)" v-if="canDelete"
:disabled="!(keys && keys.length > 0)">删除</a-button>
</a-popconfirm>
</a-space>
</a-row>
</a-col>
</a-row>
</div>
</template>
</search>
</template>
<script setup lang="ts">
import { reactive, inject, defineComponent, onMounted, ref, unref, provide, h } from "vue";
import { BindOption } from "@/data/custom/bindOption";
import { SelectOption } from "@/data/auto/selectOption";
import search from "@/components/basic/Search.vue";
import { DeleteOutlined, EditOutlined, FileAddOutlined, FileTextOutlined } from "@ant-design/icons-vue";
import { SecurityFunctionResultData } from "@/data/auto/securityFunctionResultData";
import { SecurityFunctionDisplayData } from "@/data/auto/securityFunctionDisplayData";
import { SearchFilter } from "@/data/auto/searchFilter"
import securityFunctionService from "@/service/security/securityFunctionService";
import { useYesNoPolicy } from "@/hooks/useYesNoPolicy"
import { SecurityFunctionSearchCriteria } from "@/data/auto/securityFunctionSearchCriteria";
import { SearchCriteriaResultData } from "@/data/auto/searchCriteriaResultData";
import { PermissionContext, usePermissionContext } from "@/hooks/PermissionContext"
import { useRoute, useRouter } from "vue-router";
import { useBindOption } from "@/hooks/useBindOption";
import { SearchFilterOperatorPolicy } from "@/data/custom/searchFilterOperatorPolicy"
import { SearchFilterTypePolicy } from "@/data/custom/searchFilterTypePolicy"
import { notification } from "ant-design-vue";
import { GridColumnInfo } from "@/data/auto/gridColumnInfo"
import { useGridColumnInfo } from "@/hooks/gridColumnInfo"
import { title } from "process";
import { enquiryMethodKey, searchCriteriaManagerKey, operationToEnquiryMethodKey, OperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================inject================
//报表名称(layout)
const layoutProviderMethod = inject(layoutProviderMethodKey);
const actorOperationMethod = inject(operationToEnquiryMethodKey, undefined);
const modelOption = actorOperationMethod?.getOperationToEnquiryModelOption() as OperationToEnquiryModelOption;
const isModal = ref(modelOption ? modelOption.isModalFunction : false);
const selectionType = modelOption ? modelOption.selectionTypeFunction : 'checkbox';
const initBindOptions = ref((modelOption ? modelOption.initBindOptionsFunction : []) as BindOption[]);
//================inject================
const emit = defineEmits(['onRowDblclick']);
const loading = ref<boolean>(false);
const canView = ref<boolean>(false);
const canAmend = ref<boolean>(false);
const canDelete = ref<boolean>(false);
const canCreate = ref<boolean>(false);
const route = useRoute();
const router = useRouter();
const columns = ref([
{
title: '序号',
dataIndex: 'index',
width: '5%',
align: 'center',
fixed: 'left',
sequence: 0,
hidden: 'N',
format: ''
},
{
title: "功能名称",
dataIndex: SecurityFunctionDisplayData.FUNCTION_NAME,
sorter: true,
width: '15%',
sequence: 1,
hidden: 'N'
},
{
title: "中文名称",
dataIndex: SecurityFunctionDisplayData.FUNCTION_LOCAL_NAME,
sorter: true,
width: '15%',
sequence: 2,
hidden: 'N'
},
{
title: "菜单?",
dataIndex: SecurityFunctionDisplayData.FUNCTION_INDC,
sorter: true,
width: '5%',
sequence: 4,
hidden: 'N'
},
{
title: "Vue文件路径",
dataIndex: SecurityFunctionDisplayData.PAGE_URL,
sorter: true,
width: '20%',
sequence: 2,
hidden: 'N'
},
{
title: "Api路由",
dataIndex: SecurityFunctionDisplayData.API_ROUTE,
sorter: true,
width: '20%',
sequence: 2,
hidden: 'N'
},
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<SecurityFunctionDisplayData[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<SecurityFunctionResultData>(new SecurityFunctionResultData());
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<SecurityFunctionSearchCriteria>(new SecurityFunctionSearchCriteria());
const keys = ref<SecurityFunctionDisplayData[]>([]);
const {
children: items,
addChild: addItem,
removeChild: removeItem,
} = useOrderedChildren<SearchCriteriaContext>();
//================provide================
//初始化查询条件UI
provide(enquiryMethodKey, {
getLayoutSetting: () => { return { controlLeft: 16, controlRight: 8, space: true, soltLeft: 24, soltRight: 24 }; },
getBindOptions: () => { return unref(bindOptions); },
getViewOption: () => { return unref(viewOption); },
getDatas: () => { return datas; },
});
provide(
searchCriteriaManagerKey,
reactive({
items,
addItem,
removeItem,
})
);
//================provide================
defineExpose({
keys,
initBindOptions,
})
onMounted(() => {
let pContext: PermissionContext = usePermissionContext();
canView.value = pContext.canView(route.meta.permission as string);
canAmend.value = pContext.canAmend(route.meta.permission as string);
canDelete.value = pContext.canDelete(route.meta.permission as string);
canCreate.value = pContext.canCreate(route.meta.permission as string);
initBindOption();
onSearch();
})
const onSelectChange = ((selected: SecurityFunctionDisplayData[]) => {
keys.value = selected;
})
const onRowDblclick = ((e: any, record: SecurityFunctionDisplayData) => {
if (isModal.value) {
emit('onRowDblclick', record);
}
else {
router.push({ name: "FunctionOperation", params: { id: record.FunctionName, mode: 'view' } });
}
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
const onView = (() => {
if (keys.value.length == 0) return;
router.push({ name: "FunctionOperation", params: { id: keys.value[0].FunctionName, mode: 'view' } });
})
const onCreate = (() => {
router.push({ name: "FunctionOperation", params: { id: '', mode: 'create' } });
})
const onAmend = (() => {
if (keys.value.length == 0) return;
router.push({ name: "FunctionOperation", params: { id: keys.value[0].FunctionName, mode: 'amend' } });
})
const onDelete = (async () => {
for (let i = 0; i < keys.value.length; i++) {
await securityFunctionService.Delete(keys.value[i].FunctionName);
}
notification.info({
message: '系统提示:',
description: '记录删除成功',
placement: "topRight",
});
onReload();
})
const setBindOptionValue = ((bindValue: string, value: string, value1: string, values: string[], disabled: boolean) => {
let bindOption: BindOption = bindOptions.value.filter(x => x.BindValue == bindValue)[0];
if (!bindOption) return;
bindOption.Value = value;
bindOption.Value1 = value1;
bindOption.Values = values;
bindOption.disabled = disabled;
})
//初始化查询条件
const initBindOption = (async () => {
let ubo = useBindOption();
let bindOption: BindOption = ubo.getBindOption(SecurityFunctionDisplayData.DB_FUNCTION_NAME, '功能名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOptions.value.push(bindOption);
bindOption = ubo.getBindOption(SecurityFunctionDisplayData.DB_FUNCTION_LOCAL_NAME, '中文名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CN_CONTAIN);
bindOption.lg = 10;
bindOptions.value.push(bindOption);
let rps: SelectOption[] = await useYesNoPolicy().getSelectOption(true);
bindOption = ubo.getBindSelectOption(SecurityFunctionDisplayData.DB_FUNCTION_INDC, '菜单?', SearchFilterTypePolicy.SINGLE_SELECTION, SearchFilterOperatorPolicy.SINGLE, rps);
bindOptions.value.push(bindOption);
initBindOptions.value.forEach(element => {
setBindOptionValue(element.BindValue, element.Value, element.Value1, element.Values, element.disabled);
});
})
//table from-----------------------------------------------------------------------------------------------------------------------------------
result.value.Page = pagingParams.value.page ?? 1;
result.value.Limit = pagingParams.value.pageSize;
const onSubmit = (async (filters: SearchFilter[]) => {
let c: SecurityFunctionSearchCriteria = new SecurityFunctionSearchCriteria();
isSearched.value = true;
c.Filter = filters;
c.limit = pagingParams.value.pageSize;
c.page = pagingParams.value.page ?? 1;
c.GridColumns = [];
currentSearchCriteria.value = c;
await findBySearchCriteria(c);
})
const onSearch = (async () => {
onSubmit(items.value[0].getFilter());
})
const onPrint = (async () => {
let c: SecurityFunctionSearchCriteria = new SecurityFunctionSearchCriteria();
c.Filter = items.value[0].getFilter();
c.limit = pagingParams.value.pageSize;
c.page = pagingParams.value.page ?? 1;
c.GridColumns = useGridColumnInfo().getGridColumnInfo(unref(columns));
c.ReportName = layoutProviderMethod?.getLayoutProvider().layoutTitle!;
try {
let sss = await securityFunctionService.PrintBySearchCriteria(c);
} catch (error) {
console.log(error);
}
})
const findBySearchCriteria = (async (c: SecurityFunctionSearchCriteria) => {
data.value = await securityFunctionService.FindBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.SecurityFunctionDisplayDatas;
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: SecurityFunctionSearchCriteria = new SecurityFunctionSearchCriteria();
c.Filter = items.value[0].getFilter();
c.limit = params.pageSize;
c.page = params.page ?? 1;
if (params.sortField)
c.orderby = params.sortField!;
if (params.sortOrder)
c.orderbytag = params.sortOrder?.toString().substring(0, 4)!;
c.GridColumns = [];
currentSearchCriteria.value = c;
await findBySearchCriteria(c);
});
const onReload = (async () => {
await findBySearchCriteria(unref(currentSearchCriteria));
})
//table end-----------------------------------------------------------------------------------------------------------------------------------
</script>