文件上传功能添加,注意使用Path.Combine处理通用路径问题(windows||docker)

This commit is contained in:
owenchen committed 2026-09-03 16:09:54 +08:00
1 parent 7817c5374c
commit 244b59a3fb
135 files changed
+16937 -75

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,248 @@
<template>
<search @on-submit="onSubmit" @on-reset="onReset" @use-pagination="onPagination" :scrollx="400" :is-modal="isModal"
:loading="loading" :pagination="result" :rowSelectionType="selectionType" @on-row-dblclick="onRowDblclick"
@on-select-change="onSelectChange">
<template #bodyCell="{ column, record, index }">
<template v-if="column.dataIndex === DmsFileUploadViewDisplayData.FILE_TAG">
{{ useFileTypePolicy().GetComposeMessage(record.FileType) }}
</template>
</template>
<template #footer>
</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 { DmsFileResultData } from "@/data/auto/dmsFileResultData";
import { SearchFilter } from "@/data/auto/searchFilter"
import dmsFileService from "@/service/master/dmsFileService";
import { useFileTypePolicy } from "@/hooks/useFileTypePolicy"
import { DmsFileSearchCriteria } from "@/data/auto/dmsFileSearchCriteria";
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, masterOperationToEnquiryMethodKey, MasterOperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
import { DmsFileUploadViewDisplayData } from "@/data/auto/dmsFileUploadViewDisplayData";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================props================
const props = defineProps({
filetype: {
type: String,
default: '',
},
});
//================inject================
//报表名称(layout)
const layoutProviderMethod = inject(layoutProviderMethodKey);
const masterOperationToEnquiryMethod = inject(masterOperationToEnquiryMethodKey);
const modelOption = masterOperationToEnquiryMethod?.getOperationToEnquiryModelOption() as MasterOperationToEnquiryModelOption;
//当前是弹出的Modal(page)
const isModal = ref(inject("isModalDmsFile", false) as boolean);
//初始化查询条件的值(page)
const initBindOptions = ref((modelOption ? modelOption.initBindOptionsDmsFile : []) as BindOption[]);
//记录单选还是多选(page)
const selectionType = ref(inject("selectionTypeDmsFile", 'radio') as string);
//================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: DmsFileUploadViewDisplayData.ORG_FILE_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 1,
hidden: 'N'
},
{
title: "文件类型",
dataIndex: DmsFileUploadViewDisplayData.FILE_TAG,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
}
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<DmsFileUploadViewDisplayData[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<DmsFileResultData>(new DmsFileResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<DmsFileSearchCriteria>(new DmsFileSearchCriteria());
const keys = ref<DmsFileUploadViewDisplayData[]>([]);
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(async () => {
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);
await initBindOption();
onSubmit(items.value[0].getFilter());
})
const onSelectChange = ((selected: DmsFileUploadViewDisplayData[]) => {
keys.value = selected;
})
const onRowDblclick = ((e: any, record: DmsFileUploadViewDisplayData) => {
if (isModal.value) {
emit('onRowDblclick', record);
}
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
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(DmsFileUploadViewDisplayData.DB_ORG_FILE_NAME, '名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOptions.value.push(bindOption);
let rps: SelectOption[] = await useFileTypePolicy().getSelectOption(true);
bindOption = ubo.getBindSelectOption(DmsFileUploadViewDisplayData.DB_FILE_TAG, '文件类型', SearchFilterTypePolicy.SINGLE_SELECTION, SearchFilterOperatorPolicy.SINGLE, rps);
bindOption.lg = 10;
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: DmsFileSearchCriteria = new DmsFileSearchCriteria();
currentFilter.value = filters;
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 findBySearchCriteria = (async (c: DmsFileSearchCriteria) => {
data.value = await dmsFileService.FindDatasBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.Datas;
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: DmsFileSearchCriteria = new DmsFileSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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>
@@ -0,0 +1,279 @@
<template>
<search @on-submit="onSubmit" @on-print="onPrint" @on-reset="onReset" @use-pagination="onPagination"
:is-modal="isModal" :loading="loading" :pagination="result" :rowSelectionType="selectionType"
@on-select-change="onSelectChange">
<template #control>
</template>
<template #bodyCell="{ column, record, index }">
</template>
<template #footer>
</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 { FamilyGroupResultData } from "@/data/auto/familyGroupResultData";
import { FamilyFolderFavoriteViewEntity } from "@/data/auto/familyFolderFavoriteViewEntity";
import { SearchFilter } from "@/data/auto/searchFilter"
import familyGroupService from "@/service/master/familyGroupService";
import { FamilyGroupManagerUserSearchCriteria } from "@/data/auto/familyGroupManagerUserSearchCriteria";
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, masterOperationToEnquiryMethodKey, MasterOperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================inject================
//报表名称
const layoutProviderMethod = inject(layoutProviderMethodKey);
//当前是弹出的Modal,还是Page
const isModal = ref(inject("isModalShare", false) as boolean);
//初始化查询条件的值
const initBindOptions = ref(inject("initBindOptionsShare", []) as BindOption[]);
//记录单选还是多选
const selectionType = ref(inject("selectionTypeShare", 'checkbox') as string);
//================inject================
const loading = ref<boolean>(false);
const isEdit = 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: '30px',
align: 'center',
fixed: 'left',
sequence: 0,
hidden: 'N',
format: ''
},
{
title: "群组名称",
dataIndex: FamilyFolderFavoriteViewEntity.FAMILY_LOCAL_NAME,
sorter: true,
width: '65px',
sequence: 1,
hidden: 'N'
},
{
title: "顶级目录",
dataIndex: FamilyFolderFavoriteViewEntity.TOP_FOLDER_LOCAL_NAME,
sorter: false,
width: '80px',
sequence: 2,
hidden: 'N'
},
{
title: "目录",
dataIndex: FamilyFolderFavoriteViewEntity.FOLDER_LOCAL_NAME,
sorter: false,
width: '80px',
sequence: 3,
hidden: 'N'
},
{
title: "目录描述",
dataIndex: FamilyFolderFavoriteViewEntity.NOTICE,
sorter: false,
width: '80px',
sequence: 4,
hidden: 'N'
},
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<FamilyFolderFavoriteViewEntity[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<FamilyGroupResultData>(new FamilyGroupResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<FamilyGroupManagerUserSearchCriteria>(new FamilyGroupManagerUserSearchCriteria());
const keys = ref<FamilyFolderFavoriteViewEntity[]>([]);
const {
children: items,
addChild: addItem,
removeChild: removeItem,
} = useOrderedChildren<SearchCriteriaContext>();
//================provide================
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();
onSubmit(items.value[0].getFilter());
})
const onSelectChange = ((selected: FamilyFolderFavoriteViewEntity[]) => {
keys.value = selected;
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
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(FamilyFolderFavoriteViewEntity.DB_FAMILY_LOCAL_NAME, '群组名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CN_CONTAIN);
bindOptions.value.push(bindOption);
bindOption = ubo.getBindOption(FamilyFolderFavoriteViewEntity.DB_FOLDER_LOCAL_NAME, '目录名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CN_CONTAIN);
bindOption.lg = 10;
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: FamilyGroupManagerUserSearchCriteria = new FamilyGroupManagerUserSearchCriteria();
currentFilter.value = filters;
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 onPrint = (async () => {
let c: FamilyGroupManagerUserSearchCriteria = new FamilyGroupManagerUserSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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 familyGroupService.FamilyFolderFavoriteBySearchCriteria(c);
} catch (error) {
console.log(error);
}
})
const findBySearchCriteria = (async (c: FamilyGroupManagerUserSearchCriteria) => {
try {
data.value = await familyGroupService.FamilyFolderFavoriteBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.Favorites;
} catch (error) {
console.log(error);
}
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: FamilyGroupManagerUserSearchCriteria = new FamilyGroupManagerUserSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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>
+303
View File
@@ -0,0 +1,303 @@
<template>
<dragModal v-model:open="modal.showModal" :title="title" @cancel="handleCance" :mask-closable="false"
@ok="handleSubmit">
<hr><br>
<a-form name="basic" autocomplete="off" :rules="rules" :model="modal.data" ref="formRef">
<a-row :wrap="false">
<a-col flex="none">
<div style="padding: 0 "><a-input flex="none" readonly value="上一层文件夹" class="site-input-split"
style="width: 160px;border-radius:0; border-top-left-radius: 5pt 5pt;
border-bottom-left-radius: 5pt 5pt;
pointer-events: none" /></div>
</a-col>
<a-col flex="auto">
<a-form-item name="FilePath">
<a-input disabled v-model:value="modal.data.FilePath" flex="auto" style="border-radius:0; border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt; border-left: 0;text-align: left" />
</a-form-item>
</a-col>
</a-row>
<a-row :wrap="false">
<a-col flex="none">
<div style="padding: 0 "><a-input flex="none" readonly value="文件夹名称" class="site-input-split" style="width: 160px;border-radius:0; border-top-left-radius: 5pt 5pt;
border-bottom-left-radius: 5pt 5pt;
pointer-events: none" /></div>
</a-col>
<a-col flex="auto">
<a-form-item name="FileName" :rules="[{ required: true, message: '请输入文件夹名称' }]">
<a-input :disabled="isMove" required v-model:value="modal.data.FileName" flex="auto" style="border-radius:0; border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt; border-left: 0;text-align: left" />
</a-form-item>
</a-col>
</a-row>
<a-row :wrap="false" v-if="isFamilyGroup">
<a-col flex="none">
<div style="padding: 0 "><a-input flex="none" readonly value="描述" class="site-input-split" style="width: 160px;border-radius:0; border-top-left-radius: 5pt 5pt;
border-bottom-left-radius: 5pt 5pt;
pointer-events: none" /></div>
</a-col>
<a-col flex="auto">
<a-form-item name="FileName" :rules="[{ required: true, message: '请输入文件夹描述' }]">
<a-input :disabled="isMove" v-model:value="modal.Notice" flex="auto" style="border-radius:0; border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt; border-left: 0;text-align: left" />
</a-form-item>
</a-col>
</a-row>
</a-form>
<a-tree v-if="isMove" v-model:expandedKeys="expandedKeys" :show-icon="true" @select="select"
:tree-data="treeItems">
</a-tree>
</dragModal>
</template>
<script setup lang="ts">
import { watch, watchEffect, inject, reactive, ref, VNode, h, unref, onMounted, onBeforeMount } from "vue";
import type { Rule } from "ant-design-vue/es/form";
import { DmsFileEntity } from "@/data/auto/dmsFileEntity";
import dmsFileService from "@/service/master/dmsFileService";
import dragModal from "@/components/basic/DragModal.vue"
import { BindOption } from "@/data/custom/bindOption";
import { SelectOption } from "@/data/auto/selectOption";
import { useYesNoPolicy } from "@/hooks/useYesNoPolicy"
import { notification } from "ant-design-vue";
import { DmsFolderData } from "@/data/auto/dmsFolderData";
import { DmsFolderEntity } from "@/data/auto/dmsFolderEntity";
import { DmsFolderMapEntity } from "@/data/auto/dmsFolderMapEntity";
import { FamilyDmsFileViewEntity } from "@/data/auto/familyDmsFileViewEntity";
import {
HomeTwoTone,
FolderOutlined
} from "@ant-design/icons-vue";
const emit = defineEmits(['onSubmit']);
const yesNoPolicy = ref<SelectOption[]>([]);
onBeforeMount(async () => {
yesNoPolicy.value = await useYesNoPolicy().getSelectOption(false);
})
const modal = reactive({
loading: false,
showModal: false,
FilePathValue: '',
Notice: '',
data: new DmsFileEntity(),
});
const formRef = ref();
const dmsFolderModal = inject<boolean>("dmsFolderModal");
const title = ref(inject<string>("dmsFolderTitle", '新增文件夹'));
const isRename = ref(inject<boolean>("dmsFolderIsRename", false));
const isMove = ref(inject<boolean>("dmsFolderIsMove", false));
const isFamilyGroup = ref(inject<boolean>("dmsFolderIsFamilyGroup", false));
const dmsFolderFamilyName = ref(inject<string>("dmsFolderFamilyName", ''));
const entity = ref(inject<DmsFileEntity>("DmsFileEntity", new DmsFileEntity()));
modal.showModal = dmsFolderModal!;
watch(entity, async () => {
modal.data = new DmsFileEntity();
if (entity.value) {
modal.data.FilePath = entity.value.FilePath;
if (isRename.value) {
modal.data.FileId = entity.value.FileId;
modal.data.FileName = entity.value.FileName;
}
else if (isMove.value) {
modal.FilePathValue = entity.value.FilePath;
modal.data.FileId = entity.value.FileId;
modal.data.FileName = entity.value.OrgFileName;
initTree(entity.value.FileName);
}
else {
modal.FilePathValue = entity.value.OrgFileName;
modal.data.FileName = '';
}
}
});
export interface ContextMenuItem {
title: string;
key?: string;
icon?: VNode;
children?: ContextMenuItem[];
type?: string;
item: ContextItem;
order?: number;
}
export interface ContextItem {
router?: string;
}
const treeItems: ContextMenuItem[] = reactive([]);
const initTree = async (owner: string) => {
treeItems.splice(0, treeItems.length);
expandedKeys.value.splice(0, treeItems.length);
let fd: DmsFolderData = await dmsFileService.FindDmsFolderData();
if (fd == null || fd.DmsFolders == null || fd.DmsFoldersMaps.length == 0) return;
let topTree: DmsFolderEntity = fd.DmsFolders.filter(x => x.CreatedBy == x.FolderLocalName)[0];
let parent: ContextMenuItem;
parent = getMenuItem(topTree.FolderLocalName, 0, topTree.FolderName, h(HomeTwoTone), [], null!, { router: '/' });
findSon(parent, owner, topTree.FolderName, fd);
treeItems.push(parent);
expandedKeys.value.push(topTree.FolderName);
};
const findSon = (parentItem: ContextMenuItem, owner: string, parentFolderName: string, fd: DmsFolderData) => {
fd.DmsFoldersMaps.forEach(element => {
if (element.FolderNameParent == parentFolderName && element.FolderNameSon != owner) {
let parent: ContextMenuItem;
if (fd.DmsFolders.filter(x => x.FolderName == element.FolderNameSon).length > 0) {
let topTree: DmsFolderEntity = fd.DmsFolders.filter(x => x.FolderName == element.FolderNameSon)[0];
parent = getMenuItem(topTree.FolderLocalName, 0, topTree.FolderName, h(FolderOutlined), [], null!, { router: '/' });
parentItem.children?.push(parent);
expandedKeys.value.push(topTree.FolderName);
findSon(parent, owner, element.FolderNameSon, fd);
}
}
});
}
function getMenuItem(
title: string,
order: number,
key?: string,
icon?: VNode,
children?: ContextMenuItem[],
type?: string | "group",
item?: ContextItem,
): ContextMenuItem {
return {
key,
order,
icon,
children,
title,
type,
item
} as ContextMenuItem;
}
const select = (treeKey: string, e: any) => {
//console.log(treeKey);
modal.FilePathValue = treeKey[0];
// console.log(e.selectedNodes[0].title);
modal.data.FilePath = e.selectedNodes[0].title;
};
const expandedKeys = ref<string[]>([]);
const validatePass = async (_rule: Rule, value: string) => {
console.log(value);
// if (value !== state.LoginData.UserPassword) {
// return Promise.reject(t("login.register.twoDifferentPasswords"));
// } else {
// return Promise.resolve();
// }
};
const rules: Record<string, Rule[]> = {
//ConfirmNewPassword: [{ validator: validatePass, trigger: "change" }],
};
const handleSubmit = async () => {
try {
modal.loading = true;
formRef.value
.validate()
.then(async () => {
if (isRename.value) {
await dmsFileService.UpdateDmsFolder(modal.data);
}
else if (isMove.value) {
modal.data.FilePath = modal.FilePathValue;
await dmsFileService.MoveDmsFolder(modal.data);
}
else if (isFamilyGroup.value) {
let dms: FamilyDmsFileViewEntity = new FamilyDmsFileViewEntity();
dms.FilePath = modal.FilePathValue;
dms.FolderLocalName = modal.data.FileName;
dms.FamilyName = dmsFolderFamilyName.value;
dms.Notice =modal.Notice;
await dmsFileService.CreateFamilyDmsFolder(dms);
}
else {
modal.data.FilePath = modal.FilePathValue;
await dmsFileService.CreateDmsFolder(modal.data);
}
notification.info({
message: '系统提示:',
description: '记录修改成功',
placement: "topRight",
});
emit('onSubmit', null);
modal.showModal = false;
}).catch(() => {
});
} catch (error) {
} finally {
modal.loading = false;
}
};
const handleCance = async () => {
entity.value = null!;
};
</script>
<style lang="less">
.draggable-modal .ant-select-single .ant-select-selector {
border-top-left-radius: 0pt 0pt;
border-bottom-left-radius: 0pt 0pt;
border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt;
border-left: 0 !important;
}
.draggable-modal .ant-select-multiple .ant-select-selector {
border-top-left-radius: 0pt 0pt;
border-bottom-left-radius: 0pt 0pt;
border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt;
border-left: 0 !important;
}
.draggable-modal .ant-picker {
width: 100%;
}
.draggable-modal .ant-select-selector {
background-color: #f3e97a !important;
}
.draggable-modal .ant-input-number-input {
border-top-left-radius: 0pt 0pt;
border-bottom-left-radius: 0pt 0pt;
border-top-right-radius: 5pt 5pt;
border-bottom-right-radius: 5pt 5pt;
border-left: 0 !important;
}
</style>
@@ -0,0 +1,330 @@
<template>
<search @on-submit="onSubmit" @on-print="onPrint" @on-reset="onReset" @use-pagination="onPagination" :scrollx="400"
: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 === PublishAudioEntity.PUBLISH_NAME">
<a-button type="link" block @click.prevent="onViewAudioPreview">{{ record.PublishName }}</a-button>
</template>
<template v-else-if="column.dataIndex === PublishAudioEntity.DEFAULT_INDC">
<template v-if="record.DefaultIndc == '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 > 0)" @click.prevent="onView">查看</a-button>
<a-button type="primary" v-if="canAmend" :icon="h(EditOutlined)"
:disabled="!(keys && keys.length > 0)" @click.prevent="onAmend">修改</a-button>
<a-button type="primary" v-if="canView" :icon="h(FileTextOutlined)"
:disabled="!(keys && keys.length > 0)"
@click.prevent="onViewAudioPreview">音乐厅</a-button>
</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 { PublishAudioResultData } from "@/data/auto/publishAudioResultData";
import { PublishAudioEntity } from "@/data/auto/publishAudioEntity";
import { SearchFilter } from "@/data/auto/searchFilter"
import publishAudioService from "@/service/master/publishAudioService";
import { useYesNoPolicy } from "@/hooks/useYesNoPolicy"
import { PublishAudioSearchCriteria } from "@/data/auto/publishAudioSearchCriteria";
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, masterOperationToEnquiryMethodKey, MasterOperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
import { useLoginProfileStore } from "@/store/modules/loginProfile";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================inject================
//报表名称(layout)
const layoutProviderMethod = inject(layoutProviderMethodKey);
//当前是弹出的Modal(page)
const isModal = ref(inject("isModalPublishAudio", false) as boolean);
//初始化查询条件的值(page)
const initBindOptions = ref(inject("initBindOptionsPublishAudio", []) as BindOption[]);
//记录单选还是多选(page)
const selectionType = ref(inject("selectionTypePublishAudio", 'radio') as string);
//================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: PublishAudioEntity.PUBLISH_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 1,
hidden: 'N'
},
{
title: "专辑名称",
dataIndex: PublishAudioEntity.PUBLISH_LOCAL_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "专辑描述",
dataIndex: PublishAudioEntity.NOTICE,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "默认",
dataIndex: PublishAudioEntity.DEFAULT_INDC,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
}
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<PublishAudioEntity[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<PublishAudioResultData>(new PublishAudioResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<PublishAudioSearchCriteria>(new PublishAudioSearchCriteria());
const keys = ref<PublishAudioEntity[]>([]);
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();
onSubmit(items.value[0].getFilter());
})
const onSelectChange = ((selected: PublishAudioEntity[]) => {
keys.value = selected;
})
const onRowDblclick = ((e: any, record: PublishAudioEntity) => {
if (isModal.value) {
emit('onRowDblclick', record);
}
else {
router.push({ name: "PublishAudioOperation", params: { id: record.PublishName, mode: 'view' } });
}
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
const onViewAudioPreview = (() => {
if (keys.value.length == 0) return;
router.push({ name: "AudioPreviews", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onCreate = (() => {
router.push({ name: "PublishAudioOperation", params: { id: '', mode: 'create' } });
})
const onView = (() => {
if (keys.value.length == 0) return;
router.push({ name: "PublishAudioOperation", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onAmend = (() => {
if (keys.value.length == 0) return;
let userLoginProfile = useLoginProfileStore();
if (keys.value[0].OwnerName != userLoginProfile.getUsername()) {
notification.info({
message: '系统提示:',
description: '你不是发布者,不能修改!',
placement: "topRight",
});
return;
}
router.push({ name: "PublishAudioOperation", params: { id: keys.value[0].PublishName, mode: 'amend' } });
})
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(PublishAudioEntity.DB_PUBLISH_NAME, '专辑编号', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOptions.value.push(bindOption);
bindOption = ubo.getBindOption(PublishAudioEntity.DB_PUBLISH_LOCAL_NAME, '专辑名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOption.lg = 10;
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: PublishAudioSearchCriteria = new PublishAudioSearchCriteria();
currentFilter.value = filters;
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 onPrint = (async () => {
let c: PublishAudioSearchCriteria = new PublishAudioSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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 publishAudioService.PrintBySearchCriteria(c);
} catch (error) {
console.log(error);
}
})
const findBySearchCriteria = (async (c: PublishAudioSearchCriteria) => {
if (isModal.value) {
c.IsModal = true;
}
data.value = await publishAudioService.FindBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.Datas;
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: PublishAudioSearchCriteria = new PublishAudioSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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>
@@ -0,0 +1,330 @@
<template>
<search @on-submit="onSubmit" @on-print="onPrint" @on-reset="onReset" @use-pagination="onPagination" :scrollx="400"
: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 === PublishPhotoEntity.PUBLISH_NAME">
<a-button type="link" block @click.prevent="onViewPreview">{{ record.PublishName }}</a-button>
</template>
<template v-else-if="column.dataIndex === PublishPhotoEntity.DEFAULT_INDC">
<template v-if="record.DefaultIndc == '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 > 0)" @click.prevent="onView">查看</a-button>
<a-button type="primary" v-if="canAmend" :icon="h(EditOutlined)"
:disabled="!(keys && keys.length > 0)" @click.prevent="onAmend">修改</a-button>
<a-button type="primary" v-if="canView" :icon="h(FileTextOutlined)"
:disabled="!(keys && keys.length > 0)"
@click.prevent="onViewPreview">相册展览</a-button>
</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 { PublishPhotoResultData } from "@/data/auto/publishPhotoResultData";
import { PublishPhotoEntity } from "@/data/auto/publishPhotoEntity";
import { SearchFilter } from "@/data/auto/searchFilter"
import publishPhotoService from "@/service/master/publishPhotoService";
import { useYesNoPolicy } from "@/hooks/useYesNoPolicy"
import { PublishPhotoSearchCriteria } from "@/data/auto/publishPhotoSearchCriteria";
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, masterOperationToEnquiryMethodKey, MasterOperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
import { useLoginProfileStore } from "@/store/modules/loginProfile";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================inject================
//报表名称(layout)
const layoutProviderMethod = inject(layoutProviderMethodKey);
//当前是弹出的Modal(page)
const isModal = ref(inject("isModalPublishPhoto", false) as boolean);
//初始化查询条件的值(page)
const initBindOptions = ref(inject("initBindOptionsPublishPhoto", []) as BindOption[]);
//记录单选还是多选(page)
const selectionType = ref(inject("selectionTypePublishPhoto", 'radio') as string);
//================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: PublishPhotoEntity.PUBLISH_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 1,
hidden: 'N'
},
{
title: "相册名称",
dataIndex: PublishPhotoEntity.PUBLISH_LOCAL_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "相册描述",
dataIndex: PublishPhotoEntity.NOTICE,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "默认",
dataIndex: PublishPhotoEntity.DEFAULT_INDC,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
}
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<PublishPhotoEntity[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<PublishPhotoResultData>(new PublishPhotoResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<PublishPhotoSearchCriteria>(new PublishPhotoSearchCriteria());
const keys = ref<PublishPhotoEntity[]>([]);
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();
onSubmit(items.value[0].getFilter());
})
const onSelectChange = ((selected: PublishPhotoEntity[]) => {
keys.value = selected;
})
const onRowDblclick = ((e: any, record: PublishPhotoEntity) => {
if (isModal.value) {
emit('onRowDblclick', record);
}
else {
router.push({ name: "PublishPhotoOperation", params: { id: record.PublishName, mode: 'view' } });
}
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
const onViewPreview = (() => {
if (keys.value.length == 0) return;
router.push({ name: "Previews", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onCreate = (() => {
router.push({ name: "PublishPhotoOperation", params: { id: '', mode: 'create' } });
})
const onView = (() => {
if (keys.value.length == 0) return;
router.push({ name: "PublishPhotoOperation", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onAmend = (() => {
if (keys.value.length == 0) return;
let userLoginProfile = useLoginProfileStore();
if (keys.value[0].OwnerName != userLoginProfile.getUsername()) {
notification.info({
message: '系统提示:',
description: '你不是发布者,不能修改!',
placement: "topRight",
});
return;
}
router.push({ name: "PublishPhotoOperation", params: { id: keys.value[0].PublishName, mode: 'amend' } });
})
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(PublishPhotoEntity.DB_PUBLISH_NAME, '相册编号', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOptions.value.push(bindOption);
bindOption = ubo.getBindOption(PublishPhotoEntity.DB_PUBLISH_LOCAL_NAME, '相册名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOption.lg = 10;
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: PublishPhotoSearchCriteria = new PublishPhotoSearchCriteria();
currentFilter.value = filters;
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 onPrint = (async () => {
let c: PublishPhotoSearchCriteria = new PublishPhotoSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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 publishPhotoService.PrintBySearchCriteria(c);
} catch (error) {
console.log(error);
}
})
const findBySearchCriteria = (async (c: PublishPhotoSearchCriteria) => {
if (isModal.value) {
c.IsModal = true;
}
data.value = await publishPhotoService.FindBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.Publishs;
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: PublishPhotoSearchCriteria = new PublishPhotoSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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>
@@ -0,0 +1,329 @@
<template>
<search @on-submit="onSubmit" @on-print="onPrint" @on-reset="onReset" @use-pagination="onPagination" :scrollx="400"
: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 === PublishVideoEntity.PUBLISH_NAME">
<a-button type="link" block @click.prevent="onViewVideoPreview">{{ record.PublishName }}</a-button>
</template>
<template v-else-if="column.dataIndex === PublishVideoEntity.DEFAULT_INDC">
<template v-if="record.DefaultIndc == '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 > 0)" @click.prevent="onView">查看</a-button>
<a-button type="primary" v-if="canAmend" :icon="h(EditOutlined)"
:disabled="!(keys && keys.length > 0)" @click.prevent="onAmend">修改</a-button>
<a-button type="primary" v-if="canView" :icon="h(FileTextOutlined)"
:disabled="!(keys && keys.length > 0)"
@click.prevent="onViewVideoPreview">影视厅</a-button>
</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 { PublishVideoResultData } from "@/data/auto/publishVideoResultData";
import { PublishVideoEntity } from "@/data/auto/publishVideoEntity";
import { SearchFilter } from "@/data/auto/searchFilter"
import publishVideoService from "@/service/master/publishVideoService";
import { useYesNoPolicy } from "@/hooks/useYesNoPolicy"
import { PublishVideoSearchCriteria } from "@/data/auto/publishVideoSearchCriteria";
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, masterOperationToEnquiryMethodKey, MasterOperationToEnquiryModelOption, layoutProviderMethodKey } from "@/injections";
import { useOrderedChildren } from "@/hooks/use-ordered-children";
import { SearchCriteriaContext } from "@/injections";
import { useLoginProfileStore } from "@/store/modules/loginProfile";
//page from-----------------------------------------------------------------------------------------------------------------------------------
//================inject================
//报表名称(layout)
const layoutProviderMethod = inject(layoutProviderMethodKey);
//当前是弹出的Modal(page)
const isModal = ref(inject("isModalPublishVideo", false) as boolean);
//初始化查询条件的值(page)
const initBindOptions = ref(inject("initBindOptionsPublishVideo", []) as BindOption[]);
//记录单选还是多选(page)
const selectionType = ref(inject("selectionTypePublishVideo", 'radio') as string);
//================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: PublishVideoEntity.PUBLISH_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 1,
hidden: 'N'
},
{
title: "专辑名称",
dataIndex: PublishVideoEntity.PUBLISH_LOCAL_NAME,
sorter: true,
fixed: 'left',
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "专辑描述",
dataIndex: PublishVideoEntity.NOTICE,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
},
{
title: "默认",
dataIndex: PublishVideoEntity.DEFAULT_INDC,
sorter: true,
width: '25%',
sequence: 2,
hidden: 'N'
}
]);
const viewOption = {
Value: 'default',
SelectOptions: [{ BindValue: 'default', DisplayName: "默认" }],
Columns: [{ BindValue: 'default', BindColumn: columns }]
};
const bindOptions = ref<BindOption[]>([]);
const datas = ref<PublishVideoEntity[]>([]);
const pagingParams = ref<PagingParams>({ pageSize: 20, page: 1 });
const result = ref<SearchCriteriaResultData>(new SearchCriteriaResultData());
const data = ref<PublishVideoResultData>(new PublishVideoResultData());
const currentFilter = ref<SearchFilter[]>([]);
const isSearched = ref<boolean>(false);
const currentSearchCriteria = ref<PublishVideoSearchCriteria>(new PublishVideoSearchCriteria());
const keys = ref<PublishVideoEntity[]>([]);
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();
onSubmit(items.value[0].getFilter());
})
const onSelectChange = ((selected: PublishVideoEntity[]) => {
keys.value = selected;
})
const onRowDblclick = ((e: any, record: PublishVideoEntity) => {
if (isModal.value) {
emit('onRowDblclick', record);
}
else {
router.push({ name: "PublishVideoOperation", params: { id: record.PublishName, mode: 'view' } });
}
})
const onReset = (() => {
keys.value = [];
result.value.Total = 0;
})
const onViewVideoPreview = (() => {
if (keys.value.length == 0) return;
router.push({ name: "VideoPreviews", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onCreate = (() => {
router.push({ name: "PublishVideoOperation", params: { id: '', mode: 'create' } });
})
const onView = (() => {
if (keys.value.length == 0) return;
router.push({ name: "PublishVideoOperation", params: { id: keys.value[0].PublishName, mode: 'view' } });
})
const onAmend = (() => {
if (keys.value.length == 0) return;
let userLoginProfile = useLoginProfileStore();
if (keys.value[0].OwnerName != userLoginProfile.getUsername()) {
notification.info({
message: '系统提示:',
description: '你不是发布者,不能修改!',
placement: "topRight",
});
return;
}
router.push({ name: "PublishVideoOperation", params: { id: keys.value[0].PublishName, mode: 'amend' } });
})
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(PublishVideoEntity.DB_PUBLISH_NAME, '专辑编号', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOptions.value.push(bindOption);
bindOption = ubo.getBindOption(PublishVideoEntity.DB_PUBLISH_LOCAL_NAME, '专辑名称', SearchFilterTypePolicy.TEXT, SearchFilterOperatorPolicy.CONTAIN);
bindOption.lg = 10;
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: PublishVideoSearchCriteria = new PublishVideoSearchCriteria();
currentFilter.value = filters;
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 onPrint = (async () => {
let c: PublishVideoSearchCriteria = new PublishVideoSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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 publishVideoService.PrintBySearchCriteria(c);
} catch (error) {
console.log(error);
}
})
const findBySearchCriteria = (async (c: PublishVideoSearchCriteria) => {
if (isModal.value) {
c.IsModal = true;
}
data.value = await publishVideoService.FindBySearchCriteria(c);
result.value.Total = data.value.Total;
result.value.Page = data.value.Page;
result.value.Limit = data.value.Limit;
datas.value = data.value.Datas;
})
const onPagination = (async (params: PagingParams) => {
if (!isSearched.value) return;
let c: PublishVideoSearchCriteria = new PublishVideoSearchCriteria();
if (currentFilter.value.length > 0)
c.Filter = currentFilter.value;
else c.Filter = [];
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>
+82
View File
@@ -0,0 +1,82 @@
<template>
<dragModal :width="modal.width" v-model:open="modal.showModal" :title="title" :mask-closable="false">
<vue3VideoPlay ref="videoPlayerM3u8" v-if="videoType == 'm3u8'" :title="title" :src="modal.videoSrc" type="m3u8"
:autoPlay="true" />
<vue3VideoPlay ref="videoPlayerMp4" v-else :title="title" :src="modal.videoSrc" type="video/mp4"
:autoPlay="true" />
<template #footer>
<a-button type="primary" @click="handleSubmit">关闭</a-button>
</template>
</dragModal>
</template>
<script setup lang="ts">
import { watch, watchEffect, inject, reactive, ref, VNode, h, unref, onMounted, onBeforeMount } from "vue";
import dragModal from "@/components/basic/DragModal.vue"
const modal = reactive({
loading: false,
showModal: false,
videoSrc: '',
width: '850px'
});
const videoPlayerM3u8 = ref()
const videoPlayerMp4 = ref()
const title = ref(inject<string>("videoPlayTitle", '视频播放'));
const videoPlayModal = inject<boolean>("videoPlayModal");
const videoSrc = inject<string>("videoSrc");
modal.showModal = videoPlayModal!;
modal.videoSrc = videoSrc!;
import { bsInfo } from "@/utils/browser"
if (bsInfo.size.sm) {
modal.width = '350px';
}
else {
modal.width = '850px';
}
const videoType = ref(inject<string>("videoType", 'm3u8'));
//const videoSrc = ref('https://test-streams.mux.dev/x36xhzz/x36xhzz.m3u8');
// 视频播放器配置
const options = reactive({
src: modal.videoSrc, //视频源
})
const handleSubmit = async () => {
try {
modal.loading = true;
modal.showModal = false;
// console.log('-----------close video player -----------')
if (videoType.value == 'm3u8') {
videoPlayerM3u8.value?.pause();
videoPlayerM3u8.value?.removeAttribute('src');
videoPlayerM3u8.value?.load();
}
else {
videoPlayerMp4.value?.pause();
videoPlayerMp4.value?.removeAttribute('src');
videoPlayerMp4.value?.load();
}
} catch (error) {
} finally {
modal.loading = false;
}
};
</script>
<style scoped></style>