Browse Source

add:选择默认文件夹

master
prr 6 months ago
parent
commit
9411fe7461
  1. 22
      frontend/src/components/computer/Computer.vue
  2. 12
      frontend/src/components/ui/WinUpButtonGroup.vue
  3. 18
      frontend/src/components/window/IframeFile.vue
  4. 10
      frontend/src/components/window/MenuFooter.vue
  5. 2
      frontend/src/components/window/WindowInner.vue
  6. 10
      frontend/src/components/window/WindowTemplate.vue
  7. 67
      frontend/src/stores/choose.ts
  8. 10
      frontend/src/system/window/Dialog.ts

22
frontend/src/components/computer/Computer.vue

@ -154,6 +154,8 @@
turnLocalPath,
} from "@/util/sharePath.ts";
import { useChooseStore } from "@/stores/choose";
const { choseStart, chosing, choseEnd, getRect, Chosen } = useRectChosen();
const browserWindow: BrowserWindow | undefined = inject("browserWindow");
@ -171,11 +173,15 @@
const props = defineProps({
translateSavePath: {
type: Function
},
componentID:{
}
})
const setRouter = function (path: string) {
if (props.translateSavePath) {
if (props.translateSavePath && props.componentID) {
props.translateSavePath(path)
// router_url_history.value.push(path);
}
router_url.value = path;
if (
@ -190,6 +196,8 @@
router_url_history_index.value = router_url_history.value.length;
router_url_history.value.push(path);
};
const choose = useChooseStore()
const { refersh, createFolder, backFolder, openFolder, onComputerMount } =
useComputer({
setRouter: setRouter,
@ -355,6 +363,18 @@
shareShow.value =
system.getConfig("userType") === "member" ? true : false;
// console.log('', system.getConfig('userInfo').id);
//
if (props.translateSavePath && choose.saveFileContent.length > 0) {
// setRouter(choose.saveFileContent.defaultPath)
let pos = -1
choose.saveFileContent.forEach((item, index) => {
if (item.componentID == props.componentID) {
pos = index
}
})
if (pos !== -1) onTreeOpen(choose.saveFileContent[pos].defaultPath)
// console.log('',pos, choose.saveFileContent);
}
});
function handleOuterClick() {

12
frontend/src/components/ui/WinUpButtonGroup.vue

@ -40,10 +40,17 @@
<script lang="ts" setup>
import { BrowserWindow, WindowStateEnum } from '@/system/window/BrowserWindow';
import { UnwrapNestedRefs } from 'vue';
import { useChooseStore } from "@/stores/choose";
const choose = useChooseStore()
const props = defineProps<{
browserWindow: UnwrapNestedRefs<BrowserWindow>;
}>();
const close = () => {
if(choose.isExist(props.browserWindow.windowInfo.componentID)) {
choose.closeSaveFile(props.browserWindow.windowInfo.componentID)
}
props.browserWindow.destroy();
}
function handleEvent(event: string) {
switch (event) {
case 'min':
@ -59,7 +66,8 @@ function handleEvent(event: string) {
}
break;
case 'close':
props.browserWindow.destroy();
close();
// props.browserWindow.destroy();
break;
}
}

18
frontend/src/components/window/IframeFile.vue

@ -46,15 +46,16 @@ const saveFile = async (e: any) => {
if (data.ext) {
ext = data.ext;
}
const fileName = e.fileName == '' ? data.title : e.fileName
let path:string
e.filePath !== ""
? (path = `${e.filePath}/${e.fileName}.${ext}`)
: (path = `${SP}C${SP}Users${SP}Desktop${SP}${e.fileName}.${ext}`);
? (path = `${e.filePath}/${fileName}.${ext}`)
: (path = `${SP}C${SP}Users${SP}Desktop${SP}${fileName}.${ext}`);
// console.log('',path);
await writeFile(path, data, e.fileName);
await writeFile(path, data, e.fileName, true);
};
eventBus.on("saveFile", saveFile);
const writeFile = async (path: string, data: any, title: string) => {
const writeFile = async (path: string, data: any, title: string, isNewFile: boolean) => {
const isShare = ref(false);
const isWrite = ref(0);
if (isShareFile(path)) {
@ -74,12 +75,12 @@ const writeFile = async (path: string, data: any, title: string) => {
});
return;
}
} else if (await sys?.fs.exists(path)) {
} else if (await sys?.fs.exists(path) && isNewFile) {
let res = await Dialog.showMessageBox({
type: "info",
title: "提示",
message: "存在相同的文件名-" + title,
buttons: ["覆盖文件?", "取消"],
buttons: ["覆盖文件", "取消"],
});
//console.log(res)
if (res.response > 0) {
@ -130,7 +131,6 @@ const eventHandler = async (e: MessageEvent) => {
if (win.config && win.config.path) {
path = win.config.path;
//1
let fileTitleArr = path.split(SP).pop().split(".");
let oldExt = fileTitleArr.pop();
let fileTitle = fileTitleArr.join(".");
@ -141,11 +141,11 @@ const eventHandler = async (e: MessageEvent) => {
path = path.replace("." + oldExt, "." + ext);
}
} else {
choose.saveFile("选择地址", "*", componentID, eventData);
choose.saveFile("选择地址", "*", componentID, eventData, ext);
return;
// path = `${SP}C${SP}Users${SP}Desktop${SP}${title}.${ext}`;
}
writeFile(path, data, title);
writeFile(path, data, title, false);
} else if (eventData.type == "initSuccess") {
if (hasInit) {
return;

10
frontend/src/components/window/MenuFooter.vue

@ -12,7 +12,10 @@
<script lang="ts" setup>
import { BrowserWindow } from "@/system/window/BrowserWindow";
import { UnwrapNestedRefs, ref } from "vue";
import { useChooseStore } from "@/stores/choose";
import { notifyInfo } from "@/util/msg";
// import { emitEvent } from "@/system/event";
const choose = useChooseStore()
const props = defineProps<{
browserWindow: UnwrapNestedRefs<BrowserWindow>;
}>();
@ -21,10 +24,15 @@ let fileName = ref('未命名文件')
function cancleSave() {
props.browserWindow.close()
choose.closeSaveFile(props.browserWindow.windowInfo.componentID)
}
function saveFile() {
if (fileName.value == '') {
notifyInfo('请输入文件名称')
return
}
emit('translateSavePath','',fileName.value)
props.browserWindow.close()
cancleSave()
}
</script>

2
frontend/src/components/window/WindowInner.vue

@ -1,7 +1,7 @@
<template>
<IframeFile v-if="win.url" :src="win.url" :ext="win.ext" :eventType="win.eventType" />
<Suspense v-else>
<component v-if="win.content" :is="stepComponent(win.content)" :translateSavePath="translateSavePath"></component>
<component v-if="win.content" :is="stepComponent(win.content)" :translateSavePath="translateSavePath" :componentID="win.windowInfo.componentID"></component>
<RouterView v-else />
</Suspense>
<!-- <component :is="window.content"></component> -->

10
frontend/src/components/window/WindowTemplate.vue

@ -25,7 +25,7 @@
<div
class="wintmp_main"
:class="{ resizeing: resizemode != 'null' }"
:class="{ resizeing: resizemode != 'null', 'saveFileMain':browserWindow.windowInfo.footer}"
@mousedown.stop="predown"
@touchstart.stop.passive="predown"
@contextmenu.stop.prevent
@ -91,7 +91,7 @@
function translateSavePath (path: string, name?: string) {
if (browserWindow.windowInfo.footer) {
const pos = choose.saveFileContent.findIndex((item) => {
const pos = choose.saveFileContent.findIndex((item: any) => {
return item.componentID == browserWindow.windowInfo.componentID
})
if (pos == -1) return
@ -239,7 +239,11 @@
position: relative;
}
}
.saveFileMain {
:deep(.main) {
height: calc(100% - 60px);
}
}
.topwin {
// border: 1px solid #0078d7;
// box-shadow: var(--window-top-box-shadow);

67
frontend/src/stores/choose.ts

@ -1,14 +1,27 @@
import { defineStore } from "pinia"
import { BrowserWindow } from "@/system";
import { ref } from 'vue';
type ExtMap = {
[key: string]: string | string[]
}
export const useChooseStore = defineStore('chooseStore', () => {
const win:any = ref()
const path:any = ref([])
const ifShow = ref(false)
let savePath = ref({
path: '',
name: ''
})
const extArr: ExtMap = {
'Documents/Word': 'docx',
'Documents/PPT': 'pptx',
'Documents/Markdown': 'md',
'Documents/Excel': 'xlsx',
'Documents/Mind': 'mind',
'Documents/Kanban': 'kb',
'Documents/Baiban': 'bb',
'Documents/Screenshot': 'screenshot',
'Documents/ScreenRecoding': 'screentRecording',
'Pictures': ['png','jpg','webp','gif','bmp','tiff'],
'Music': 'mp3',
'Videos': 'mp4'
}
const saveFileContent = ref<any[]>([])
const select = (title = '选择文件', fileExt:any) => {
@ -31,8 +44,11 @@ export const useChooseStore = defineStore('chooseStore', () => {
win.value.show()
ifShow.value = true
}
const saveFile = (title: string, fileExt: any, componentID: string, eventData: any) => {
const saveFile = (title: string, fileExt: any, componentID: string, eventData: any, ext: string) => {
// console.log('保存文件');
// 判断是否已经存在
if (isExist(componentID)) return
// 打开弹窗
win.value = new BrowserWindow({
title,
content: "Computer",
@ -52,29 +68,58 @@ export const useChooseStore = defineStore('chooseStore', () => {
componentID
});
win.value.show()
// 默认路径
let defaultPath = ''
Object.keys(extArr).forEach( (item: string) => {
if (extArr[item] &&
((Array.isArray(extArr[item]) && extArr[item].includes(ext)) || extArr[item] == ext)
) {
defaultPath = item
}
})
defaultPath == '' ? defaultPath = '/D' : defaultPath = '/C/Users/' + defaultPath
// console.log('1111111:', defaultPath);
saveFileContent.value.push({
componentID,
eventData,
defaultPath,
filePath: '',
fileName: ''
})
return savePath
// ifShow.value = true
}
const close = () => {
ifShow.value = false
win.value.close()
ifShow.value = false
win.value.close()
}
// 清除缓存
const closeSaveFile = (componentID: string) => {
saveFileContent.value.forEach((item, index) => {
if (item.componentID == componentID) {
saveFileContent.value.splice(index, 1)
}
})
win.value.close()
}
// 判断弹窗是否存在
const isExist = (componentID: string) => {
saveFileContent.value.forEach(item => {
if (item.componentID == componentID) {
return true
}
})
return false
}
return {
win,
path,
ifShow,
savePath,
saveFileContent,
select,
close,
saveFile
saveFile,
closeSaveFile,
isExist
}
})

10
frontend/src/system/window/Dialog.ts

@ -79,12 +79,18 @@ class Dialog {
}>((resolve) => {
promres = resolve;
});
let confirmText = 'OK'
let cancleText = 'Cancel'
if (option.buttons && option.buttons.length == 2) {
confirmText = option.buttons[0]
cancleText = option.buttons[1]
}
ElMessageBox.confirm(
opt.message,
opt.title,
{
confirmButtonText: 'OK',
cancelButtonText: 'Cancel',
confirmButtonText: confirmText,
cancelButtonText: cancleText,
type: opt.type,
}
)

Loading…
Cancel
Save