2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 09:13:49 +08:00

feat: add server restart option to home page restart button (#1324)

* Initial plan

* feat: add server restart functionality to home page restart button

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

* refactor: remove unreachable success callback for server restart

Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: devhaozi <115467771+devhaozi@users.noreply.github.com>
This commit is contained in:
Copilot
2026-02-03 00:45:52 +08:00
committed by GitHub
parent 54b1ddb809
commit d7e8301148
8 changed files with 110 additions and 8 deletions

View File

@@ -200,6 +200,7 @@ func (route *Http) Register(r *chi.Mux) {
r.Get("/update_info", route.home.UpdateInfo)
r.Post("/update", route.home.Update)
r.Post("/restart", route.home.Restart)
r.Post("/restart_server", route.home.RestartServer)
})
r.Route("/task", func(r chi.Router) {

View File

@@ -400,3 +400,13 @@ func (s *HomeService) Restart(w http.ResponseWriter, r *http.Request) {
tools.RestartPanel()
Success(w, nil)
}
func (s *HomeService) RestartServer(w http.ResponseWriter, r *http.Request) {
if s.taskRepo.HasRunningTask() {
Error(w, http.StatusInternalServerError, s.t.Get("background task is running, restart is prohibited, please try again later"))
return
}
tools.RestartServer()
Success(w, nil)
}

View File

@@ -88,6 +88,11 @@ func RestartPanel() {
_ = shell.ExecfAsync("sleep 1 && systemctl restart acepanel")
}
// RestartServer 重启服务器
func RestartServer() {
_ = shell.ExecfAsync("sleep 1 && reboot")
}
// IsChina 是否中国大陆
func IsChina() bool {
client := resty.New()

View File

@@ -21,5 +21,7 @@ export default {
// 更新面板
update: (): any => http.Post('/home/update'),
// 重启面板
restart: (): any => http.Post('/home/restart')
restart: (): any => http.Post('/home/restart'),
// 重启服务器
restartServer: (): any => http.Post('/home/restart_server')
}

View File

@@ -5082,6 +5082,22 @@ msgstr "Panel restarting..."
msgid "Panel restarted successfully"
msgstr "Panel restarted successfully"
#: src/views/home/IndexView.vue:338
msgid "Server restarting..."
msgstr "Server restarting..."
#: src/views/home/IndexView.vue:344
msgid "Restart Panel"
msgstr "Restart Panel"
#: src/views/home/IndexView.vue:348
msgid "Restart Server"
msgstr "Restart Server"
#: src/views/home/IndexView.vue:362
msgid "Are you sure you want to restart the server? This will disconnect all connections."
msgstr "Are you sure you want to restart the server? This will disconnect all connections."
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "Current version is the latest"

View File

@@ -4845,6 +4845,22 @@ msgstr "面板重启中……"
msgid "Panel restarted successfully"
msgstr "面板重启成功"
#: src/views/home/IndexView.vue:338
msgid "Server restarting..."
msgstr "服务器重启中……"
#: src/views/home/IndexView.vue:344
msgid "Restart Panel"
msgstr "重启面板"
#: src/views/home/IndexView.vue:348
msgid "Restart Server"
msgstr "重启服务器"
#: src/views/home/IndexView.vue:362
msgid "Are you sure you want to restart the server? This will disconnect all connections."
msgstr "您确定要重启服务器吗?这将断开所有连接。"
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "当前版本是最新版本"

View File

@@ -4846,6 +4846,22 @@ msgstr "面板重啟中……"
msgid "Panel restarted successfully"
msgstr "面板重啟成功"
#: src/views/home/IndexView.vue:338
msgid "Server restarting..."
msgstr "伺服器重啟中……"
#: src/views/home/IndexView.vue:344
msgid "Restart Panel"
msgstr "重啟面板"
#: src/views/home/IndexView.vue:348
msgid "Restart Server"
msgstr "重啟伺服器"
#: src/views/home/IndexView.vue:362
msgid "Are you sure you want to restart the server? This will disconnect all connections."
msgstr "您確定要重啟伺服器嗎?這將斷開所有連線。"
#: src/views/home/IndexView.vue:344
msgid "Current version is the latest"
msgstr "當前版本是最新版本"

View File

@@ -13,7 +13,7 @@ import {
} from 'echarts/components'
import { use } from 'echarts/core'
import { CanvasRenderer } from 'echarts/renderers'
import { NButton, NPopconfirm, useThemeVars } from 'naive-ui'
import { NButton, NDropdown, useThemeVars } from 'naive-ui'
import { useGettext } from 'vue3-gettext'
import draggable from 'vuedraggable'
@@ -336,6 +336,33 @@ const handleRestartPanel = () => {
})
}
const showRestartServerConfirm = ref(false)
const handleRestartServer = () => {
clearInterval(homeInterval)
window.$message.loading($gettext('Server restarting...'))
useRequest(home.restartServer())
}
const restartOptions = computed(() => [
{
label: $gettext('Restart Panel'),
key: 'panel'
},
{
label: $gettext('Restart Server'),
key: 'server'
}
])
const handleRestartSelect = (key: string) => {
if (key === 'panel') {
handleRestartPanel()
} else if (key === 'server') {
showRestartServerConfirm.value = true
}
}
const handleUpdate = () => {
useRequest(home.checkUpdate()).onSuccess(({ data }) => {
if (data.update) {
@@ -470,12 +497,9 @@ if (import.meta.hot) {
<n-button type="primary" @click="toSponsor">
{{ $gettext('Sponsor Support') }}
</n-button>
<n-popconfirm @positive-click="handleRestartPanel">
<template #trigger>
<n-button type="warning"> {{ $gettext('Restart') }} </n-button>
</template>
{{ $gettext('Are you sure you want to restart the panel?') }}
</n-popconfirm>
<n-dropdown :options="restartOptions" @select="handleRestartSelect">
<n-button type="warning"> {{ $gettext('Restart') }} </n-button>
</n-dropdown>
<n-button type="info" @click="handleUpdate"> {{ $gettext('Update') }} </n-button>
</n-flex>
</template>
@@ -895,6 +919,18 @@ if (import.meta.hot) {
</n-space>
</div>
</app-page>
<!-- 服务器重启确认弹窗 -->
<n-modal
v-model:show="showRestartServerConfirm"
preset="dialog"
type="warning"
:title="$gettext('Restart Server')"
:content="$gettext('Are you sure you want to restart the server? This will disconnect all connections.')"
:positive-text="$gettext('Confirm')"
:negative-text="$gettext('Cancel')"
@positive-click="handleRestartServer"
/>
</template>
<style scoped>