文件选择器添加网络资源获取功能
This commit is contained in:
@@ -12,6 +12,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { defineComponent } from 'vue';
|
import { defineComponent } from 'vue';
|
||||||
import { ref, defineProps, PropType, watch, onMounted, h } from 'vue';
|
import { ref, defineProps, PropType, watch, onMounted, h } from 'vue';
|
||||||
|
import { successNotification } from '/@/utils/message';
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
fileData: { type: Object as PropType<any>, required: true },
|
fileData: { type: Object as PropType<any>, required: true },
|
||||||
api: { type: Object as PropType<any>, required: true },
|
api: { type: Object as PropType<any>, required: true },
|
||||||
@@ -26,7 +27,10 @@ const FileTypes = [
|
|||||||
const isShow = ref<boolean>(false);
|
const isShow = ref<boolean>(false);
|
||||||
const itemRef = ref<HTMLDivElement>();
|
const itemRef = ref<HTMLDivElement>();
|
||||||
const data = ref<any>(null);
|
const data = ref<any>(null);
|
||||||
const delFileHandle = () => props.api.DelObj(props.fileData.id).then(() => emit('onDelFile'));
|
const delFileHandle = () => props.api.DelObj(props.fileData.id).then(() => {
|
||||||
|
successNotification('删除成功');
|
||||||
|
emit('onDelFile');
|
||||||
|
});
|
||||||
watch(props.fileData, (nVal) => data.value = nVal, { immediate: true, deep: true });
|
watch(props.fileData, (nVal) => data.value = nVal, { immediate: true, deep: true });
|
||||||
const emit = defineEmits(['onDelFile']);
|
const emit = defineEmits(['onDelFile']);
|
||||||
defineExpose({});
|
defineExpose({});
|
||||||
|
|||||||
@@ -105,7 +105,8 @@
|
|||||||
:on-success="() => { listRequest(); listRequestAll(); uploadRef.clearFiles(); }">
|
:on-success="() => { listRequest(); listRequestAll(); uploadRef.clearFiles(); }">
|
||||||
<el-button type="primary" icon="plus">上传{{ TypeLabel[tabsActived % 4] }}</el-button>
|
<el-button type="primary" icon="plus">上传{{ TypeLabel[tabsActived % 4] }}</el-button>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-button type="info" icon="link"> 网络{{ TypeLabel[tabsActived % 4] }} </el-button>
|
<el-button type="info" icon="link" @click="netVisiable = true"> 网络{{ TypeLabel[tabsActived % 4] }}
|
||||||
|
</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@@ -123,6 +124,26 @@
|
|||||||
:hide-on-single-page="false" @change="handlePageChange" />
|
:hide-on-single-page="false" @change="handlePageChange" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 只要在获取中,最大程度阻止关闭dialog -->
|
||||||
|
<el-dialog v-model="netVisiable" :draggable="false" width="50%" :align-center="false" :append-to-body="true"
|
||||||
|
:title="'网络' + TypeLabel[tabsActived % 4] + '上传'" @closed="netUrl = ''" :close-on-click-modal="!netLoading"
|
||||||
|
:close-on-press-escape="!netLoading" :show-close="netLoading" modal-class="_overlay">
|
||||||
|
<el-form-item :label="TypeLabel[tabsActived % 4] + '链接'">
|
||||||
|
<el-input v-model="netUrl" placeholder="请输入网络连接" clearable>
|
||||||
|
<template #prepend>
|
||||||
|
<el-select v-model="netPrefix" style="width: 110px;">
|
||||||
|
<el-option v-for="item, index in ['HTTP://', 'HTTPS://']" :key="index" :label="item" :value="item" />
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
</el-input>
|
||||||
|
</el-form-item>
|
||||||
|
<template #footer>
|
||||||
|
<el-button v-if="!netLoading" type="default" @click="netVisiable = false">取消</el-button>
|
||||||
|
<el-button type="primary" @click="confirmNetUrl" :loading="netLoading">
|
||||||
|
{{ netLoading ? '网络文件获取中...' : '确定' }}
|
||||||
|
</el-button>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
<template #footer v-if="props.showInput">
|
<template #footer v-if="props.showInput">
|
||||||
<el-button type="default" @click="onClose">取消</el-button>
|
<el-button type="default" @click="onClose">取消</el-button>
|
||||||
<el-button type="primary" @click="onSave">确定</el-button>
|
<el-button type="primary" @click="onSave">确定</el-button>
|
||||||
@@ -141,10 +162,12 @@ import FileItem from './fileItem.vue';
|
|||||||
import { pluginsAll } from '/@/views/plugins/index';
|
import { pluginsAll } from '/@/views/plugins/index';
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import { useUserInfo } from "/@/stores/userInfo";
|
import { useUserInfo } from "/@/stores/userInfo";
|
||||||
|
import { errorNotification, successNotification } from '/@/utils/message';
|
||||||
|
|
||||||
|
const userInfos = storeToRefs(useUserInfo()).userInfos;
|
||||||
|
const isTenentMode = !!(pluginsAll && pluginsAll.length && pluginsAll.indexOf('dvadmin3-tenants-web') >= 0);
|
||||||
|
const isSuperTenent = (userInfos.value as any).schema_name === 'public';
|
||||||
|
|
||||||
const isTenentMode = pluginsAll && pluginsAll.length && pluginsAll.indexOf('dvadmin3-tenants-web') >= 0;
|
|
||||||
const userInfos = storeToRefs(useUserInfo()).userInfos
|
|
||||||
const isSuperTenent = userInfos.value.schema_name === 'public';
|
|
||||||
const TypeLabel = ['图片', '视频', '音频', '文件']
|
const TypeLabel = ['图片', '视频', '音频', '文件']
|
||||||
const AcceptList = ['image/*', 'video/*', 'audio/*', ''];
|
const AcceptList = ['image/*', 'video/*', 'audio/*', ''];
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@@ -185,6 +208,7 @@ const tabsActived = ref<number>([3, 2, 1, 0][((props.tabsShow & (props.tabsShow
|
|||||||
const fileApiPrefix = '/api/system/file/';
|
const fileApiPrefix = '/api/system/file/';
|
||||||
const fileApi = {
|
const fileApi = {
|
||||||
GetList: (query: UserPageQuery) => request({ url: fileApiPrefix, method: 'get', params: query }),
|
GetList: (query: UserPageQuery) => request({ url: fileApiPrefix, method: 'get', params: query }),
|
||||||
|
AddObj: (obj: AddReq) => request({ url: fileApiPrefix, method: 'post', data: obj }),
|
||||||
DelObj: (id: DelReq) => request({ url: fileApiPrefix + id + '/', method: 'delete', data: { id } }),
|
DelObj: (id: DelReq) => request({ url: fileApiPrefix + id + '/', method: 'delete', data: { id } }),
|
||||||
GetAll: () => request({ url: fileApiPrefix + 'get_all/' }),
|
GetAll: () => request({ url: fileApiPrefix + 'get_all/' }),
|
||||||
};
|
};
|
||||||
@@ -286,6 +310,38 @@ const clearState = () => {
|
|||||||
const clear = () => { data.value = null; onDataChange(null); }
|
const clear = () => { data.value = null; onDataChange(null); }
|
||||||
|
|
||||||
|
|
||||||
|
// 网络文件部分
|
||||||
|
const netLoading = ref<boolean>(false);
|
||||||
|
const netVisiable = ref<boolean>(false);
|
||||||
|
const netUrl = ref<string>('');
|
||||||
|
const netPrefix = ref<string>('HTTP://');
|
||||||
|
const confirmNetUrl = () => {
|
||||||
|
if (!netUrl.value) return;
|
||||||
|
netLoading.value = true;
|
||||||
|
fetch(netUrl.value).then(async (res: Response) => {
|
||||||
|
if (!res.ok) errorNotification(`网络${TypeLabel[tabsActived.value % 4]}获取失败,链接 ${netUrl.value}`);
|
||||||
|
const _ = res.url.split('?')[0].split('/');
|
||||||
|
let filename = _[_.length - 1];
|
||||||
|
// let filetype = res.headers.get('content-type')?.split('/')[1] || '';
|
||||||
|
let blob = await res.blob();
|
||||||
|
let file = new File([blob], filename, { type: blob.type });
|
||||||
|
let form = new FormData();
|
||||||
|
form.append('file', file);
|
||||||
|
form.append('upload_method', '1');
|
||||||
|
fetch(getBaseURL() + 'api/system/file/', { method: 'post', body: form })
|
||||||
|
.then(() => successNotification('网络文件获取成功!'))
|
||||||
|
.then(() => {
|
||||||
|
netLoading.value = false;
|
||||||
|
netVisiable.value = false;
|
||||||
|
listRequest();
|
||||||
|
listRequestAll();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// fs-crud部分
|
// fs-crud部分
|
||||||
const data = ref<any>(null);
|
const data = ref<any>(null);
|
||||||
const emit = defineEmits(['update:modelValue', 'onSave', 'onClose', 'onClosed']);
|
const emit = defineEmits(['update:modelValue', 'onSave', 'onClose', 'onClosed']);
|
||||||
|
|||||||
Reference in New Issue
Block a user