mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-05-04 01:59:05 +08:00
🎨 为桌面端添加 同步模式
选择 https://github.com/siyuan-note/siyuan/issues/5089
This commit is contained in:
parent
9635154e45
commit
b108480450
@ -173,6 +173,10 @@
|
|||||||
"setEmojiTip": "请在 [设置 - 外观] 中添加自定义表情",
|
"setEmojiTip": "请在 [设置 - 外观] 中添加自定义表情",
|
||||||
"openSyncTip1": "启用云端同步",
|
"openSyncTip1": "启用云端同步",
|
||||||
"openSyncTip2": "从禁用改为启用时建议手动点击同步按钮触发一次同步",
|
"openSyncTip2": "从禁用改为启用时建议手动点击同步按钮触发一次同步",
|
||||||
|
"syncMode": "云端同步模式",
|
||||||
|
"syncModeTip": "启用云端同步后可进一步选择同步模式",
|
||||||
|
"syncMode1": "自动同步(数据不再变动后 30 秒进行一次同步)",
|
||||||
|
"syncMode2": "手动同步(仅启动和关闭软件时自动同步一次,其他时候需要手动触发同步)",
|
||||||
"cloudSync": "云端同步",
|
"cloudSync": "云端同步",
|
||||||
"cloudSyncDir": "云端同步目录",
|
"cloudSyncDir": "云端同步目录",
|
||||||
"emptyCloudSyncList": "云端同步列表为空",
|
"emptyCloudSyncList": "云端同步列表为空",
|
||||||
|
@ -325,6 +325,17 @@ ${passwordHTML}
|
|||||||
<span class="fn__space"></span>
|
<span class="fn__space"></span>
|
||||||
<input type="checkbox" id="reposCloudSyncSwitch"${window.siyuan.config.sync.enabled ? " checked='checked'" : ""} class="b3-switch fn__flex-center">
|
<input type="checkbox" id="reposCloudSyncSwitch"${window.siyuan.config.sync.enabled ? " checked='checked'" : ""} class="b3-switch fn__flex-center">
|
||||||
</label>
|
</label>
|
||||||
|
<label class="fn__flex b3-label">
|
||||||
|
<div class="fn__flex-1">
|
||||||
|
${window.siyuan.languages.syncMode}
|
||||||
|
<div class="b3-label__text">${window.siyuan.languages.syncModeTip}</div>
|
||||||
|
</div>
|
||||||
|
<span class="fn__space"></span>
|
||||||
|
<select id="syncMode" class="b3-select fn__flex-center fn__size200">
|
||||||
|
<option value="1" ${window.siyuan.config.sync.mode === 1 ? "selected" : ""}>${window.siyuan.languages.syncMode1}</option>
|
||||||
|
<option value="2" ${window.siyuan.config.sync.mode === 2 ? "selected" : ""}>${window.siyuan.languages.syncMode2}</option>
|
||||||
|
</select>
|
||||||
|
</label>
|
||||||
<div class="b3-label">
|
<div class="b3-label">
|
||||||
<div class="fn__flex">
|
<div class="fn__flex">
|
||||||
<div class="fn__flex-center">${window.siyuan.languages.cloudSync}</div>
|
<div class="fn__flex-center">${window.siyuan.languages.cloudSync}</div>
|
||||||
@ -362,6 +373,17 @@ ${passwordHTML}
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
const syncModeElement = repos.element.querySelector("#syncMode") as HTMLSelectElement;
|
||||||
|
syncModeElement.addEventListener("change", () => {
|
||||||
|
fetchPost("/api/sync/setSyncMode", {mode: parseInt(syncModeElement.value, 10)}, (response) => {
|
||||||
|
if (response.code === 1) {
|
||||||
|
showMessage(response.msg);
|
||||||
|
syncModeElement.value = "1";
|
||||||
|
} else {
|
||||||
|
window.siyuan.config.sync.mode = parseInt(syncModeElement.value, 10);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
const loadingElement = repos.element.querySelector("#reposLoading") as HTMLElement;
|
const loadingElement = repos.element.querySelector("#reposLoading") as HTMLElement;
|
||||||
loadingElement.style.width = repos.element.clientWidth + "px";
|
loadingElement.style.width = repos.element.clientWidth + "px";
|
||||||
loadingElement.style.height = repos.element.clientHeight + "px";
|
loadingElement.style.height = repos.element.clientHeight + "px";
|
||||||
|
1
app/src/types/index.d.ts
vendored
1
app/src/types/index.d.ts
vendored
@ -242,6 +242,7 @@ declare interface IConfig {
|
|||||||
e2eePasswdMode: number
|
e2eePasswdMode: number
|
||||||
sync: {
|
sync: {
|
||||||
enabled: boolean
|
enabled: boolean
|
||||||
|
mode: number
|
||||||
synced: number
|
synced: number
|
||||||
stat: string
|
stat: string
|
||||||
interval: number
|
interval: number
|
||||||
|
@ -163,6 +163,7 @@ func ServeAPI(ginServer *gin.Engine) {
|
|||||||
ginServer.Handle("POST", "/api/backup/removeCloudBackup", model.CheckAuth, model.CheckReadonly, removeCloudBackup)
|
ginServer.Handle("POST", "/api/backup/removeCloudBackup", model.CheckAuth, model.CheckReadonly, removeCloudBackup)
|
||||||
|
|
||||||
ginServer.Handle("POST", "/api/sync/setSyncEnable", model.CheckAuth, setSyncEnable)
|
ginServer.Handle("POST", "/api/sync/setSyncEnable", model.CheckAuth, setSyncEnable)
|
||||||
|
ginServer.Handle("POST", "/api/sync/setSyncMode", model.CheckAuth, setSyncMode)
|
||||||
ginServer.Handle("POST", "/api/sync/setCloudSyncDir", model.CheckAuth, setCloudSyncDir)
|
ginServer.Handle("POST", "/api/sync/setCloudSyncDir", model.CheckAuth, setCloudSyncDir)
|
||||||
ginServer.Handle("POST", "/api/sync/createCloudSyncDir", model.CheckAuth, model.CheckReadonly, createCloudSyncDir)
|
ginServer.Handle("POST", "/api/sync/createCloudSyncDir", model.CheckAuth, model.CheckReadonly, createCloudSyncDir)
|
||||||
ginServer.Handle("POST", "/api/sync/removeCloudSyncDir", model.CheckAuth, model.CheckReadonly, removeCloudSyncDir)
|
ginServer.Handle("POST", "/api/sync/removeCloudSyncDir", model.CheckAuth, model.CheckReadonly, removeCloudSyncDir)
|
||||||
|
@ -140,6 +140,25 @@ func setSyncEnable(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setSyncMode(c *gin.Context) {
|
||||||
|
ret := gulu.Ret.NewResult()
|
||||||
|
defer c.JSON(http.StatusOK, ret)
|
||||||
|
|
||||||
|
arg, ok := util.JsonArg(c, ret)
|
||||||
|
if !ok {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mode := int(arg["mode"].(float64))
|
||||||
|
err := model.SetSyncMode(mode)
|
||||||
|
if nil != err {
|
||||||
|
ret.Code = 1
|
||||||
|
ret.Msg = err.Error()
|
||||||
|
ret.Data = map[string]interface{}{"closeTimeout": 5000}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setCloudSyncDir(c *gin.Context) {
|
func setCloudSyncDir(c *gin.Context) {
|
||||||
ret := gulu.Ret.NewResult()
|
ret := gulu.Ret.NewResult()
|
||||||
defer c.JSON(http.StatusOK, ret)
|
defer c.JSON(http.StatusOK, ret)
|
||||||
|
@ -25,6 +25,7 @@ import (
|
|||||||
type Sync struct {
|
type Sync struct {
|
||||||
CloudName string `json:"cloudName"` // 云端同步目录名称
|
CloudName string `json:"cloudName"` // 云端同步目录名称
|
||||||
Enabled bool `json:"enabled"` // 是否开启同步
|
Enabled bool `json:"enabled"` // 是否开启同步
|
||||||
|
Mode int `json:"mode"` // 同步模式,0:未设置(为兼容已有配置,initConf 函数中会转换为 1),1:自动,2:手动 https://github.com/siyuan-note/siyuan/issues/5089
|
||||||
Uploaded int64 `json:"uploaded"` // 最近上传时间
|
Uploaded int64 `json:"uploaded"` // 最近上传时间
|
||||||
Downloaded int64 `json:"downloaded"` // 最近下载时间
|
Downloaded int64 `json:"downloaded"` // 最近下载时间
|
||||||
Synced int64 `json:"synced"` // 最近同步时间
|
Synced int64 `json:"synced"` // 最近同步时间
|
||||||
@ -35,6 +36,7 @@ func NewSync() *Sync {
|
|||||||
return &Sync{
|
return &Sync{
|
||||||
CloudName: "main",
|
CloudName: "main",
|
||||||
Enabled: true,
|
Enabled: true,
|
||||||
|
Mode: 1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -214,6 +214,9 @@ func InitConf() {
|
|||||||
util.LogErrorf("create sync dir [%s] failed: %s", Conf.Sync.GetSaveDir(), err)
|
util.LogErrorf("create sync dir [%s] failed: %s", Conf.Sync.GetSaveDir(), err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if 0 == Conf.Sync.Mode {
|
||||||
|
Conf.Sync.Mode = 1
|
||||||
|
}
|
||||||
|
|
||||||
if nil == Conf.Api {
|
if nil == Conf.Api {
|
||||||
Conf.Api = conf.NewAPI()
|
Conf.Api = conf.NewAPI()
|
||||||
|
@ -513,6 +513,15 @@ func SetSyncEnable(b bool) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetSyncMode(mode int) (err error) {
|
||||||
|
syncLock.Lock()
|
||||||
|
defer syncLock.Unlock()
|
||||||
|
|
||||||
|
Conf.Sync.Mode = mode
|
||||||
|
Conf.Save()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
var syncLock = sync.Mutex{}
|
var syncLock = sync.Mutex{}
|
||||||
|
|
||||||
func syncDirUpsertWorkspaceData(downloadedFiles []string) (err error) {
|
func syncDirUpsertWorkspaceData(downloadedFiles []string) (err error) {
|
||||||
|
Loading…
Reference in New Issue
Block a user