From af1dda074b9aea1a8061a322bfa7dec1b4d9e6c1 Mon Sep 17 00:00:00 2001 From: Soltus Date: Tue, 2 Apr 2024 01:14:16 +0800 Subject: [PATCH] =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D=E4=B8=8E?= =?UTF-8?q?=E4=BD=93=E9=AA=8C=E4=BC=98=E5=8C=96=20#606?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 2 +- .github/README_Sillot.md | 5 +-- app/appearance/langs/zh_CN.json | 2 +- app/src/boot/onGetConfig.ts | 1 + app/src/config/about.ts | 4 +-- app/src/dialog/processSystem.ts | 5 +++ app/src/index.ts | 12 ++++++- app/src/menus/workspace.ts | 2 ++ app/src/mobile/index.ts | 16 +++++++-- app/src/mobile/menu/index.ts | 1 + app/src/mobile/settings/about.ts | 4 ++- app/src/types/index.d.ts | 1 + app/src/types/sillot.d.ts | 1 + app/stage/auth.html | 23 ++++++------- kernel/api/router.go | 1 + kernel/api/system.go | 28 ++++++++++++++++ kernel/model/conf.go | 54 +++++++++++++++++++++++++++++++ kernel/model/export.go | 3 +- kernel/model/process.go | 2 +- kernel/util/working_mobile.go | 2 +- screenshots/sillot/framework.png | Bin 20742 -> 0 bytes 21 files changed, 143 insertions(+), 26 deletions(-) delete mode 100644 screenshots/sillot/framework.png diff --git a/.editorconfig b/.editorconfig index 6f47929bcc..86a7f55e72 100644 --- a/.editorconfig +++ b/.editorconfig @@ -6,7 +6,7 @@ root = true [*] charset = utf-8 end_of_line = lf -indent_size = 2 +indent_size = 4 indent_style = space insert_final_newline = true trim_trailing_whitespace = false diff --git a/.github/README_Sillot.md b/.github/README_Sillot.md index e58b9a8d0a..5f7c27511f 100644 --- a/.github/README_Sillot.md +++ b/.github/README_Sillot.md @@ -30,11 +30,8 @@ ## 彖乄驱动 -汐洛始终代表先进恣产力,始终拥护全球先进开源力量,坚定不移推动新彖乄面向未来持续发展。 +汐洛始终代表先进恣产力,始终拥抱全球先进开源力量,坚定不移推动新彖乄面向未来持续发展。 -

-framework -

## 极致优雅 diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 18c6cb1bf2..1ee3cb4817 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1082,7 +1082,7 @@ "about13": "API token", "about14": "调用 API 时需要通过该 token 进行鉴权", "about17": "设置为 直接连接 时不启用代理", - "about18": "使用非环回地址(127.0.0.1/[::1])时请先设置 访问授权码", + "about18": "未设置访问授权码时仅可通过环回地址(127.0.0.1/[::1])访问", "checkUpdate": "检查更新", "currentVer": "当前版本", "downloadLatestVer": "下载最新版", diff --git a/app/src/boot/onGetConfig.ts b/app/src/boot/onGetConfig.ts index 291b1d92eb..3eb8e1239b 100644 --- a/app/src/boot/onGetConfig.ts +++ b/app/src/boot/onGetConfig.ts @@ -190,6 +190,7 @@ export const initWindow = async (app: App) => { ipcRenderer.send(Constants.SIYUAN_CMD, "closeButtonBehavior"); } } else { + console.warn("initWindow -> exitSiYuan() involved (winOnClose)"); exitSiYuan(); } }, diff --git a/app/src/config/about.ts b/app/src/config/about.ts index bf031f532a..34b0d2ca63 100644 --- a/app/src/config/about.ts +++ b/app/src/config/about.ts @@ -314,10 +314,10 @@ ${ const networkServeElement = about.element.querySelector("#networkServe") as HTMLInputElement; networkServeElement.addEventListener("change", () => { fetchPost("/api/system/setNetworkServe", {networkServe: networkServeElement.checked}, () => { - if (window.JSAndroid && networkServeElement.checked) { + if (window.JSAndroid && networkServeElement.checked) { // 安卓平板 window.JSAndroid?.requestPermissionActivity("Battery","注意:后台稳定伺服会消耗额外电量","coldRestart"); } else if (window.JSAndroid) { - window.JSAndroid?.restartSillotAndroid(); + window.Sillot?.androidRestartSiYuan(); } else { exportLayout({ errorExit: true, diff --git a/app/src/dialog/processSystem.ts b/app/src/dialog/processSystem.ts index f32b0132db..9d25b62069 100644 --- a/app/src/dialog/processSystem.ts +++ b/app/src/dialog/processSystem.ts @@ -152,6 +152,10 @@ export const kernelError = () => { if (document.querySelector("#errorLog")) { return; } + if (window.JSAndroid) { + window.JSAndroid.androidReboot(); + return; + } let iosReStart = ""; if (isInIOS()) { iosReStart = `
`; @@ -268,6 +272,7 @@ export const transactionError = () => { dialog.element.setAttribute("data-key", Constants.DIALOG_STATEEXCEPTED); const btnsElement = dialog.element.querySelectorAll(".b3-button"); btnsElement[0].addEventListener("click", () => { + console.warn(`transactionError ${btnsElement[0]}.onClick -> exitSiYuan() involved`); /// #if MOBILE exitSiYuan(); /// #else diff --git a/app/src/index.ts b/app/src/index.ts index 29b02ea37a..130e1a1e9b 100644 --- a/app/src/index.ts +++ b/app/src/index.ts @@ -23,7 +23,7 @@ import { import { initMessage } from "./dialog/message"; import { getAllTabs } from "./layout/getAll"; import { getLocalStorage } from "./protyle/util/compatibility"; -import { importIDB } from "./sillot/util/sillot-idb-backup-and-restore"; +import { exportIDB, importIDB } from "./sillot/util/sillot-idb-backup-and-restore"; import { SillotEnv } from "./sillot"; import {getSearch} from "./util/functions"; import {hideAllElements} from "./protyle/ui/hideElements"; @@ -151,6 +151,16 @@ export class App { }), }; new SillotEnv(); + window.Sillot.androidRestartSiYuan = ()=>{ + const overlay = document.querySelector('#SillotOverlay') as HTMLElement; + overlay.style.display = "block"; + exportIDB().then(() => { + hideAllElements(["util"]); + fetchPost("/api/sillot/androidReboot", {force: true}, (response) => { + window.location.href = "siyuan://androidRestartSiYuan"; + }); + }) + }; fetchPost("/api/system/getConf", {}, async (response) => { addScriptSync(`${Constants.PROTYLE_CDN}/js/lute/lute.min.js?v=${Constants.SIYUAN_VERSION}`, "protyleLuteScript"); diff --git a/app/src/menus/workspace.ts b/app/src/menus/workspace.ts index 719fd0843e..0bd228d229 100644 --- a/app/src/menus/workspace.ts +++ b/app/src/menus/workspace.ts @@ -175,6 +175,7 @@ export const workspaceMenu = (app: App, rect: DOMRect) => { fetchPost("/api/system/setWorkspaceDir", { path: openPath }, () => { + console.warn(`workspaceMenu -> exitSiYuan() involved (${window.siyuan.languages.openBy})`); exitSiYuan(); }); }); @@ -205,6 +206,7 @@ export const workspaceMenu = (app: App, rect: DOMRect) => { fetchPost("/api/system/setWorkspaceDir", { path: item.path }, () => { + console.warn(`workspaceMenu -> exitSiYuan() involved (${pathPosix().basename(item.path)})`); exitSiYuan(); }); }); diff --git a/app/src/mobile/index.ts b/app/src/mobile/index.ts index 5b218c9768..11add753a1 100644 --- a/app/src/mobile/index.ts +++ b/app/src/mobile/index.ts @@ -27,6 +27,8 @@ import {saveScroll} from "../protyle/scroll/saveScroll"; import {removeBlock} from "../protyle/wysiwyg/remove"; import {isNotEditBlock} from "../protyle/wysiwyg/getBlock"; import {updateCardHV} from "../card/util"; +import { exportIDB } from "../sillot/util/sillot-idb-backup-and-restore"; +import {hideAllElements, hideElements} from "../protyle/ui/hideElements"; class App { public plugins: import("../plugin").Plugin[] = []; @@ -62,6 +64,16 @@ class App { }) }; new SillotEnv(); + window.Sillot.androidRestartSiYuan = ()=>{ + const overlay = document.querySelector('#SillotOverlay') as HTMLElement; + overlay.style.display = "block"; + exportIDB().then(() => { + hideAllElements(["util"]); + fetchPost("/api/sillot/androidReboot", {force: true}, (response) => { + window.location.href = "siyuan://androidRestartSiYuan"; + }); + }) + }; // 不能使用 touchstart,否则会被 event.stopImmediatePropagation() 阻塞 window.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => { if (!window.siyuan.menus.menu.element.contains(event.target) && !hasClosestByAttribute(event.target, "data-menu", "true")) { @@ -77,10 +89,10 @@ class App { } }); window.addEventListener("beforeunload", () => { - saveScroll(window.siyuan.mobile.editor?.protyle); + window.siyuan.mobile.editor?.protyle ? saveScroll(window.siyuan.mobile.editor.protyle) : null; }, false); window.addEventListener("pagehide", () => { - saveScroll(window.siyuan.mobile.editor?.protyle); + window.siyuan.mobile.editor?.protyle ? saveScroll(window.siyuan.mobile.editor.protyle) : null; }, false); // 判断手机横竖屏状态 window.matchMedia("(orientation:portrait)").addEventListener("change", () => { diff --git a/app/src/mobile/menu/index.ts b/app/src/mobile/menu/index.ts index 9f9b867222..dd92898aec 100644 --- a/app/src/mobile/menu/index.ts +++ b/app/src/mobile/menu/index.ts @@ -167,6 +167,7 @@ export const initRightMenu = (app: App) => { event.stopPropagation(); break; } else if (target.id === "menuSafeQuit") { + console.warn("(mobile) menuSafeQuit -> exitSiYuan() involved"); exitSiYuan(); event.preventDefault(); event.stopPropagation(); diff --git a/app/src/mobile/settings/about.ts b/app/src/mobile/settings/about.ts index 943c30ac42..f49f6005ce 100644 --- a/app/src/mobile/settings/about.ts +++ b/app/src/mobile/settings/about.ts @@ -303,6 +303,7 @@ ${ fetchPost("/api/system/setWorkspaceDir", { path: openPath }, () => { + console.warn(`(mobile) initAbout ${btnsElement[1]}.onClick -> exitSiYuan() involved (openWorkspace)`); exitSiYuan(); }); }); @@ -357,6 +358,7 @@ ${ fetchPost("/api/system/setWorkspaceDir", { path: target.getAttribute("data-path") }, () => { + console.warn("(mobile) initAbout confirmDialog -> exitSiYuan() involved (creatWorkspace)"); exitSiYuan(); }); }); @@ -383,7 +385,7 @@ ${ if(networkServeElement.checked){ window.JSAndroid?.requestPermissionActivity("Battery","注意:后台稳定伺服会消耗额外电量","coldRestart"); } else { - window.JSAndroid?.restartSillotAndroid(); + window.Sillot?.androidRestartSiYuan(); } }); }); diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index dc6a5a176e..d45cc4ec24 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -169,6 +169,7 @@ interface Window { requestPermission(id: string, Msg: string): boolean exitSillotAndroid(): void restartSillotAndroid(): void + androidReboot(): void savePictureByURL(uri: string): void // sillot extend end returnDesktop(): void diff --git a/app/src/types/sillot.d.ts b/app/src/types/sillot.d.ts index 7883e3ad3e..0ed06d9936 100644 --- a/app/src/types/sillot.d.ts +++ b/app/src/types/sillot.d.ts @@ -25,6 +25,7 @@ interface ISillot { hljsRender: any; }; lute: Lute; + androidRestartSiYuan: ()=>void; } interface ISout { diff --git a/app/stage/auth.html b/app/stage/auth.html index 03147410e9..85d96f1989 100644 --- a/app/stage/auth.html +++ b/app/stage/auth.html @@ -204,7 +204,7 @@

-
轻触指纹标识以解锁
+
轻触指纹标识以解锁
exitSiYuan() involved`); + exitSiYuan() }) await ipcRenderer.invoke("siyuan-init", { languages: {{.trayMenuLangs}}, @@ -555,11 +556,11 @@

" + ret.Data = map[string]interface{}{"closeTimeout": 0} + case 2: // 提示新安装包 + ret.Msg = model.Conf.Language(61) + ret.Data = map[string]interface{}{"closeTimeout": 0} + } +} diff --git a/kernel/model/conf.go b/kernel/model/conf.go index ec7da3da76..2c6d03f52a 100644 --- a/kernel/model/conf.go +++ b/kernel/model/conf.go @@ -638,6 +638,60 @@ func Close(force, setCurrentWorkspace bool, execInstallPkg int) (exitCode int) { }() return } +func Close2(force, setCurrentWorkspace bool) (exitCode int) { + exitLock.Lock() + defer exitLock.Unlock() + + util.PushMsg(Conf.Language(95), 10000*60) + + if !force { + if Conf.Sync.Enabled && 3 != Conf.Sync.Mode && + ((IsSubscriber() && conf.ProviderSiYuan == Conf.Sync.Provider) || conf.ProviderSiYuan != Conf.Sync.Provider) { + syncData(true, false) + if 0 != ExitSyncSucc { + exitCode = 1 + return + } + } + } + + // Close the user guide when exiting https://github.com/siyuan-note/siyuan/issues/10322 + closeUserGuide() + + util.IsExiting.Store(true) + + Conf.Close() + sql.CloseDatabase() + treenode.SaveBlockTree(false) + SaveAssetsTexts() + clearWorkspaceTemp() + clearCorruptedNotebooks() + clearPortJSON() + + if setCurrentWorkspace { + // 将当前工作空间放到工作空间列表的最后一个 + // Open the last workspace by default https://github.com/siyuan-note/siyuan/issues/10570 + workspacePaths, err := util.ReadWorkspacePaths() + if nil != err { + logging.LogErrorf("read workspace paths failed: %s", err) + } else { + workspacePaths = gulu.Str.RemoveElem(workspacePaths, util.WorkspaceDir) + workspacePaths = append(workspacePaths, util.WorkspaceDir) + util.WriteWorkspacePaths(workspacePaths) + } + } + + util.UnlockWorkspace() + + closeSyncWebSocket() + go func() { + time.Sleep(500 * time.Millisecond) + logging.LogInfof("exited kernel") + util.WebSocketServer.Close() + // os.Exit(logging.ExitCodeOk) + }() + return +} var CustomEmojis = sync.Map{} diff --git a/kernel/model/export.go b/kernel/model/export.go index 8c0bff6376..24c21af896 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -307,7 +307,8 @@ func Export2Liandi(id string) (err error) { } func ExportSystemLog() (zipPath string) { - exportFolder := filepath.Join(util.TempDir, "export", "system-log") + exportFolder := filepath.Join(util.TempDir, "export", "sillot-system-log") + logging.LogDebugf("(model) New ExportSystemLog() involved -> %s.zip", zipPath) os.RemoveAll(exportFolder) if err := os.MkdirAll(exportFolder, 0755); nil != err { logging.LogErrorf("create export temp folder failed: %s", err) diff --git a/kernel/model/process.go b/kernel/model/process.go index ac618231f7..f95a929bc1 100644 --- a/kernel/model/process.go +++ b/kernel/model/process.go @@ -81,7 +81,7 @@ func HookDesktopUIProcJob() { Close(false, true, 1) } -var uiProcNames = []string{"siyuan", "electron"} +var uiProcNames = []string{"sillot", "electron"} // getAttachedUIProcCount 获取已经附加的 UI 进程数。 func getAttachedUIProcCount() (ret int) { diff --git a/kernel/util/working_mobile.go b/kernel/util/working_mobile.go index af98414faf..d581b837fc 100644 --- a/kernel/util/working_mobile.go +++ b/kernel/util/working_mobile.go @@ -90,7 +90,7 @@ func initWorkspaceDirMobile(workspaceBaseDir string) { } if oldConf && oldData && oldTemp { for _, entry := range entries { - if "home" == entry.Name() || "siyuan" == entry.Name() { + if "home" == entry.Name() || "sillot" == entry.Name() { continue } diff --git a/screenshots/sillot/framework.png b/screenshots/sillot/framework.png deleted file mode 100644 index 0d6ba9a056f0c05ea0227da80229ef4718d33d92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20742 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