|
|
@ -2,59 +2,47 @@ |
|
|
|
<div class="container"> |
|
|
|
<div class="nav"> |
|
|
|
<ul> |
|
|
|
<li |
|
|
|
v-for="(item, index) in items" |
|
|
|
:key="index" |
|
|
|
@click="selectItem(index)" |
|
|
|
:class="{ active: index === activeIndex }" |
|
|
|
> |
|
|
|
<li v-for="(item, index) in items" :key="index" @click="selectItem(index)" |
|
|
|
:class="{ active: index === activeIndex }"> |
|
|
|
{{ item }} |
|
|
|
</li> |
|
|
|
</ul> |
|
|
|
</div> |
|
|
|
<div class="setting"> |
|
|
|
<div v-if="1 === activeIndex"> |
|
|
|
<div |
|
|
|
class="setting-item" |
|
|
|
style="margin-top: 60px" |
|
|
|
> |
|
|
|
<div class="setting-item" style="margin-top: 60px"> |
|
|
|
<label>存储方式</label> |
|
|
|
<el-select v-model="config.storeType"> |
|
|
|
<el-option |
|
|
|
v-for="(item, key) in storeList" |
|
|
|
:key="key" |
|
|
|
:label="item.title" |
|
|
|
:value="item.value" |
|
|
|
/> |
|
|
|
<el-option v-for="(item, key) in storeList" :key="key" :label="item.title" |
|
|
|
:value="item.value" /> |
|
|
|
</el-select> |
|
|
|
</div> |
|
|
|
<div |
|
|
|
class="setting-item" |
|
|
|
v-if="config.storeType === 'local'" |
|
|
|
> |
|
|
|
<template v-if="config.storeType === 'local'"> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>存储地址</label> |
|
|
|
<el-input |
|
|
|
v-model="config.storePath" |
|
|
|
@click="selectFile()" |
|
|
|
placeholder="可为空,为空则取系统默认存储地址" |
|
|
|
/> |
|
|
|
<el-input v-model="config.storePath" @click="selectFile()" |
|
|
|
placeholder="可为空,为空则取系统默认存储地址:/用户目录/.godoos/os" /> |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>自定义端口</label> |
|
|
|
<el-input v-model="config.netPort" placeholder="可为空,为空则取系统默认56780" /> |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>自定义路径</label> |
|
|
|
<el-input v-model="config.netPath" placeholder="自定义web访问路径,英文,不要加斜杠,可为空" /> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
|
<template v-if="config.storeType === 'net'"> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>服务器地址</label> |
|
|
|
<el-input |
|
|
|
v-model="config.storenet.url" |
|
|
|
placeholder="http://192.168.1.16:56780 不要加斜杠" |
|
|
|
/> |
|
|
|
<el-input v-model="config.storenet.url" placeholder="可访问的地址,例如http://192.168.1.6:56780 不要加斜杠" /> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<template v-if="config.storeType === 'webdav'"> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>服务器地址</label> |
|
|
|
<el-input |
|
|
|
v-model="config.webdavClient.url" |
|
|
|
placeholder="https://godoos.com/webdav 不要加斜杠" |
|
|
|
/> |
|
|
|
<el-input v-model="config.webdavClient.url" placeholder="https://godoos.com/webdav 不要加斜杠" /> |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>登陆用户名</label> |
|
|
@ -62,19 +50,13 @@ |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>登陆密码</label> |
|
|
|
<el-input |
|
|
|
v-model="config.webdavClient.password" |
|
|
|
type="password" |
|
|
|
/> |
|
|
|
<el-input v-model="config.webdavClient.password" type="password" /> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
|
<div class="setting-item"> |
|
|
|
<label></label> |
|
|
|
<el-button |
|
|
|
@click="submitOsInfo" |
|
|
|
type="primary" |
|
|
|
> |
|
|
|
<el-button @click="submitOsInfo" type="primary"> |
|
|
|
{{ t("confirm") }} |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
@ -86,10 +68,7 @@ |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label></label> |
|
|
|
<el-button |
|
|
|
@click="exportBackup" |
|
|
|
type="primary" |
|
|
|
> |
|
|
|
<el-button @click="exportBackup" type="primary"> |
|
|
|
导出 |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
@ -98,73 +77,42 @@ |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label></label> |
|
|
|
<el-button |
|
|
|
@click="selectZipfile" |
|
|
|
type="primary" |
|
|
|
> |
|
|
|
<el-button @click="selectZipfile" type="primary"> |
|
|
|
导入 |
|
|
|
</el-button> |
|
|
|
<input |
|
|
|
type="file" |
|
|
|
accept=".zip" |
|
|
|
style="display: none" |
|
|
|
ref="zipFileInput" |
|
|
|
/> |
|
|
|
<input type="file" accept=".zip" style="display: none" ref="zipFileInput" /> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div v-if="0 === activeIndex"> |
|
|
|
<div |
|
|
|
class="setting-item" |
|
|
|
style="margin-top: 60px" |
|
|
|
> |
|
|
|
<div class="setting-item" style="margin-top: 60px"> |
|
|
|
<label>用户角色</label> |
|
|
|
<el-select v-model="config.userType"> |
|
|
|
<el-option |
|
|
|
v-for="(item, key) in userTypes" |
|
|
|
:key="key" |
|
|
|
:label="item.title" |
|
|
|
:value="item.value" |
|
|
|
/> |
|
|
|
<el-option v-for="(item, key) in userTypes" :key="key" :label="item.title" |
|
|
|
:value="item.value" /> |
|
|
|
</el-select> |
|
|
|
</div> |
|
|
|
<template v-if="config.userType === 'member'"> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>服务器地址</label> |
|
|
|
<el-input |
|
|
|
v-model="config.userInfo.url" |
|
|
|
placeholder="网址或域名,例子:https://godoos.com 不要加斜杠" |
|
|
|
/> |
|
|
|
<el-input v-model="config.userInfo.url" placeholder="网址或域名,例子:https://godoos.com 不要加斜杠" /> |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>用户名</label> |
|
|
|
<el-input |
|
|
|
v-model="config.userInfo.username" |
|
|
|
placeholder="登录用户名" |
|
|
|
/> |
|
|
|
<el-input v-model="config.userInfo.username" placeholder="登录用户名" /> |
|
|
|
</div> |
|
|
|
<div class="setting-item"> |
|
|
|
<label>密码</label> |
|
|
|
<el-input |
|
|
|
v-model="config.userInfo.password" |
|
|
|
type="password" |
|
|
|
placeholder="登录密码" |
|
|
|
/> |
|
|
|
<el-input v-model="config.userInfo.password" type="password" placeholder="登录密码" /> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<div class="setting-item"> |
|
|
|
<label></label> |
|
|
|
<el-button |
|
|
|
@click="saveUserInfo" |
|
|
|
type="primary" |
|
|
|
> |
|
|
|
<el-button @click="saveUserInfo" type="primary"> |
|
|
|
{{ t("confirm") }} |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div |
|
|
|
v-if="3 === activeIndex" |
|
|
|
class="setting-area" |
|
|
|
> |
|
|
|
<div v-if="3 === activeIndex" class="setting-area"> |
|
|
|
<SetFilePwd v-if="config.userType === 'person'"></SetFilePwd> |
|
|
|
</div> |
|
|
|
</div> |
|
|
@ -172,23 +120,23 @@ |
|
|
|
</template> |
|
|
|
|
|
|
|
<script lang="ts" setup> |
|
|
|
import { Dialog, join, System, t } from "@/system"; |
|
|
|
import { |
|
|
|
import { Dialog, join, System, t } from "@/system"; |
|
|
|
import { |
|
|
|
getClientId, |
|
|
|
getSystemConfig, |
|
|
|
setSystemConfig, |
|
|
|
} from "@/system/config"; |
|
|
|
import { OpenDirDialog, RestartApp } from "@/util/goutil"; |
|
|
|
import { notifyError, notifySuccess } from "@/util/msg"; |
|
|
|
import FileSaver from "file-saver"; |
|
|
|
import JSZip from "jszip"; |
|
|
|
import { inject, ref } from "vue"; |
|
|
|
const config = ref(getSystemConfig()); |
|
|
|
const sys = inject<System>("system")!; |
|
|
|
let zipFile: File | undefined = undefined; |
|
|
|
const zipFileInput = ref(); |
|
|
|
const fileName: any = ref(""); |
|
|
|
const storeList = [ |
|
|
|
} from "@/system/config"; |
|
|
|
import { OpenDirDialog, RestartApp } from "@/util/goutil"; |
|
|
|
import { notifyError, notifySuccess } from "@/util/msg"; |
|
|
|
import FileSaver from "file-saver"; |
|
|
|
import JSZip from "jszip"; |
|
|
|
import { inject, ref } from "vue"; |
|
|
|
const config = ref(getSystemConfig()); |
|
|
|
const sys = inject<System>("system")!; |
|
|
|
let zipFile: File | undefined = undefined; |
|
|
|
const zipFileInput = ref(); |
|
|
|
const fileName: any = ref(""); |
|
|
|
const storeList = [ |
|
|
|
// { |
|
|
|
// title: "浏览器存储", |
|
|
|
// value: "browser", |
|
|
@ -205,11 +153,11 @@ |
|
|
|
title: "webdav", |
|
|
|
value: "webdav", |
|
|
|
}, |
|
|
|
]; |
|
|
|
]; |
|
|
|
|
|
|
|
const items = ["用户角色", "个人存储", "备份还原", "文件密码箱"]; |
|
|
|
const urlRegex = /^(https?:\/\/)/; |
|
|
|
const userTypes = [ |
|
|
|
const items = ["用户角色", "存储配置", "备份还原", "文件密码箱"]; |
|
|
|
const urlRegex = /^(https?:\/\/)/; |
|
|
|
const userTypes = [ |
|
|
|
{ |
|
|
|
title: "独立用户", |
|
|
|
value: "person", |
|
|
@ -218,41 +166,26 @@ |
|
|
|
title: "企业用户", |
|
|
|
value: "member", |
|
|
|
}, |
|
|
|
]; |
|
|
|
const activeIndex = ref(0); |
|
|
|
]; |
|
|
|
const activeIndex = ref(0); |
|
|
|
|
|
|
|
const selectItem = (index: number) => { |
|
|
|
const selectItem = (index: number) => { |
|
|
|
activeIndex.value = index; |
|
|
|
}; |
|
|
|
function selectFile() { |
|
|
|
}; |
|
|
|
function selectFile() { |
|
|
|
OpenDirDialog().then((res: string) => { |
|
|
|
config.value.storePath = res; |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function submitOsInfo() { |
|
|
|
function submitOsInfo() { |
|
|
|
const saveData = toRaw(config.value); |
|
|
|
const postData: any = { |
|
|
|
//name: "osPath", |
|
|
|
type: saveData.storeType, |
|
|
|
}; |
|
|
|
if (saveData.storeType === "browser") { |
|
|
|
setSystemConfig(saveData); |
|
|
|
RestartApp(); |
|
|
|
return; |
|
|
|
} |
|
|
|
if (saveData.storeType === "local") { |
|
|
|
if (saveData.storePath === "") { |
|
|
|
setSystemConfig(saveData); |
|
|
|
RestartApp(); |
|
|
|
return; |
|
|
|
} |
|
|
|
postData.name = "osPath"; |
|
|
|
postData.value = saveData.storePath; |
|
|
|
const postData = parseData(saveData); |
|
|
|
const postUrl = config.value.apiUrl + "/system/setting"; |
|
|
|
fetch(postUrl, { |
|
|
|
method: "POST", |
|
|
|
body: JSON.stringify([postData]), |
|
|
|
body: JSON.stringify(postData), |
|
|
|
}) |
|
|
|
.then((res) => res.json()) |
|
|
|
.then((res) => { |
|
|
@ -305,12 +238,13 @@ |
|
|
|
}); |
|
|
|
return; |
|
|
|
} |
|
|
|
postData.name = "webdavClient"; |
|
|
|
postData.value = saveData.webdavClient; |
|
|
|
const postUrl = config.value.apiUrl + "/system/setting"; |
|
|
|
fetch(postUrl, { |
|
|
|
method: "POST", |
|
|
|
body: JSON.stringify([postData]), |
|
|
|
body: JSON.stringify([{ |
|
|
|
name: "webdavClient", |
|
|
|
value: saveData.webdavClient, |
|
|
|
}]), |
|
|
|
}) |
|
|
|
.then((res) => res.json()) |
|
|
|
.then((res) => { |
|
|
@ -325,8 +259,28 @@ |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function parseData(saveData: any) { |
|
|
|
let postData = [] |
|
|
|
if (saveData.storePath !== "") { |
|
|
|
postData.push({ name: "osPath", value: saveData.storePath }) |
|
|
|
} |
|
|
|
if (saveData.netPort != "" && saveData.netPort != "56780" && !isNaN(saveData.netPort) && saveData.netPort*1 > 0 && saveData.netPort*1 < 65535) { |
|
|
|
postData.push({ |
|
|
|
name: "netPort", |
|
|
|
value: saveData.netPort, |
|
|
|
}); |
|
|
|
} |
|
|
|
if (saveData.netPath != "" && /^[A-Za-z]+$/.test(saveData.netPath)) { |
|
|
|
postData.push({ |
|
|
|
name: "netPath", |
|
|
|
value: saveData.netPath, |
|
|
|
}); |
|
|
|
} |
|
|
|
async function saveUserInfo() { |
|
|
|
return postData; |
|
|
|
} |
|
|
|
async function saveUserInfo() { |
|
|
|
const saveData = toRaw(config.value); |
|
|
|
if (saveData.userType == "person") { |
|
|
|
setSystemConfig(saveData); |
|
|
@ -378,8 +332,8 @@ |
|
|
|
notifyError("登录失败"); |
|
|
|
} |
|
|
|
return; |
|
|
|
} |
|
|
|
async function exportBackup() { |
|
|
|
} |
|
|
|
async function exportBackup() { |
|
|
|
const { setProgress } = Dialog.showProcessDialog({ |
|
|
|
message: `正在打包`, |
|
|
|
}); |
|
|
@ -401,8 +355,8 @@ |
|
|
|
setProgress(100); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|
async function dfsPackage(path: string, zip: JSZip, setProgress: any) { |
|
|
|
} |
|
|
|
async function dfsPackage(path: string, zip: JSZip, setProgress: any) { |
|
|
|
const dir = await sys.fs.readdir(path); |
|
|
|
|
|
|
|
for (let i = 0; i < dir.length; i++) { |
|
|
@ -423,8 +377,8 @@ |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
function selectZipfile() { |
|
|
|
} |
|
|
|
function selectZipfile() { |
|
|
|
zipFileInput.value.click(); |
|
|
|
zipFileInput.value.onchange = (e: any) => { |
|
|
|
const tar: any = e.target as HTMLInputElement; |
|
|
@ -437,8 +391,8 @@ |
|
|
|
fileName.value = ""; |
|
|
|
} |
|
|
|
}; |
|
|
|
} |
|
|
|
async function importBackup(path = "") { |
|
|
|
} |
|
|
|
async function importBackup(path = "") { |
|
|
|
if (!zipFile) { |
|
|
|
return; |
|
|
|
} |
|
|
@ -480,21 +434,22 @@ |
|
|
|
}); |
|
|
|
}, 100); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
</script> |
|
|
|
<style scoped> |
|
|
|
@import "./setStyle.css"; |
|
|
|
@import "./setStyle.css"; |
|
|
|
|
|
|
|
.ctrl { |
|
|
|
.ctrl { |
|
|
|
width: 100px; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
.setting-item { |
|
|
|
.setting-item { |
|
|
|
display: flex; |
|
|
|
align-items: center; |
|
|
|
} |
|
|
|
.setting-area { |
|
|
|
} |
|
|
|
|
|
|
|
.setting-area { |
|
|
|
width: 100%; |
|
|
|
height: 90%; |
|
|
|
} |
|
|
|
} |
|
|
|
</style> |
|
|
|