diff --git a/core/app/api/v2/setting.go b/core/app/api/v2/setting.go index a33fc9538b2d..05b62e3a00af 100644 --- a/core/app/api/v2/setting.go +++ b/core/app/api/v2/setting.go @@ -598,6 +598,42 @@ func (b *BaseApi) GetAppstoreConfig(c *gin.Context) { helper.SuccessWithData(c, res) } +// @Tags System Setting +// @Summary Load dashboard memo +// @Success 200 {string} memo +// @Security ApiKeyAuth +// @Security Timestamp +// @Router /core/settings/memo [get] +func (b *BaseApi) GetMemo(c *gin.Context) { + memo, err := settingService.GetMemo() + if err != nil { + helper.InternalServer(c, err) + return + } + helper.SuccessWithData(c, memo) +} + +// @Tags System Setting +// @Summary Update dashboard memo +// @Accept json +// @Param request body dto.MemoUpdate true "request" +// @Success 200 +// @Security ApiKeyAuth +// @Security Timestamp +// @Router /core/settings/memo [post] +// @x-panel-log {"bodyKeys":[],"paramKeys":[],"BeforeFunctions":[],"formatZH":"更新仪表盘备忘录","formatEN":"update dashboard memo"} +func (b *BaseApi) UpdateMemo(c *gin.Context) { + var req dto.MemoUpdate + if err := helper.CheckBindAndValidate(&req, c); err != nil { + return + } + if err := settingService.UpdateMemo(req.Content); err != nil { + helper.InternalServer(c, err) + return + } + helper.Success(c) +} + func checkEntrancePattern(val string) bool { if len(val) == 0 { return true diff --git a/core/app/dto/setting.go b/core/app/dto/setting.go index bd275b0ab807..7b59e341cce9 100644 --- a/core/app/dto/setting.go +++ b/core/app/dto/setting.go @@ -263,3 +263,7 @@ type PasskeyInfo struct { CreatedAt string `json:"createdAt"` LastUsedAt string `json:"lastUsedAt"` } + +type MemoUpdate struct { + Content string `json:"content" validate:"max=500"` +} diff --git a/core/app/service/setting.go b/core/app/service/setting.go index a418d424a7b9..7a78445cf134 100644 --- a/core/app/service/setting.go +++ b/core/app/service/setting.go @@ -66,6 +66,9 @@ type ISettingService interface { UpdateAppstoreConfig(req dto.AppstoreUpdate) error GetAppstoreConfig() (*dto.AppstoreConfig, error) DefaultMenu() error + + GetMemo() (string, error) + UpdateMemo(content string) error } func NewISettingService() ISettingService { @@ -781,3 +784,15 @@ func checkProxy(req dto.ProxyUpdate) error { func (u *SettingService) DefaultMenu() error { return settingRepo.DefaultMenu() } + +func (u *SettingService) GetMemo() (string, error) { + memo, err := settingRepo.GetValueByKey("DashboardMemo") + if err != nil { + return "", nil + } + return memo, nil +} + +func (u *SettingService) UpdateMemo(content string) error { + return settingRepo.UpdateOrCreate("DashboardMemo", content) +} diff --git a/core/router/ro_setting.go b/core/router/ro_setting.go index e4c62c5b33d7..d26e827e70d9 100644 --- a/core/router/ro_setting.go +++ b/core/router/ro_setting.go @@ -53,5 +53,8 @@ func (s *SettingRouter) InitRouter(Router *gin.RouterGroup) { settingRouter.POST("/apps/store/update", baseApi.UpdateAppstoreConfig) settingRouter.GET("/apps/store/config", baseApi.GetAppstoreConfig) + + settingRouter.GET("/memo", baseApi.GetMemo) + settingRouter.POST("/memo", baseApi.UpdateMemo) } } diff --git a/frontend/src/api/modules/setting.ts b/frontend/src/api/modules/setting.ts index 3fd346f238ce..3121a9696bef 100644 --- a/frontend/src/api/modules/setting.ts +++ b/frontend/src/api/modules/setting.ts @@ -212,3 +212,11 @@ export const generateApiKey = () => { export const updateApiConfig = (param: Setting.ApiConfig) => { return http.post(`/core/settings/api/config/update`, param); }; + +// memo +export const getMemo = () => { + return http.get(`/core/settings/memo`); +}; +export const updateMemo = (content: string) => { + return http.post(`/core/settings/memo`, { content }); +}; diff --git a/frontend/src/lang/modules/en.ts b/frontend/src/lang/modules/en.ts index a8f950900b92..43af5df01be8 100644 --- a/frontend/src/lang/modules/en.ts +++ b/frontend/src/lang/modules/en.ts @@ -469,6 +469,10 @@ const message = { networkCard: 'Network card', disk: 'Disk', + + memo: 'Memo', + memoPlaceholder: 'Click to edit memo...', + tooltipSensitiveInfo: 'Show/Hide sensitive info', }, tabs: { more: 'More', diff --git a/frontend/src/lang/modules/es-es.ts b/frontend/src/lang/modules/es-es.ts index afaa8c83ed23..6c5edd291b8d 100644 --- a/frontend/src/lang/modules/es-es.ts +++ b/frontend/src/lang/modules/es-es.ts @@ -472,6 +472,9 @@ const message = { goInstall: 'Ir a instalar', networkCard: 'Tarjeta de red', disk: 'Disco', + memo: 'Memo', + memoPlaceholder: 'Haga clic para editar el memo...', + tooltipSensitiveInfo: 'Mostrar/Ocultar información sensible', }, tabs: { more: 'Más', diff --git a/frontend/src/lang/modules/ja.ts b/frontend/src/lang/modules/ja.ts index 5fd38c1add29..36660ce78814 100644 --- a/frontend/src/lang/modules/ja.ts +++ b/frontend/src/lang/modules/ja.ts @@ -456,6 +456,9 @@ const message = { networkCard: 'ネットワークカード', disk: 'ディスク', + memo: 'メモ', + memoPlaceholder: 'クリックしてメモを編集...', + tooltipSensitiveInfo: '機密情報を表示/非表示', }, tabs: { more: 'もっと', diff --git a/frontend/src/lang/modules/ko.ts b/frontend/src/lang/modules/ko.ts index 3dfda945583c..0eec31bca23a 100644 --- a/frontend/src/lang/modules/ko.ts +++ b/frontend/src/lang/modules/ko.ts @@ -459,6 +459,9 @@ const message = { networkCard: '네트워크 카드', disk: '디스크', + memo: '메모', + memoPlaceholder: '클릭하여 메모를 편집...', + tooltipSensitiveInfo: '민감한 정보 표시/숨기기', }, tabs: { more: '더 보기', diff --git a/frontend/src/lang/modules/ms.ts b/frontend/src/lang/modules/ms.ts index e2866a0287ff..aa4961a720d3 100644 --- a/frontend/src/lang/modules/ms.ts +++ b/frontend/src/lang/modules/ms.ts @@ -465,6 +465,9 @@ const message = { networkCard: 'Kad rangkaian', disk: 'Disk', + memo: 'Catatan', + memoPlaceholder: 'Klik untuk mengedit catatan...', + tooltipSensitiveInfo: 'Tunjuk/Sembunyikan maklumat sensitif', }, tabs: { more: 'Lagi', diff --git a/frontend/src/lang/modules/pt-br.ts b/frontend/src/lang/modules/pt-br.ts index df57980dfe60..b0f8a09bd767 100644 --- a/frontend/src/lang/modules/pt-br.ts +++ b/frontend/src/lang/modules/pt-br.ts @@ -463,6 +463,9 @@ const message = { networkCard: 'Placa de rede', disk: 'Disco', + memo: 'Memo', + memoPlaceholder: 'Clique para editar o memo...', + tooltipSensitiveInfo: 'Mostrar/Ocultar informações sensíveis', }, tabs: { more: 'Mais', diff --git a/frontend/src/lang/modules/ru.ts b/frontend/src/lang/modules/ru.ts index 6056996a0d40..58b27dd06764 100644 --- a/frontend/src/lang/modules/ru.ts +++ b/frontend/src/lang/modules/ru.ts @@ -460,6 +460,9 @@ const message = { networkCard: 'Интерфейс', disk: 'Диск', + memo: 'Заметка', + memoPlaceholder: 'Нажмите, чтобы редактировать заметку...', + tooltipSensitiveInfo: 'Показать/скрыть конфиденциальную информацию', }, tabs: { more: 'Больше', diff --git a/frontend/src/lang/modules/tr.ts b/frontend/src/lang/modules/tr.ts index 8d3ac7247cf4..e1903a896a1f 100644 --- a/frontend/src/lang/modules/tr.ts +++ b/frontend/src/lang/modules/tr.ts @@ -471,6 +471,9 @@ const message = { networkCard: 'Ağ kartı', disk: 'Disk', + memo: 'Not', + memoPlaceholder: 'Notu düzenlemek için tıklayın...', + tooltipSensitiveInfo: 'Hassas bilgileri göster/gizle', }, tabs: { more: 'Daha Fazla', diff --git a/frontend/src/lang/modules/zh-Hant.ts b/frontend/src/lang/modules/zh-Hant.ts index 3fb222d1eda0..fab5ee39ab28 100644 --- a/frontend/src/lang/modules/zh-Hant.ts +++ b/frontend/src/lang/modules/zh-Hant.ts @@ -454,6 +454,9 @@ const message = { networkCard: '網卡', disk: '磁碟', + memo: '備忘錄', + memoPlaceholder: '點擊編輯備忘錄內容...', + tooltipSensitiveInfo: '顯示/隱藏敏感資訊', }, tabs: { more: '更多', diff --git a/frontend/src/lang/modules/zh.ts b/frontend/src/lang/modules/zh.ts index dea62f6a3b17..deff61916b4c 100644 --- a/frontend/src/lang/modules/zh.ts +++ b/frontend/src/lang/modules/zh.ts @@ -455,6 +455,10 @@ const message = { networkCard: '网卡', disk: '磁盘', + + memo: '备忘录', + memoPlaceholder: '点击编辑备忘录内容...', + tooltipSensitiveInfo: '显示/隐藏敏感信息', }, tabs: { more: '更多', diff --git a/frontend/src/views/home/index.vue b/frontend/src/views/home/index.vue index 0cce337767fd..6bcdee4d2efa 100644 --- a/frontend/src/views/home/index.vue +++ b/frontend/src/views/home/index.vue @@ -165,23 +165,33 @@