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

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

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

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

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

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

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

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

@ -1,7 +1,7 @@
<template> <template>
<IframeFile v-if="win.url" :src="win.url" :ext="win.ext" :eventType="win.eventType" /> <IframeFile v-if="win.url" :src="win.url" :ext="win.ext" :eventType="win.eventType" />
<Suspense v-else> <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 /> <RouterView v-else />
</Suspense> </Suspense>
<!-- <component :is="window.content"></component> --> <!-- <component :is="window.content"></component> -->

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

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

67
frontend/src/stores/choose.ts

@ -1,14 +1,27 @@
import { defineStore } from "pinia" import { defineStore } from "pinia"
import { BrowserWindow } from "@/system"; import { BrowserWindow } from "@/system";
import { ref } from 'vue'; import { ref } from 'vue';
type ExtMap = {
[key: string]: string | string[]
}
export const useChooseStore = defineStore('chooseStore', () => { export const useChooseStore = defineStore('chooseStore', () => {
const win:any = ref() const win:any = ref()
const path:any = ref([]) const path:any = ref([])
const ifShow = ref(false) const ifShow = ref(false)
let savePath = ref({ const extArr: ExtMap = {
path: '', 'Documents/Word': 'docx',
name: '' '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 saveFileContent = ref<any[]>([])
const select = (title = '选择文件', fileExt:any) => { const select = (title = '选择文件', fileExt:any) => {
@ -31,8 +44,11 @@ export const useChooseStore = defineStore('chooseStore', () => {
win.value.show() win.value.show()
ifShow.value = true 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('保存文件'); // console.log('保存文件');
// 判断是否已经存在
if (isExist(componentID)) return
// 打开弹窗
win.value = new BrowserWindow({ win.value = new BrowserWindow({
title, title,
content: "Computer", content: "Computer",
@ -52,29 +68,58 @@ export const useChooseStore = defineStore('chooseStore', () => {
componentID componentID
}); });
win.value.show() 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({ saveFileContent.value.push({
componentID, componentID,
eventData, eventData,
defaultPath,
filePath: '', filePath: '',
fileName: '' fileName: ''
}) })
return savePath
// ifShow.value = true // ifShow.value = true
} }
const close = () => { const close = () => {
ifShow.value = false ifShow.value = false
win.value.close() 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 { return {
win, win,
path, path,
ifShow, ifShow,
savePath,
saveFileContent, saveFileContent,
select, select,
close, close,
saveFile saveFile,
closeSaveFile,
isExist
} }
}) })

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

@ -79,12 +79,18 @@ class Dialog {
}>((resolve) => { }>((resolve) => {
promres = 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( ElMessageBox.confirm(
opt.message, opt.message,
opt.title, opt.title,
{ {
confirmButtonText: 'OK', confirmButtonText: confirmText,
cancelButtonText: 'Cancel', cancelButtonText: cancleText,
type: opt.type, type: opt.type,
} }
) )

Loading…
Cancel
Save