|
101 | 101 | </n-card> |
102 | 102 | </n-collapse-transition> |
103 | 103 | </div> |
| 104 | + <div v-if="isElectron" class="set-list"> |
| 105 | + <n-h3 prefix="bar"> |
| 106 | + 备份与恢复 |
| 107 | + <n-tag type="warning" size="small" round>Beta</n-tag> |
| 108 | + </n-h3> |
| 109 | + <n-card class="set-item"> |
| 110 | + <div class="label"> |
| 111 | + <n-text class="name">导出设置</n-text> |
| 112 | + <n-text class="tip" :depth="3">将当前所有设置导出为 JSON 文件</n-text> |
| 113 | + </div> |
| 114 | + <n-button type="primary" strong secondary @click="exportSettings"> 导出设置 </n-button> |
| 115 | + </n-card> |
| 116 | + <n-card class="set-item"> |
| 117 | + <div class="label"> |
| 118 | + <n-text class="name">导入设置</n-text> |
| 119 | + <n-text class="tip" :depth="3">从 JSON 文件恢复设置(导入后将自动重启)</n-text> |
| 120 | + </div> |
| 121 | + <n-button type="primary" strong secondary @click="importSettings"> 导入设置 </n-button> |
| 122 | + </n-card> |
| 123 | + </div> |
104 | 124 | <div class="set-list"> |
105 | 125 | <n-h3 prefix="bar"> 重置 </n-h3> |
106 | 126 | <n-card class="set-item"> |
|
125 | 145 | import { useSettingStore, useDataStore } from "@/stores"; |
126 | 146 | import { isElectron } from "@/utils/env"; |
127 | 147 | import { debounce } from "lodash-es"; |
| 148 | +import { NAlert, NTag } from "naive-ui"; |
128 | 149 |
|
129 | 150 | const dataStore = useDataStore(); |
130 | 151 | const settingStore = useSettingStore(); |
@@ -159,6 +180,69 @@ const testProxy = async () => { |
159 | 180 | window.$message.error("代理测试失败,请重试"); |
160 | 181 | } |
161 | 182 | testProxyLoading.value = false; |
| 183 | + testProxyLoading.value = false; |
| 184 | +}; |
| 185 | +
|
| 186 | +// 导出设置 |
| 187 | +const exportSettings = async () => { |
| 188 | + console.log("[Frontend] Export settings clicked"); |
| 189 | + try { |
| 190 | + // 收集渲染进程数据 (localStorage) |
| 191 | + const rendererData = { |
| 192 | + "setting-store": localStorage.getItem("setting-store"), |
| 193 | + "shortcut-store": localStorage.getItem("shortcut-store"), |
| 194 | + }; |
| 195 | + |
| 196 | + const result = await window.api.store.export(rendererData); |
| 197 | + console.log("[Frontend] Export result:", result); |
| 198 | + if (result) { |
| 199 | + window.$message.success("设置导出成功"); |
| 200 | + } else { |
| 201 | + window.$message.error("设置导出失败"); |
| 202 | + } |
| 203 | + } catch (error) { |
| 204 | + console.error("[Frontend] Export error:", error); |
| 205 | + window.$message.error("设置导出出错"); |
| 206 | + } |
| 207 | +}; |
| 208 | +
|
| 209 | +// 导入设置 |
| 210 | +const importSettings = async () => { |
| 211 | + console.log("[Frontend] Import settings clicked"); |
| 212 | + window.$dialog.warning({ |
| 213 | + title: "导入设置", |
| 214 | + content: () => h("div", null, [ |
| 215 | + h(NAlert, { type: "warning", showIcon: true, style: { marginBottom: "12px" } }, { default: () => "目前备份数据功能属于测试阶段,不保证可用性" }), |
| 216 | + h("div", null, "导入设置将覆盖当前所有配置并重启软件,是否继续?") |
| 217 | + ]), |
| 218 | + positiveText: "确定", |
| 219 | + negativeText: "取消", |
| 220 | + onPositiveClick: async () => { |
| 221 | + console.log("[Frontend] Import confirmed"); |
| 222 | + try { |
| 223 | + const data = await window.api.store.import(); |
| 224 | + console.log("[Frontend] Import data:", data); |
| 225 | + |
| 226 | + if (data) { |
| 227 | + // 恢复渲染进程数据 |
| 228 | + if (data.renderer) { |
| 229 | + if (data.renderer["setting-store"]) localStorage.setItem("setting-store", data.renderer["setting-store"]); |
| 230 | + if (data.renderer["shortcut-store"]) localStorage.setItem("shortcut-store", data.renderer["shortcut-store"]); |
| 231 | + } |
| 232 | + |
| 233 | + window.$message.success("设置导入成功,即将重启"); |
| 234 | + setTimeout(() => { |
| 235 | + window.location.reload(); |
| 236 | + }, 1000); |
| 237 | + } else { |
| 238 | + window.$message.error("设置导入失败或已取消"); |
| 239 | + } |
| 240 | + } catch (error) { |
| 241 | + console.error("[Frontend] Import error:", error); |
| 242 | + window.$message.error("设置导入出错"); |
| 243 | + } |
| 244 | + }, |
| 245 | + }); |
162 | 246 | }; |
163 | 247 |
|
164 | 248 | // 重置设置 |
|
0 commit comments