From e25913f0d3942761249986266de2251994c06b36 Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 07:56:34 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E2=9C=A8=20Improve=20Recent=20documents?= =?UTF-8?q?=20=E5=9F=BA=E4=BA=8E=E6=96=87=E6=A1=A3=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E6=97=B6=E9=97=B4=E8=BF=9B=E8=A1=8C=E6=8E=92?= =?UTF-8?q?=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/editor/util.ts | 4 +++ app/src/layout/Wnd.ts | 4 +++ app/src/mobile/editor.ts | 3 ++ kernel/api/router.go | 1 + kernel/api/storage.go | 18 ++++++++++++ kernel/model/storage.go | 63 ++++++++++++++++++++++++++++++++++++---- 6 files changed, 87 insertions(+), 6 deletions(-) diff --git a/app/src/editor/util.ts b/app/src/editor/util.ts index 9f9d0c5de1d..1c840181ca6 100644 --- a/app/src/editor/util.ts +++ b/app/src/editor/util.ts @@ -56,6 +56,10 @@ export const openFileById = async (options: { showMessage(response.msg); return; } + + // 更新文档浏览时间 + fetchPost("/api/storage/updateRecentDocViewTime", {rootID: response.data.rootID}); + return openFile({ app: options.app, fileName: response.data.rootTitle, diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 3532c9c8df6..87be71ef6f8 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -30,6 +30,7 @@ import {Search} from "../search"; import {showMessage} from "../dialog/message"; import {openFileById, updatePanelByEditor} from "../editor/util"; import {scrollCenter} from "../util/highlightById"; +import {fetchPost} from "../util/fetch"; import {getAllModels} from "./getAll"; import {clearCounter} from "./status"; import {saveScroll} from "../protyle/scroll/saveScroll"; @@ -555,6 +556,9 @@ export class Wnd { } // focusin 触发前,layout__wnd--active 和 tab 已设置,需在调用里面更新 if (update) { + // 更新文档浏览时间 + fetchPost("/api/storage/updateRecentDocViewTime", {rootID: currentTab.model.editor.protyle.block.rootID}); + updatePanelByEditor({ protyle: currentTab.model.editor.protyle, focus: true, diff --git a/app/src/mobile/editor.ts b/app/src/mobile/editor.ts index ea1055d090f..2ceddf9f448 100644 --- a/app/src/mobile/editor.ts +++ b/app/src/mobile/editor.ts @@ -52,6 +52,9 @@ export const openMobileFileById = (app: App, id: string, action: TProtyleAction[ showMessage(data.msg); return; } + + // 更新文档浏览时间 + fetchPost("/api/storage/updateRecentDocViewTime", {rootID: data.data.rootID}); const protyleOptions: IProtyleOptions = { blockId: id, rootId: data.data.rootID, diff --git a/kernel/api/router.go b/kernel/api/router.go index 8e1f8e0f52c..eff6f91de39 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -78,6 +78,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/storage/getCriteria", model.CheckAuth, getCriteria) ginServer.Handle("POST", "/api/storage/removeCriterion", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, removeCriterion) ginServer.Handle("POST", "/api/storage/getRecentDocs", model.CheckAuth, getRecentDocs) + ginServer.Handle("POST", "/api/storage/updateRecentDocViewTime", model.CheckAuth, updateRecentDocViewTime) ginServer.Handle("POST", "/api/account/login", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, login) ginServer.Handle("POST", "/api/account/checkActivationcode", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, checkActivationcode) diff --git a/kernel/api/storage.go b/kernel/api/storage.go index 9f26e4ebcdb..94cd09e9873 100644 --- a/kernel/api/storage.go +++ b/kernel/api/storage.go @@ -180,3 +180,21 @@ func getLocalStorage(c *gin.Context) { data := model.GetLocalStorage() ret.Data = data } + +func updateRecentDocViewTime(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + rootID := arg["rootID"].(string) + err := model.UpdateRecentDocViewTime(rootID) + if err != nil { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} diff --git a/kernel/model/storage.go b/kernel/model/storage.go index 33cac1ca112..8b9fab95562 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -21,7 +21,9 @@ import ( "os" "path" "path/filepath" + "sort" "sync" + "time" "github.com/88250/gulu" "github.com/88250/lute/parse" @@ -32,9 +34,10 @@ import ( ) type RecentDoc struct { - RootID string `json:"rootID"` - Icon string `json:"icon"` - Title string `json:"title"` + RootID string `json:"rootID"` + Icon string `json:"icon"` + Title string `json:"title"` + ViewedAt int64 `json:"viewedAt"` // 添加浏览时间字段 } var recentDocLock = sync.Mutex{} @@ -65,9 +68,10 @@ func RemoveRecentDoc(ids []string) { func setRecentDocByTree(tree *parse.Tree) { recentDoc := &RecentDoc{ - RootID: tree.Root.ID, - Icon: tree.Root.IALAttr("icon"), - Title: tree.Root.IALAttr("title"), + RootID: tree.Root.ID, + Icon: tree.Root.IALAttr("icon"), + Title: tree.Root.IALAttr("title"), + ViewedAt: time.Now().Unix(), // 使用当前时间作为浏览时间 } recentDocLock.Lock() @@ -94,6 +98,37 @@ func setRecentDocByTree(tree *parse.Tree) { return } +// 新增函数:更新文档浏览时间 +func UpdateRecentDocViewTime(rootID string) error { + recentDocLock.Lock() + defer recentDocLock.Unlock() + + recentDocs, err := getRecentDocs() + if err != nil { + return err + } + + // 查找文档并更新浏览时间 + found := false + for _, doc := range recentDocs { + if doc.RootID == rootID { + doc.ViewedAt = time.Now().Unix() + found = true + break + } + } + + if found { + // 按浏览时间降序排序 + sort.Slice(recentDocs, func(i, j int) bool { + return recentDocs[i].ViewedAt > recentDocs[j].ViewedAt + }) + err = setRecentDocs(recentDocs) + } + + return err +} + func GetRecentDocs() (ret []*RecentDoc, err error) { recentDocLock.Lock() defer recentDocLock.Unlock() @@ -154,6 +189,22 @@ func getRecentDocs() (ret []*RecentDoc, err error) { notExists = append(notExists, doc.RootID) } } + + // 按浏览时间降序排序,如果ViewedAt为0则使用文档创建时间 + sort.Slice(ret, func(i, j int) bool { + if ret[i].ViewedAt == 0 && ret[j].ViewedAt == 0 { + // 如果都没有浏览时间,按ID时间排序(ID包含时间信息) + return ret[i].RootID > ret[j].RootID + } + if ret[i].ViewedAt == 0 { + return false // 没有浏览时间的排在后面 + } + if ret[j].ViewedAt == 0 { + return true // 有浏览时间的排在前面 + } + return ret[i].ViewedAt > ret[j].ViewedAt + }) + if 0 < len(notExists) { setRecentDocs(ret) } From fea231f478e80af33bdab244ebab3dbeed2fa73c Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Thu, 11 Sep 2025 09:40:41 +0800 Subject: [PATCH 02/16] =?UTF-8?q?:sparkles:=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/storage.go | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/kernel/api/storage.go b/kernel/api/storage.go index 94cd09e9873..49fa9013aae 100644 --- a/kernel/api/storage.go +++ b/kernel/api/storage.go @@ -29,7 +29,13 @@ func getRecentDocs(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) - data, err := model.GetRecentDocs() + // 获取排序参数 + sortBy := c.Query("sortBy") + if sortBy == "" { + sortBy = "viewedAt" // 默认按浏览时间排序 + } + + data, err := model.GetRecentDocs(sortBy) if err != nil { ret.Code = -1 ret.Msg = err.Error() @@ -198,3 +204,22 @@ func updateRecentDocViewTime(c *gin.Context) { return } } + + +func updateRecentDocCloseTime(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + rootID := arg["rootID"].(string) + err := model.UpdateRecentDocCloseTime(rootID) + if err != nil { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} From 84964f0882970387cfefb314398be427c859ab44 Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Thu, 11 Sep 2025 09:42:13 +0800 Subject: [PATCH 03/16] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/storage.go | 73 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/kernel/model/storage.go b/kernel/model/storage.go index 8b9fab95562..7b92b3d648b 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -37,7 +37,8 @@ type RecentDoc struct { RootID string `json:"rootID"` Icon string `json:"icon"` Title string `json:"title"` - ViewedAt int64 `json:"viewedAt"` // 添加浏览时间字段 + ViewedAt int64 `json:"viewedAt"` // 浏览时间字段 + ClosedAt int64 `json:"closedAt"` // 关闭时间字段 } var recentDocLock = sync.Mutex{} @@ -72,6 +73,7 @@ func setRecentDocByTree(tree *parse.Tree) { Icon: tree.Root.IALAttr("icon"), Title: tree.Root.IALAttr("title"), ViewedAt: time.Now().Unix(), // 使用当前时间作为浏览时间 + ClosedAt: 0, // 初始化关闭时间为0,表示未关闭 } recentDocLock.Lock() @@ -129,10 +131,37 @@ func UpdateRecentDocViewTime(rootID string) error { return err } -func GetRecentDocs() (ret []*RecentDoc, err error) { +// 新增函数:更新文档关闭时间 +func UpdateRecentDocCloseTime(rootID string) error { recentDocLock.Lock() defer recentDocLock.Unlock() - return getRecentDocs() + + recentDocs, err := getRecentDocs() + if err != nil { + return err + } + + // 查找文档并更新关闭时间 + found := false + for _, doc := range recentDocs { + if doc.RootID == rootID { + doc.ClosedAt = time.Now().Unix() + found = true + break + } + } + + if found { + err = setRecentDocs(recentDocs) + } + + return err +} + +func GetRecentDocs(sortBy ...string) (ret []*RecentDoc, err error) { + recentDocLock.Lock() + defer recentDocLock.Unlock() + return getRecentDocs(sortBy...) } func setRecentDocs(recentDocs []*RecentDoc) (err error) { @@ -157,7 +186,7 @@ func setRecentDocs(recentDocs []*RecentDoc) (err error) { return } -func getRecentDocs() (ret []*RecentDoc, err error) { +func getRecentDocs(sortBy ...string) (ret []*RecentDoc, err error) { tmp := []*RecentDoc{} dataPath := filepath.Join(util.DataDir, "storage/recent-doc.json") if !filelock.IsExist(dataPath) { @@ -205,9 +234,44 @@ func getRecentDocs() (ret []*RecentDoc, err error) { return ret[i].ViewedAt > ret[j].ViewedAt }) + if 0 < len(notExists) { setRecentDocs(ret) } + + // 根据排序参数进行排序 + if len(sortBy) > 0 && sortBy[0] == "closedAt" { + // 按关闭时间排序 + sort.Slice(ret, func(i, j int) bool { + if ret[i].ClosedAt == 0 && ret[j].ClosedAt == 0 { + // 如果都没有关闭时间,按浏览时间排序 + return ret[i].ViewedAt > ret[j].ViewedAt + } + if ret[i].ClosedAt == 0 { + return false // 没有关闭时间的排在后面 + } + if ret[j].ClosedAt == 0 { + return true // 有关闭时间的排在前面 + } + return ret[i].ClosedAt > ret[j].ClosedAt + }) + } else { + // 默认按浏览时间排序 + sort.Slice(ret, func(i, j int) bool { + if ret[i].ViewedAt == 0 && ret[j].ViewedAt == 0 { + // 如果都没有浏览时间,按ID时间排序(ID包含时间信息) + return ret[i].RootID > ret[j].RootID + } + if ret[i].ViewedAt == 0 { + return false // 没有浏览时间的排在后面 + } + if ret[j].ViewedAt == 0 { + return true // 有浏览时间的排在前面 + } + return ret[i].ViewedAt > ret[j].ViewedAt + }) + } + return } @@ -453,3 +517,4 @@ func getLocalStorage() (ret map[string]interface{}) { } return } + From cac002885a9d9c9bcf5a416e9cb0d1f0f0a43dae Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Thu, 11 Sep 2025 09:44:27 +0800 Subject: [PATCH 04/16] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/api/router.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/kernel/api/router.go b/kernel/api/router.go index eff6f91de39..23e9061c481 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -79,7 +79,8 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/storage/removeCriterion", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, removeCriterion) ginServer.Handle("POST", "/api/storage/getRecentDocs", model.CheckAuth, getRecentDocs) ginServer.Handle("POST", "/api/storage/updateRecentDocViewTime", model.CheckAuth, updateRecentDocViewTime) - + ginServer.Handle("POST", "/api/storage/updateRecentDocCloseTime", model.CheckAuth, updateRecentDocCloseTime) + ginServer.Handle("POST", "/api/account/login", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, login) ginServer.Handle("POST", "/api/account/checkActivationcode", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, checkActivationcode) ginServer.Handle("POST", "/api/account/useActivationcode", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, useActivationcode) From 661c6cfa5e625a20ff9528e8a752ea09d15f14ec Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Thu, 11 Sep 2025 09:44:57 +0800 Subject: [PATCH 05/16] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/layout/Wnd.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 87be71ef6f8..2ee81b52ea3 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -785,6 +785,8 @@ export class Wnd { } if (item.model instanceof Editor) { saveScroll(item.model.editor.protyle); + // 更新文档关闭时间 + fetchPost("/api/storage/updateRecentDocCloseTime", {rootID: item.model.editor.protyle.block.rootID}); } if (this.children.length === 1) { this.destroyModel(this.children[0].model); From d6191526b17f238a90984b27547b24a50a0377a7 Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Thu, 11 Sep 2025 09:45:25 +0800 Subject: [PATCH 06/16] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/business/openRecentDocs.ts | 34 +++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/app/src/business/openRecentDocs.ts b/app/src/business/openRecentDocs.ts index 3a7df3ab759..91ed12c367e 100644 --- a/app/src/business/openRecentDocs.ts +++ b/app/src/business/openRecentDocs.ts @@ -10,10 +10,18 @@ import {focusByRange} from "../protyle/util/selection"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {hideElements} from "../protyle/ui/hideElements"; -const getHTML = async (data: { rootID: string, icon: string, title: string }[], element: Element, key?: string) => { +const getHTML = async (data: { rootID: string, icon: string, title: string, viewedAt?: number, closedAt?: number }[], element: Element, key?: string, sortBy: "viewedAt" | "closedAt" = "viewedAt") => { let tabHtml = ""; let index = 0; - data.forEach((item) => { + + // 根据排序字段对数据进行排序 + const sortedData = [...data].sort((a, b) => { + const aValue = a[sortBy] || 0; + const bValue = b[sortBy] || 0; + return bValue - aValue; // 降序排序 + }); + + sortedData.forEach((item) => { if (!key || item.title.toLowerCase().includes(key.toLowerCase())) { tabHtml += `
  • ${unicode2Emoji(item.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].file, "b3-list-item__graphic", true)} @@ -77,7 +85,7 @@ export const openRecentDocs = () => { hideElements(["dialog"]); return; } - fetchPost("/api/storage/getRecentDocs", {}, (response) => { + fetchPost("/api/storage/getRecentDocs", {sortBy: "viewedAt"}, (response) => { let range: Range; if (getSelection().rangeCount > 0) { range = getSelection().getRangeAt(0); @@ -91,6 +99,12 @@ export const openRecentDocs = () => { +
    + +
    `, content: `
    @@ -106,13 +120,13 @@ export const openRecentDocs = () => { const searchElement = dialog.element.querySelector("input"); searchElement.focus(); searchElement.addEventListener("compositionend", () => { - getHTML(response.data, dialog.element, searchElement.value); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); }); searchElement.addEventListener("input", (event: InputEvent) => { if (event.isComposing) { return; } - getHTML(response.data, dialog.element, searchElement.value); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); }); dialog.element.setAttribute("data-key", Constants.DIALOG_RECENTDOCS); dialog.element.addEventListener("click", (event) => { @@ -125,6 +139,16 @@ export const openRecentDocs = () => { event.preventDefault(); } }); + + // 添加排序下拉框事件监听 + const sortSelect = dialog.element.querySelector("#recentDocsSort") as HTMLSelectElement; + sortSelect.addEventListener("change", () => { + // 重新调用API获取排序后的数据 + fetchPost("/api/storage/getRecentDocs", {sortBy: sortSelect.value}, (newResponse) => { + getHTML(newResponse.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); + }); + }); + getHTML(response.data, dialog.element); }); }; From 39758c790ffcb0f2b2b2a48b7fa5d8bdd889ea80 Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 09:47:03 +0800 Subject: [PATCH 07/16] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E6=98=BE?= =?UTF-8?q?=E7=A4=BA=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/appearance/langs/ar_SA.json | 2 ++ app/appearance/langs/de_DE.json | 2 ++ app/appearance/langs/en_US.json | 2 ++ app/appearance/langs/es_ES.json | 2 ++ app/appearance/langs/fr_FR.json | 2 ++ app/appearance/langs/he_IL.json | 2 ++ app/appearance/langs/it_IT.json | 2 ++ app/appearance/langs/ja_JP.json | 2 ++ app/appearance/langs/pl_PL.json | 2 ++ app/appearance/langs/pt_BR.json | 2 ++ app/appearance/langs/ru_RU.json | 2 ++ app/appearance/langs/zh_CHT.json | 2 ++ app/appearance/langs/zh_CN.json | 2 ++ 13 files changed, 26 insertions(+) diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index 53f59c6c6dc..ccbf5868134 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1335,6 +1335,8 @@ "uploadError": "خطأ في الرفع", "uploading": "يتم الرفع...", "wysiwyg": "‫ما تراه هو ما تحصل عليه (WYSIWYG)‬", + "recentViewed": "تم عرضها مؤخراً", + "recentClosed": "تم إغلاقها مؤخراً", "_label": "العربية", "_time": { "albl": "من قبل", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index f2788d89975..ce0b18a6d62 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1335,6 +1335,8 @@ "uploadError": "Upload-Fehler", "uploading": "Hochladen...", "wysiwyg": "WYSIWYG", + "recentViewed": "Zuletzt angesehen", + "recentClosed": "Zuletzt geschlossen", "_label": "Deutsch", "_time": { "albl": "vor", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index 67bd87bcdd2..9ec33528d8f 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1335,6 +1335,8 @@ "uploadError": "upload error", "uploading": "Uploading...", "wysiwyg": "WYSIWYG", + "recentViewed": "Recently Viewed", + "recentClosed": "Recently Closed", "_label": "English", "_time": { "albl": "ago", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index 83c3f5d6bbf..98ad04f3029 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1335,6 +1335,8 @@ "uploadError": "error de subida", "uploading": "Subiendo...", "wysiwyg": "WYSIWYG", + "recentViewed": "Visto recientemente", + "recentClosed": "Cerrado recientemente", "_label": "Español", "_time": { "albl": "hace", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index e76b3a3d876..72340853b9e 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1335,6 +1335,8 @@ "uploadError": "erreur de transfert", "uploading": "Transfert en cours", "wysiwyg": "WYSIWYG", + "recentViewed": "Récemment consulté", + "recentClosed": "Récemment fermé", "_label": "Français", "_time": { "albl": "Précédemment", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 337b4ed58fa..9b9a56eee94 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1335,6 +1335,8 @@ "uploadError": "שגיאת העלאה", "uploading": "מעלה...", "wysiwyg": "WYSIWYG", + "recentViewed": "נצפה לאחרונה", + "recentClosed": "נסגר לאחרונה", "_label": "עברית", "_time": { "albl": "לפני", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index d8e641b5355..aac7476d42a 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1335,6 +1335,8 @@ "uploadError": "Errore di caricamento", "uploading": "Caricamento in corso.", "wysiwyg": "WYSIWYG", + "recentViewed": "Visualizzato di recente", + "recentClosed": "Chiuso di recente", "_label": "Italiano", "_time": { "albl": "fa", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index 805e53a33f0..f3728ab0a00 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1335,6 +1335,8 @@ "uploadError": "アップロードエラー", "uploading": "アップロード中...", "wysiwyg": "WYSIWYG", + "recentViewed": "最近閲覧", + "recentClosed": "最近閉じる", "_label": "日本語", "_time": { "albl": "前", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index 7eb39ded51e..bcb3653c1b9 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1335,6 +1335,8 @@ "uploadError": "błąd przesyłania", "uploading": "Przesyłanie...", "wysiwyg": "WYSIWYG", + "recentViewed": "Ostatnio przeglądane", + "recentClosed": "Ostatnio zamknięte", "_label": "Polski", "_time": { "albl": "temu", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index 12d6f03657d..cf25493a395 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1335,6 +1335,8 @@ "uploadError": "erro de upload", "uploading": "Enviando...", "wysiwyg": "WYSIWYG", + "recentViewed": "Visualizado recentemente", + "recentClosed": "Fechado recentemente", "_label": "Português (Brasil)", "_time": { "albl": "atrás", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 3297d5b77d7..0043eca5556 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1335,6 +1335,8 @@ "uploadError": "Ошибка загрузки", "uploading": "Загрузка...", "wysiwyg": "WYSIWYG", + "recentViewed": "Недавно просмотренные", + "recentClosed": "Недавно закрытые", "_label": "Русский", "_time": { "albl": "назад", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 062af4f8a43..8a37d412b93 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1335,6 +1335,8 @@ "uploadError": "上傳錯誤", "uploading": "上傳中...", "wysiwyg": "所見即所得", + "recentViewed": "最近瀏覽", + "recentClosed": "最近關閉", "_label": "繁體中文", "_time": { "albl": "前", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 7cc5fae9af1..31d8cf38560 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1335,6 +1335,8 @@ "uploadError": "上传错误", "uploading": "上传中...", "wysiwyg": "所见即所得", + "recentViewed": "最近浏览", + "recentClosed": "最近关闭", "_label": "简体中文", "_time": { "albl": "前", From b1a177738f34d6af8a646dbabfe1e74e5926b56c Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 10:26:11 +0800 Subject: [PATCH 08/16] =?UTF-8?q?=E2=9C=A8=E6=94=AF=E6=8C=81Ctrl+Shift+T?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=9C=80=E8=BF=91=E5=85=B3=E9=97=AD=E7=9A=84?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/boot/globalEvent/keydown.ts | 14 ++++++++++++++ app/src/layout/Wnd.ts | 6 ++++++ 2 files changed, 20 insertions(+) diff --git a/app/src/boot/globalEvent/keydown.ts b/app/src/boot/globalEvent/keydown.ts index e1692a8e6cb..82ed0cc7856 100644 --- a/app/src/boot/globalEvent/keydown.ts +++ b/app/src/boot/globalEvent/keydown.ts @@ -1528,6 +1528,20 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => { return; } + if (matchHotKey("⇧⌘T", event)) { + console.log((window as any).siyuan.closedTabs); + if ((window as any).siyuan.closedTabs && (window as any).siyuan.closedTabs.length > 0) { + const closedTab = (window as any).siyuan.closedTabs.pop(); + openFileById({ + app, + id: closedTab.id, + action: [Constants.CB_GET_FOCUS, Constants.CB_GET_SCROLL] + }); + } + event.preventDefault(); + return; + } + if (matchHotKey(window.siyuan.config.keymap.general.goToTab1.custom, event) && !event.repeat) { switchTabByIndex(0); event.preventDefault(); diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 2ee81b52ea3..0ef21ab4560 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -787,6 +787,12 @@ export class Wnd { saveScroll(item.model.editor.protyle); // 更新文档关闭时间 fetchPost("/api/storage/updateRecentDocCloseTime", {rootID: item.model.editor.protyle.block.rootID}); + if (!(window as any).siyuan.closedTabs) { + (window as any).siyuan.closedTabs = []; + } + (window as any).siyuan.closedTabs.push({ + id: item.model.editor.protyle.block.rootID + }); } if (this.children.length === 1) { this.destroyModel(this.children[0].model); From 27c2929e9b8975524395c503bfb4d6c297230e93 Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 10:27:55 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=F0=9F=8E=A8=20clean=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/boot/globalEvent/keydown.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/app/src/boot/globalEvent/keydown.ts b/app/src/boot/globalEvent/keydown.ts index 82ed0cc7856..d86c856d999 100644 --- a/app/src/boot/globalEvent/keydown.ts +++ b/app/src/boot/globalEvent/keydown.ts @@ -1529,7 +1529,6 @@ export const windowKeyDown = (app: App, event: KeyboardEvent) => { } if (matchHotKey("⇧⌘T", event)) { - console.log((window as any).siyuan.closedTabs); if ((window as any).siyuan.closedTabs && (window as any).siyuan.closedTabs.length > 0) { const closedTab = (window as any).siyuan.closedTabs.pop(); openFileById({ From b3b7286fc5d63360f30305735be0e7adc576f17a Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 10:38:22 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=F0=9F=94=A5=20=E7=A7=BB=E9=99=A4?= =?UTF-8?q?=E8=A1=A8=E6=A0=BC=E6=8F=92=E5=85=A5=E8=A1=8C/=E5=88=97?= =?UTF-8?q?=E7=9A=84=E9=BB=98=E8=AE=A4=E5=BF=AB=E6=8D=B7=E9=94=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/constants.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/src/constants.ts b/app/src/constants.ts index 04c5aca811c..270ac60ad9d 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -509,10 +509,10 @@ export abstract class Constants { checkToggle: {default: "⌘↩", custom: "⌘↩"}, }, table: { - insertRowAbove: {default: "⇧⌘T", custom: "⇧⌘T"}, - insertRowBelow: {default: "⇧⌘D", custom: "⇧⌘D"}, - insertColumnLeft: {default: "⇧⌘L", custom: "⇧⌘L"}, - insertColumnRight: {default: "⇧⌘R", custom: "⇧⌘R"}, + insertRowAbove: {default: "", custom: ""}, + insertRowBelow: {default: "", custom: ""}, + insertColumnLeft: {default: "", custom: ""}, + insertColumnRight: {default: "", custom: ""}, moveToUp: {default: "⌥⌘T", custom: "⌥⌘T"}, moveToDown: {default: "⌥⌘B", custom: "⌥⌘B"}, moveToLeft: {default: "⌥⌘L", custom: "⌥⌘L"}, From bc2447bc7406a889a388028d5e69e1888a916894 Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 11:33:13 +0800 Subject: [PATCH 11/16] =?UTF-8?q?=E2=9C=A8=20=E6=9C=80=E8=BF=91=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=94=AF=E6=8C=81=E6=98=BE=E7=A4=BA=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/appearance/langs/ar_SA.json | 1 + app/appearance/langs/de_DE.json | 1 + app/appearance/langs/en_US.json | 1 + app/appearance/langs/es_ES.json | 1 + app/appearance/langs/fr_FR.json | 1 + app/appearance/langs/he_IL.json | 1 + app/appearance/langs/it_IT.json | 1 + app/appearance/langs/ja_JP.json | 1 + app/appearance/langs/pl_PL.json | 1 + app/appearance/langs/pt_BR.json | 2 ++ app/appearance/langs/ru_RU.json | 1 + app/appearance/langs/zh_CHT.json | 1 + app/appearance/langs/zh_CN.json | 1 + app/src/business/openRecentDocs.ts | 42 +++++++++++++++++++++++++----- scripts/win-build.bat | 23 ++-------------- 15 files changed, 52 insertions(+), 27 deletions(-) diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index ccbf5868134..9415576a962 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1337,6 +1337,7 @@ "wysiwyg": "‫ما تراه هو ما تحصل عليه (WYSIWYG)‬", "recentViewed": "تم عرضها مؤخراً", "recentClosed": "تم إغلاقها مؤخراً", + "recentModified": "تم تعديلها مؤخراً", "_label": "العربية", "_time": { "albl": "من قبل", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index ce0b18a6d62..1ade16ae184 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Zuletzt angesehen", "recentClosed": "Zuletzt geschlossen", + "recentModified": "Zuletzt geändert", "_label": "Deutsch", "_time": { "albl": "vor", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index 9ec33528d8f..51c2e6d6389 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Recently Viewed", "recentClosed": "Recently Closed", + "recentModified": "Recently Modified", "_label": "English", "_time": { "albl": "ago", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index 98ad04f3029..e51f738ddec 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Visto recientemente", "recentClosed": "Cerrado recientemente", + "recentModified": "Modificado recientemente", "_label": "Español", "_time": { "albl": "hace", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 72340853b9e..625837ae224 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Récemment consulté", "recentClosed": "Récemment fermé", + "recentModified": "Récemment modifié", "_label": "Français", "_time": { "albl": "Précédemment", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 9b9a56eee94..8fc8e4a2589 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "נצפה לאחרונה", "recentClosed": "נסגר לאחרונה", + "recentModified": "שונה לאחרונה", "_label": "עברית", "_time": { "albl": "לפני", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index aac7476d42a..f898e202c79 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Visualizzato di recente", "recentClosed": "Chiuso di recente", + "recentModified": "Modificato di recente", "_label": "Italiano", "_time": { "albl": "fa", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index f3728ab0a00..b320946fb22 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "最近閲覧", "recentClosed": "最近閉じる", + "recentModified": "最近更新", "_label": "日本語", "_time": { "albl": "前", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index bcb3653c1b9..0f10d0d7d14 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Ostatnio przeglądane", "recentClosed": "Ostatnio zamknięte", + "recentModified": "Ostatnio modyfikowane", "_label": "Polski", "_time": { "albl": "temu", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index cf25493a395..f418f062405 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1337,6 +1337,8 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Visualizado recentemente", "recentClosed": "Fechado recentemente", + "recentModified": "Modificado recentemente", + "recentModified": "Modificado recentemente", "_label": "Português (Brasil)", "_time": { "albl": "atrás", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 0043eca5556..8b89fd1a199 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1337,6 +1337,7 @@ "wysiwyg": "WYSIWYG", "recentViewed": "Недавно просмотренные", "recentClosed": "Недавно закрытые", + "recentModified": "Недавно измененные", "_label": "Русский", "_time": { "albl": "назад", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 8a37d412b93..0914196e1fb 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1337,6 +1337,7 @@ "wysiwyg": "所見即所得", "recentViewed": "最近瀏覽", "recentClosed": "最近關閉", + "recentModified": "最近更新", "_label": "繁體中文", "_time": { "albl": "前", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 31d8cf38560..934318b6c03 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1337,6 +1337,7 @@ "wysiwyg": "所见即所得", "recentViewed": "最近浏览", "recentClosed": "最近关闭", + "recentModified": "最近修改", "_label": "简体中文", "_time": { "albl": "前", diff --git a/app/src/business/openRecentDocs.ts b/app/src/business/openRecentDocs.ts index 91ed12c367e..d0dc0382954 100644 --- a/app/src/business/openRecentDocs.ts +++ b/app/src/business/openRecentDocs.ts @@ -10,7 +10,7 @@ import {focusByRange} from "../protyle/util/selection"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {hideElements} from "../protyle/ui/hideElements"; -const getHTML = async (data: { rootID: string, icon: string, title: string, viewedAt?: number, closedAt?: number }[], element: Element, key?: string, sortBy: "viewedAt" | "closedAt" = "viewedAt") => { +const getHTML = async (data: { rootID: string, icon: string, title: string, viewedAt?: number, closedAt?: number, updated?: number }[], element: Element, key?: string, sortBy: "viewedAt" | "closedAt" | "updated" = "viewedAt") => { let tabHtml = ""; let index = 0; @@ -103,6 +103,7 @@ export const openRecentDocs = () => {
    `, @@ -120,13 +121,13 @@ export const openRecentDocs = () => { const searchElement = dialog.element.querySelector("input"); searchElement.focus(); searchElement.addEventListener("compositionend", () => { - getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "updated"); }); searchElement.addEventListener("input", (event: InputEvent) => { if (event.isComposing) { return; } - getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "updated"); }); dialog.element.setAttribute("data-key", Constants.DIALOG_RECENTDOCS); dialog.element.addEventListener("click", (event) => { @@ -144,9 +145,38 @@ export const openRecentDocs = () => { const sortSelect = dialog.element.querySelector("#recentDocsSort") as HTMLSelectElement; sortSelect.addEventListener("change", () => { // 重新调用API获取排序后的数据 - fetchPost("/api/storage/getRecentDocs", {sortBy: sortSelect.value}, (newResponse) => { - getHTML(newResponse.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); - }); + if (sortSelect.value === "updated") { + // 使用SQL查询获取最近修改的文档 + const data = { + stmt: "SELECT * FROM blocks WHERE type = 'd' ORDER BY updated DESC LIMIT 33" + }; + fetchSyncPost("/api/query/sql", data).then((sqlResponse) => { + if (sqlResponse.data && sqlResponse.data.length > 0) { + // 转换SQL查询结果格式 + const recentModifiedDocs = sqlResponse.data.map((block: any) => { + // 从ial中解析icon + let icon = ""; + if (block.ial) { + const iconMatch = block.ial.match(/icon="([^"]*)"/); + if (iconMatch) { + icon = iconMatch[1]; + } + } + return { + rootID: block.id, + icon: icon, + title: block.content, + updated: block.updated + }; + }); + getHTML(recentModifiedDocs, dialog.element, searchElement.value, "updated"); + } + }); + } else { + fetchPost("/api/storage/getRecentDocs", {sortBy: sortSelect.value}, (newResponse) => { + getHTML(newResponse.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); + }); + } }); getHTML(response.data, dialog.element); diff --git a/scripts/win-build.bat b/scripts/win-build.bat index 264b7f82386..88f3122ad3a 100644 --- a/scripts/win-build.bat +++ b/scripts/win-build.bat @@ -16,7 +16,6 @@ cd .. echo 'Cleaning Builds' del /S /Q /F app\build 1>nul del /S /Q /F app\kernel 1>nul -del /S /Q /F app\kernel-arm64 1>nul echo 'Building Kernel' @REM the C compiler "gcc" is necessary https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ @@ -38,34 +37,16 @@ if errorlevel 1 ( exit /b %errorlevel% ) -echo 'Building Kernel arm64' -set GOARCH=arm64 -@REM if you want to build arm64, you need to install aarch64-w64-mingw32-gcc -set CC="D:/Program Files/llvm-mingw-20240518-ucrt-x86_64/bin/aarch64-w64-mingw32-gcc.exe" -go build --tags fts5 -v -o "../app/kernel-arm64/SiYuan-Kernel.exe" -ldflags "-s -w -H=windowsgui" . -if errorlevel 1 ( - exit /b %errorlevel% -) + cd .. echo 'Building Electron App amd64' cd app copy "elevator\elevator-amd64.exe" "kernel\elevator.exe" -copy "elevator\elevator-arm64.exe" "kernel-arm64\elevator.exe" call pnpm run dist if errorlevel 1 ( exit /b %errorlevel% ) -echo 'Building Electron App arm64' -call pnpm run dist-arm64 -if errorlevel 1 ( - exit /b %errorlevel% -) -cd .. - -echo 'Building Appx' -echo 'Building Appx should be disabled if you do not need it. Not configured correctly will lead to build failures' -cd . > app\build\win-unpacked\resources\ms-store -electron-windows-store --input-directory app\build\win-unpacked --output-directory app\build\ --package-version 1.0.0.0 --package-name SiYuan --manifest app\appx\AppxManifest.xml --assets app\appx\assets\ --make-pri true +cd .. \ No newline at end of file From 4285d10e08c70e7eb4cb756be8415a57c453cfed Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 11:39:27 +0800 Subject: [PATCH 12/16] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/appearance/langs/pt_BR.json | 1 - 1 file changed, 1 deletion(-) diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index f418f062405..0fc1b1d6cb6 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1338,7 +1338,6 @@ "recentViewed": "Visualizado recentemente", "recentClosed": "Fechado recentemente", "recentModified": "Modificado recentemente", - "recentModified": "Modificado recentemente", "_label": "Português (Brasil)", "_time": { "albl": "atrás", From 814e78d3e79b8374e0fb6bd15b644dd98aea5487 Mon Sep 17 00:00:00 2001 From: Tron Date: Thu, 11 Sep 2025 12:15:28 +0800 Subject: [PATCH 13/16] =?UTF-8?q?=E2=9C=A8=20=E6=9C=80=E8=BF=91=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=94=AF=E6=8C=81=E6=9F=A5=E7=9C=8B=E6=9C=80=E8=BF=91?= =?UTF-8?q?=E6=89=93=E5=BC=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/appearance/langs/ar_SA.json | 1 + app/appearance/langs/de_DE.json | 1 + app/appearance/langs/en_US.json | 1 + app/appearance/langs/es_ES.json | 1 + app/appearance/langs/fr_FR.json | 1 + app/appearance/langs/he_IL.json | 1 + app/appearance/langs/it_IT.json | 1 + app/appearance/langs/ja_JP.json | 1 + app/appearance/langs/pl_PL.json | 1 + app/appearance/langs/pt_BR.json | 1 + app/appearance/langs/ru_RU.json | 1 + app/appearance/langs/zh_CHT.json | 1 + app/appearance/langs/zh_CN.json | 1 + app/src/business/openRecentDocs.ts | 15 ++-- app/src/layout/Wnd.ts | 6 ++ app/src/mobile/menu/getRecentDocs.ts | 2 +- kernel/api/router.go | 1 + kernel/api/storage.go | 29 ++++++- kernel/model/storage.go | 108 +++++++++++++++++++-------- 19 files changed, 132 insertions(+), 42 deletions(-) diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index 9415576a962..85cf09a3a89 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -1336,6 +1336,7 @@ "uploading": "يتم الرفع...", "wysiwyg": "‫ما تراه هو ما تحصل عليه (WYSIWYG)‬", "recentViewed": "تم عرضها مؤخراً", + "recentOpened": "تم فتحها مؤخراً", "recentClosed": "تم إغلاقها مؤخراً", "recentModified": "تم تعديلها مؤخراً", "_label": "العربية", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index 1ade16ae184..14ee48bdf75 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -1336,6 +1336,7 @@ "uploading": "Hochladen...", "wysiwyg": "WYSIWYG", "recentViewed": "Zuletzt angesehen", + "recentOpened": "Zuletzt geöffnet", "recentClosed": "Zuletzt geschlossen", "recentModified": "Zuletzt geändert", "_label": "Deutsch", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index 51c2e6d6389..cf9db646f6c 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -1336,6 +1336,7 @@ "uploading": "Uploading...", "wysiwyg": "WYSIWYG", "recentViewed": "Recently Viewed", + "recentOpened": "Recently Opened", "recentClosed": "Recently Closed", "recentModified": "Recently Modified", "_label": "English", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index e51f738ddec..ff877ae8970 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -1336,6 +1336,7 @@ "uploading": "Subiendo...", "wysiwyg": "WYSIWYG", "recentViewed": "Visto recientemente", + "recentOpened": "Abierto recientemente", "recentClosed": "Cerrado recientemente", "recentModified": "Modificado recientemente", "_label": "Español", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index 625837ae224..14dbecdaa90 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -1336,6 +1336,7 @@ "uploading": "Transfert en cours", "wysiwyg": "WYSIWYG", "recentViewed": "Récemment consulté", + "recentOpened": "Récemment ouvert", "recentClosed": "Récemment fermé", "recentModified": "Récemment modifié", "_label": "Français", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 8fc8e4a2589..bd416c087f0 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -1336,6 +1336,7 @@ "uploading": "מעלה...", "wysiwyg": "WYSIWYG", "recentViewed": "נצפה לאחרונה", + "recentOpened": "נפתח לאחרונה", "recentClosed": "נסגר לאחרונה", "recentModified": "שונה לאחרונה", "_label": "עברית", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index f898e202c79..bd028202a7a 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -1336,6 +1336,7 @@ "uploading": "Caricamento in corso.", "wysiwyg": "WYSIWYG", "recentViewed": "Visualizzato di recente", + "recentOpened": "Aperto di recente", "recentClosed": "Chiuso di recente", "recentModified": "Modificato di recente", "_label": "Italiano", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index b320946fb22..6da2b43546d 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -1336,6 +1336,7 @@ "uploading": "アップロード中...", "wysiwyg": "WYSIWYG", "recentViewed": "最近閲覧", + "recentOpened": "最近開いた", "recentClosed": "最近閉じる", "recentModified": "最近更新", "_label": "日本語", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index 0f10d0d7d14..e7667799c9c 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -1336,6 +1336,7 @@ "uploading": "Przesyłanie...", "wysiwyg": "WYSIWYG", "recentViewed": "Ostatnio przeglądane", + "recentOpened": "Ostatnio otwarte", "recentClosed": "Ostatnio zamknięte", "recentModified": "Ostatnio modyfikowane", "_label": "Polski", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index 0fc1b1d6cb6..63e7a846570 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -1336,6 +1336,7 @@ "uploading": "Enviando...", "wysiwyg": "WYSIWYG", "recentViewed": "Visualizado recentemente", + "recentOpened": "Aberto recentemente", "recentClosed": "Fechado recentemente", "recentModified": "Modificado recentemente", "_label": "Português (Brasil)", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 8b89fd1a199..a83fc04045f 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -1336,6 +1336,7 @@ "uploading": "Загрузка...", "wysiwyg": "WYSIWYG", "recentViewed": "Недавно просмотренные", + "recentOpened": "Недавно открытые", "recentClosed": "Недавно закрытые", "recentModified": "Недавно измененные", "_label": "Русский", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 0914196e1fb..e6dde134e8f 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -1336,6 +1336,7 @@ "uploading": "上傳中...", "wysiwyg": "所見即所得", "recentViewed": "最近瀏覽", + "recentOpened": "最近開啟", "recentClosed": "最近關閉", "recentModified": "最近更新", "_label": "繁體中文", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 934318b6c03..8b549c08055 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1336,6 +1336,7 @@ "uploading": "上传中...", "wysiwyg": "所见即所得", "recentViewed": "最近浏览", + "recentOpened": "最近打开", "recentClosed": "最近关闭", "recentModified": "最近修改", "_label": "简体中文", diff --git a/app/src/business/openRecentDocs.ts b/app/src/business/openRecentDocs.ts index d0dc0382954..06d6ec81f0b 100644 --- a/app/src/business/openRecentDocs.ts +++ b/app/src/business/openRecentDocs.ts @@ -10,7 +10,7 @@ import {focusByRange} from "../protyle/util/selection"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {hideElements} from "../protyle/ui/hideElements"; -const getHTML = async (data: { rootID: string, icon: string, title: string, viewedAt?: number, closedAt?: number, updated?: number }[], element: Element, key?: string, sortBy: "viewedAt" | "closedAt" | "updated" = "viewedAt") => { +const getHTML = async (data: { rootID: string, icon: string, title: string, viewedAt?: number, closedAt?: number, openAt?: number, updated?: number }[], element: Element, key?: string, sortBy: "viewedAt" | "closedAt" | "openAt" | "updated" = "viewedAt") => { let tabHtml = ""; let index = 0; @@ -101,9 +101,10 @@ export const openRecentDocs = () => {
    `, @@ -121,13 +122,13 @@ export const openRecentDocs = () => { const searchElement = dialog.element.querySelector("input"); searchElement.focus(); searchElement.addEventListener("compositionend", () => { - getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "updated"); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "openAt" | "updated"); }); searchElement.addEventListener("input", (event: InputEvent) => { if (event.isComposing) { return; } - getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "updated"); + getHTML(response.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "openAt" | "updated"); }); dialog.element.setAttribute("data-key", Constants.DIALOG_RECENTDOCS); dialog.element.addEventListener("click", (event) => { @@ -174,7 +175,7 @@ export const openRecentDocs = () => { }); } else { fetchPost("/api/storage/getRecentDocs", {sortBy: sortSelect.value}, (newResponse) => { - getHTML(newResponse.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt"); + getHTML(newResponse.data, dialog.element, searchElement.value, sortSelect.value as "viewedAt" | "closedAt" | "openAt"); }); } }); diff --git a/app/src/layout/Wnd.ts b/app/src/layout/Wnd.ts index 0ef21ab4560..c70172d53b7 100644 --- a/app/src/layout/Wnd.ts +++ b/app/src/layout/Wnd.ts @@ -636,6 +636,12 @@ export class Wnd { if (tab.callback) { tab.callback(tab); } + + // 当文档第一次加载到页签时更新 openAt 时间 + if (tab.model instanceof Editor && tab.model.editor?.protyle?.block?.rootID) { + fetchPost("/api/storage/updateRecentDocOpenTime", {rootID: tab.model.editor.protyle.block.rootID}); + } + // 移除 centerLayout 中的 empty if (this.parent.type === "center" && this.children.length === 2 && !this.children[0].headElement) { this.removeTab(this.children[0].id); diff --git a/app/src/mobile/menu/getRecentDocs.ts b/app/src/mobile/menu/getRecentDocs.ts index d3308c8d311..5b40c84fd28 100644 --- a/app/src/mobile/menu/getRecentDocs.ts +++ b/app/src/mobile/menu/getRecentDocs.ts @@ -8,7 +8,7 @@ import {openMobileFileById} from "../editor"; import {App} from "../../index"; export const getRecentDocs = (app: App) => { - fetchPost("/api/storage/getRecentDocs", {}, (response) => { + fetchPost("/api/storage/getRecentDocs", {sortBy: "viewedAt"}, (response) => { let html = ""; response.data.forEach((item: any, index: number) => { html += `
  • diff --git a/kernel/api/router.go b/kernel/api/router.go index 23e9061c481..163299a9332 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -80,6 +80,7 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/storage/getRecentDocs", model.CheckAuth, getRecentDocs) ginServer.Handle("POST", "/api/storage/updateRecentDocViewTime", model.CheckAuth, updateRecentDocViewTime) ginServer.Handle("POST", "/api/storage/updateRecentDocCloseTime", model.CheckAuth, updateRecentDocCloseTime) + ginServer.Handle("POST", "/api/storage/updateRecentDocOpenTime", model.CheckAuth, updateRecentDocOpenTime) ginServer.Handle("POST", "/api/account/login", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, login) ginServer.Handle("POST", "/api/account/checkActivationcode", model.CheckAuth, model.CheckAdminRole, model.CheckReadonly, checkActivationcode) diff --git a/kernel/api/storage.go b/kernel/api/storage.go index 49fa9013aae..deef663b4b6 100644 --- a/kernel/api/storage.go +++ b/kernel/api/storage.go @@ -29,10 +29,15 @@ func getRecentDocs(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + // 获取排序参数 - sortBy := c.Query("sortBy") - if sortBy == "" { - sortBy = "viewedAt" // 默认按浏览时间排序 + sortBy := "viewedAt" // 默认按浏览时间排序 + if arg["sortBy"] != nil { + sortBy = arg["sortBy"].(string) } data, err := model.GetRecentDocs(sortBy) @@ -206,6 +211,24 @@ func updateRecentDocViewTime(c *gin.Context) { } +func updateRecentDocOpenTime(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + rootID := arg["rootID"].(string) + err := model.UpdateRecentDocOpenTime(rootID) + if err != nil { + ret.Code = -1 + ret.Msg = err.Error() + return + } +} + func updateRecentDocCloseTime(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/model/storage.go b/kernel/model/storage.go index 7b92b3d648b..3961f205998 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -39,6 +39,7 @@ type RecentDoc struct { Title string `json:"title"` ViewedAt int64 `json:"viewedAt"` // 浏览时间字段 ClosedAt int64 `json:"closedAt"` // 关闭时间字段 + OpenAt int64 `json:"openAt"` // 文档第一次从文档树加载到页签的时间 } var recentDocLock = sync.Mutex{} @@ -74,6 +75,7 @@ func setRecentDocByTree(tree *parse.Tree) { Title: tree.Root.IALAttr("title"), ViewedAt: time.Now().Unix(), // 使用当前时间作为浏览时间 ClosedAt: 0, // 初始化关闭时间为0,表示未关闭 + OpenAt: time.Now().Unix(), // 设置文档打开时间 } recentDocLock.Lock() @@ -100,6 +102,33 @@ func setRecentDocByTree(tree *parse.Tree) { return } +// 新增函数:更新文档打开时间(只在第一次从文档树加载到页签时调用) +func UpdateRecentDocOpenTime(rootID string) error { + recentDocLock.Lock() + defer recentDocLock.Unlock() + + recentDocs, err := getRecentDocs() + if err != nil { + return err + } + + // 查找文档并更新打开时间 + found := false + for _, doc := range recentDocs { + if doc.RootID == rootID { + doc.OpenAt = time.Now().Unix() + found = true + break + } + } + + if found { + err = setRecentDocs(recentDocs) + } + + return err +} + // 新增函数:更新文档浏览时间 func UpdateRecentDocViewTime(rootID string) error { recentDocLock.Lock() @@ -219,44 +248,61 @@ func getRecentDocs(sortBy ...string) (ret []*RecentDoc, err error) { } } - // 按浏览时间降序排序,如果ViewedAt为0则使用文档创建时间 - sort.Slice(ret, func(i, j int) bool { - if ret[i].ViewedAt == 0 && ret[j].ViewedAt == 0 { - // 如果都没有浏览时间,按ID时间排序(ID包含时间信息) - return ret[i].RootID > ret[j].RootID - } - if ret[i].ViewedAt == 0 { - return false // 没有浏览时间的排在后面 - } - if ret[j].ViewedAt == 0 { - return true // 有浏览时间的排在前面 - } - return ret[i].ViewedAt > ret[j].ViewedAt - }) - - if 0 < len(notExists) { setRecentDocs(ret) } // 根据排序参数进行排序 - if len(sortBy) > 0 && sortBy[0] == "closedAt" { - // 按关闭时间排序 - sort.Slice(ret, func(i, j int) bool { - if ret[i].ClosedAt == 0 && ret[j].ClosedAt == 0 { - // 如果都没有关闭时间,按浏览时间排序 + if len(sortBy) > 0 { + switch sortBy[0] { + case "closedAt": + // 按关闭时间排序 + sort.Slice(ret, func(i, j int) bool { + if ret[i].ClosedAt == 0 && ret[j].ClosedAt == 0 { + // 如果都没有关闭时间,按浏览时间排序 + return ret[i].ViewedAt > ret[j].ViewedAt + } + if ret[i].ClosedAt == 0 { + return false // 没有关闭时间的排在后面 + } + if ret[j].ClosedAt == 0 { + return true // 有关闭时间的排在前面 + } + return ret[i].ClosedAt > ret[j].ClosedAt + }) + case "openAt": + // 按打开时间排序 + sort.Slice(ret, func(i, j int) bool { + if ret[i].OpenAt == 0 && ret[j].OpenAt == 0 { + // 如果都没有打开时间,按ID时间排序(ID包含时间信息) + return ret[i].RootID > ret[j].RootID + } + if ret[i].OpenAt == 0 { + return false // 没有打开时间的排在后面 + } + if ret[j].OpenAt == 0 { + return true // 有打开时间的排在前面 + } + return ret[i].OpenAt > ret[j].OpenAt + }) + default: + // 默认按浏览时间排序 + sort.Slice(ret, func(i, j int) bool { + if ret[i].ViewedAt == 0 && ret[j].ViewedAt == 0 { + // 如果都没有浏览时间,按ID时间排序(ID包含时间信息) + return ret[i].RootID > ret[j].RootID + } + if ret[i].ViewedAt == 0 { + return false // 没有浏览时间的排在后面 + } + if ret[j].ViewedAt == 0 { + return true // 有浏览时间的排在前面 + } return ret[i].ViewedAt > ret[j].ViewedAt - } - if ret[i].ClosedAt == 0 { - return false // 没有关闭时间的排在后面 - } - if ret[j].ClosedAt == 0 { - return true // 有关闭时间的排在前面 - } - return ret[i].ClosedAt > ret[j].ClosedAt - }) + }) + } } else { - // 默认按浏览时间排序 + // 默认按浏览时间降序排序,如果ViewedAt为0则使用文档创建时间 sort.Slice(ret, func(i, j int) bool { if ret[i].ViewedAt == 0 && ret[j].ViewedAt == 0 { // 如果都没有浏览时间,按ID时间排序(ID包含时间信息) From 68cb0632de2281ab1d85baa2ea3ad532add99fea Mon Sep 17 00:00:00 2001 From: Tron Date: Fri, 12 Sep 2025 00:01:41 +0800 Subject: [PATCH 14/16] =?UTF-8?q?=F0=9F=8E=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/model/storage.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/model/storage.go b/kernel/model/storage.go index 3961f205998..fe0841703d3 100644 --- a/kernel/model/storage.go +++ b/kernel/model/storage.go @@ -102,7 +102,7 @@ func setRecentDocByTree(tree *parse.Tree) { return } -// 新增函数:更新文档打开时间(只在第一次从文档树加载到页签时调用) +// 更新文档打开时间(只在第一次从文档树加载到页签时调用) func UpdateRecentDocOpenTime(rootID string) error { recentDocLock.Lock() defer recentDocLock.Unlock() @@ -129,7 +129,7 @@ func UpdateRecentDocOpenTime(rootID string) error { return err } -// 新增函数:更新文档浏览时间 +// 更新文档浏览时间 func UpdateRecentDocViewTime(rootID string) error { recentDocLock.Lock() defer recentDocLock.Unlock() @@ -160,7 +160,7 @@ func UpdateRecentDocViewTime(rootID string) error { return err } -// 新增函数:更新文档关闭时间 +// 更新文档关闭时间 func UpdateRecentDocCloseTime(rootID string) error { recentDocLock.Lock() defer recentDocLock.Unlock() From eeabbafc3f5e0e3a024d1d7945a57322678687a1 Mon Sep 17 00:00:00 2001 From: Tron Date: Fri, 12 Sep 2025 00:02:55 +0800 Subject: [PATCH 15/16] =?UTF-8?q?=E2=8F=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/win-build.bat | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/scripts/win-build.bat b/scripts/win-build.bat index 88f3122ad3a..20d968653b1 100644 --- a/scripts/win-build.bat +++ b/scripts/win-build.bat @@ -16,6 +16,7 @@ cd .. echo 'Cleaning Builds' del /S /Q /F app\build 1>nul del /S /Q /F app\kernel 1>nul +del /S /Q /F app\kernel-arm64 1>nul echo 'Building Kernel' @REM the C compiler "gcc" is necessary https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ @@ -37,16 +38,34 @@ if errorlevel 1 ( exit /b %errorlevel% ) - +echo 'Building Kernel arm64' +set GOARCH=arm64 +@REM if you want to build arm64, you need to install aarch64-w64-mingw32-gcc +set CC="D:/Program Files/llvm-mingw-20240518-ucrt-x86_64/bin/aarch64-w64-mingw32-gcc.exe" +go build --tags fts5 -v -o "../app/kernel-arm64/SiYuan-Kernel.exe" -ldflags "-s -w -H=windowsgui" . +if errorlevel 1 ( + exit /b %errorlevel% +) cd .. echo 'Building Electron App amd64' cd app copy "elevator\elevator-amd64.exe" "kernel\elevator.exe" +copy "elevator\elevator-arm64.exe" "kernel-arm64\elevator.exe" call pnpm run dist if errorlevel 1 ( exit /b %errorlevel% ) -cd .. \ No newline at end of file +echo 'Building Electron App arm64' +call pnpm run dist-arm64 +if errorlevel 1 ( + exit /b %errorlevel% +) +cd .. + +echo 'Building Appx' +echo 'Building Appx should be disabled if you do not need it. Not configured correctly will lead to build failures' +cd . > app\build\win-unpacked\resources\ms-store +electron-windows-store --input-directory app\build\win-unpacked --output-directory app\build\ --package-version 1.0.0.0 --package-name SiYuan --manifest app\appx\AppxManifest.xml --assets app\appx\assets\ --make-pri true \ No newline at end of file From acc8ca4ab8b503827eb92effeef58074c60401f7 Mon Sep 17 00:00:00 2001 From: Achuan-2 Date: Fri, 26 Sep 2025 23:32:07 +0800 Subject: [PATCH 16/16] Update win-build.bat --- scripts/win-build.bat | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/win-build.bat b/scripts/win-build.bat index 09119b7988d..9d33c19a752 100644 --- a/scripts/win-build.bat +++ b/scripts/win-build.bat @@ -77,4 +77,4 @@ echo 'Building Appx arm64 should be disabled if you do not need it. Not configur cd . > app\build\win-arm64-unpacked\resources\ms-store call electron-windows-store --input-directory app\build\win-arm64-unpacked --output-directory app\build\ --package-version 1.0.0.0 --package-name SiYuan-arm64 --manifest app\appx\AppxManifest-arm64.xml --assets app\appx\assets\ --make-pri true -rmdir /S /Q app\build\pre-appx 1>nul \ No newline at end of file +rmdir /S /Q app\build\pre-appx 1>nul