From f48c975de3c1e7e2ca02809096e23716606292c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=97=E5=AD=90?= Date: Fri, 9 Jan 2026 17:12:57 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/ace/wire_gen.go | 4 +- internal/biz/app.go | 2 +- internal/biz/environment.go | 1 + internal/data/app.go | 4 +- internal/data/environment.go | 14 ++++++ internal/route/http.go | 2 +- internal/service/home.go | 64 +++++++++++++-------------- pkg/webserver/apache/vhost.go | 5 +++ pkg/webserver/nginx/vhost.go | 5 +++ web/src/api/panel/home/index.ts | 4 +- web/src/views/backup/IndexView.vue | 6 +-- web/src/views/task/CreateModal.vue | 6 +-- web/src/views/website/CreateModal.vue | 6 +-- web/src/views/website/EditView.vue | 4 +- 14 files changed, 74 insertions(+), 53 deletions(-) diff --git a/cmd/ace/wire_gen.go b/cmd/ace/wire_gen.go index e9f378d7..13e25d0d 100644 --- a/cmd/ace/wire_gen.go +++ b/cmd/ace/wire_gen.go @@ -77,9 +77,10 @@ func initWeb() (*app.Web, error) { certAccountRepo := data.NewCertAccountRepo(locale, db, userRepo, logger) settingRepo := data.NewSettingRepo(locale, db, config, taskRepo) websiteRepo := data.NewWebsiteRepo(locale, db, cacheRepo, databaseRepo, databaseServerRepo, databaseUserRepo, certRepo, certAccountRepo, settingRepo) + environmentRepo := data.NewEnvironmentRepo(locale, config, cacheRepo, taskRepo) cronRepo := data.NewCronRepo(locale, db) backupRepo := data.NewBackupRepo(locale, db, settingRepo, websiteRepo) - homeService := service.NewHomeService(locale, config, taskRepo, websiteRepo, appRepo, settingRepo, cronRepo, backupRepo) + homeService := service.NewHomeService(locale, config, taskRepo, websiteRepo, appRepo, environmentRepo, settingRepo, cronRepo, backupRepo) taskService := service.NewTaskService(taskRepo) websiteService := service.NewWebsiteService(websiteRepo, settingRepo) databaseService := service.NewDatabaseService(databaseRepo) @@ -91,7 +92,6 @@ func initWeb() (*app.Web, error) { certDNSService := service.NewCertDNSService(certDNSRepo) certAccountService := service.NewCertAccountService(certAccountRepo) appService := service.NewAppService(locale, appRepo, cacheRepo, settingRepo) - environmentRepo := data.NewEnvironmentRepo(locale, config, cacheRepo, taskRepo) environmentService := service.NewEnvironmentService(locale, environmentRepo, taskRepo) environmentPHPService := service.NewEnvironmentPHPService(locale, environmentRepo, taskRepo) cronService := service.NewCronService(cronRepo) diff --git a/internal/biz/app.go b/internal/biz/app.go index b8382d1f..a0a2277f 100644 --- a/internal/biz/app.go +++ b/internal/biz/app.go @@ -27,7 +27,7 @@ type AppRepo interface { GetInstalled(slug string) (*App, error) GetInstalledAll(query string, cond ...string) ([]*App, error) GetHomeShow() ([]map[string]string, error) - IsInstalled(query string, cond ...string) (bool, error) + IsInstalled(query string, cond ...any) (bool, error) Install(channel, slug string) error UnInstall(slug string) error Update(slug string) error diff --git a/internal/biz/environment.go b/internal/biz/environment.go index 388edd29..de2a757a 100644 --- a/internal/biz/environment.go +++ b/internal/biz/environment.go @@ -9,6 +9,7 @@ type EnvironmentRepo interface { Types() []types.LV All(typ ...string) api.Environments IsInstalled(typ, slug string) bool + InstalledSlugs(typ string) []string InstalledVersion(typ, slug string) string HasUpdate(typ, slug string) bool Install(typ, slug string) error diff --git a/internal/data/app.go b/internal/data/app.go index 0ca5f98f..d0b69bf3 100644 --- a/internal/data/app.go +++ b/internal/data/app.go @@ -162,14 +162,14 @@ func (r *appRepo) GetHomeShow() ([]map[string]string, error) { return filtered, nil } -func (r *appRepo) IsInstalled(query string, cond ...string) (bool, error) { +func (r *appRepo) IsInstalled(query string, cond ...any) (bool, error) { var count int64 if len(cond) == 0 { if err := r.db.Model(&biz.App{}).Where("slug = ?", query).Count(&count).Error; err != nil { return false, err } } else { - if err := r.db.Model(&biz.App{}).Where(query, cond).Count(&count).Error; err != nil { + if err := r.db.Model(&biz.App{}).Where(query, cond...).Count(&count).Error; err != nil { return false, err } } diff --git a/internal/data/environment.go b/internal/data/environment.go index 08f11954..de20a81f 100644 --- a/internal/data/environment.go +++ b/internal/data/environment.go @@ -82,6 +82,20 @@ func (r *environmentRepo) IsInstalled(typ, slug string) bool { return err == nil } +func (r *environmentRepo) InstalledSlugs(typ string) []string { + var slugs []string + all := r.All() + for _, env := range all { + if env.Type != typ { + continue + } + if r.IsInstalled(typ, env.Slug) { + slugs = append(slugs, env.Slug) + } + } + return slugs +} + func (r *environmentRepo) InstalledVersion(typ, slug string) string { if !r.IsInstalled(typ, slug) { return "" diff --git a/internal/route/http.go b/internal/route/http.go index 242bb651..e2d8bd8d 100644 --- a/internal/route/http.go +++ b/internal/route/http.go @@ -167,7 +167,7 @@ func (route *Http) Register(r *chi.Mux) { r.Post("/current", route.home.Current) r.Get("/system_info", route.home.SystemInfo) r.Get("/count_info", route.home.CountInfo) - r.Get("/installed_db_and_php", route.home.InstalledDbAndPhp) + r.Get("/installed_environment", route.home.InstalledEnvironment) r.Get("/check_update", route.home.CheckUpdate) r.Get("/update_info", route.home.UpdateInfo) r.Post("/update", route.home.Update) diff --git a/internal/service/home.go b/internal/service/home.go index 61756ceb..925cd84e 100644 --- a/internal/service/home.go +++ b/internal/service/home.go @@ -4,7 +4,6 @@ import ( "fmt" "net" "net/http" - "regexp" "strings" "github.com/hashicorp/go-version" @@ -27,28 +26,30 @@ import ( ) type HomeService struct { - t *gotext.Locale - api *api.API - conf *config.Config - taskRepo biz.TaskRepo - websiteRepo biz.WebsiteRepo - appRepo biz.AppRepo - settingRepo biz.SettingRepo - cronRepo biz.CronRepo - backupRepo biz.BackupRepo + t *gotext.Locale + api *api.API + conf *config.Config + taskRepo biz.TaskRepo + websiteRepo biz.WebsiteRepo + appRepo biz.AppRepo + environmentRepo biz.EnvironmentRepo + settingRepo biz.SettingRepo + cronRepo biz.CronRepo + backupRepo biz.BackupRepo } -func NewHomeService(t *gotext.Locale, conf *config.Config, task biz.TaskRepo, website biz.WebsiteRepo, appRepo biz.AppRepo, setting biz.SettingRepo, cron biz.CronRepo, backupRepo biz.BackupRepo) *HomeService { +func NewHomeService(t *gotext.Locale, conf *config.Config, task biz.TaskRepo, website biz.WebsiteRepo, appRepo biz.AppRepo, environment biz.EnvironmentRepo, setting biz.SettingRepo, cron biz.CronRepo, backupRepo biz.BackupRepo) *HomeService { return &HomeService{ - t: t, - api: api.NewAPI(app.Version, app.Locale), - conf: conf, - taskRepo: task, - websiteRepo: website, - appRepo: appRepo, - settingRepo: setting, - cronRepo: cron, - backupRepo: backupRepo, + t: t, + api: api.NewAPI(app.Version, app.Locale), + conf: conf, + taskRepo: task, + websiteRepo: website, + appRepo: appRepo, + environmentRepo: environment, + settingRepo: setting, + cronRepo: cron, + backupRepo: backupRepo, } } @@ -190,24 +191,17 @@ func (s *HomeService) CountInfo(w http.ResponseWriter, r *http.Request) { }) } -func (s *HomeService) InstalledDbAndPhp(w http.ResponseWriter, r *http.Request) { - mysqlInstalled, _ := s.appRepo.IsInstalled("slug = ?", "mysql") +func (s *HomeService) InstalledEnvironment(w http.ResponseWriter, r *http.Request) { + mysqlInstalled, _ := s.appRepo.IsInstalled("slug IN ?", []string{"mysql", "mariadb", "percona"}) postgresqlInstalled, _ := s.appRepo.IsInstalled("slug = ?", "postgresql") - php, _ := s.appRepo.GetInstalledAll("slug like ?", "php%") var phpData []types.LVInt var dbData []types.LV phpData = append(phpData, types.LVInt{Value: 0, Label: s.t.Get("Not used")}) dbData = append(dbData, types.LV{Value: "0", Label: s.t.Get("Not used")}) - for _, p := range php { - // 过滤 phpmyadmin - match := regexp.MustCompile(`php(\d+)`).FindStringSubmatch(p.Slug) - if len(match) == 0 { - continue - } - - item, _ := s.appRepo.Get(p.Slug) - phpData = append(phpData, types.LVInt{Value: cast.ToInt(strings.ReplaceAll(p.Slug, "php", "")), Label: item.Name}) + for _, slug := range s.environmentRepo.InstalledSlugs("php") { + ver := s.environmentRepo.InstalledVersion("php", slug) + phpData = append(phpData, types.LVInt{Value: cast.ToInt(slug), Label: fmt.Sprintf("PHP %s", ver)}) } if mysqlInstalled { @@ -217,9 +211,11 @@ func (s *HomeService) InstalledDbAndPhp(w http.ResponseWriter, r *http.Request) dbData = append(dbData, types.LV{Value: "postgresql", Label: "PostgreSQL"}) } + webserver, _ := s.settingRepo.Get(biz.SettingKeyWebserver) Success(w, chix.M{ - "php": phpData, - "db": dbData, + "webserver": webserver, + "php": phpData, + "db": dbData, }) } diff --git a/pkg/webserver/apache/vhost.go b/pkg/webserver/apache/vhost.go index 82db0864..3aa329b3 100644 --- a/pkg/webserver/apache/vhost.go +++ b/pkg/webserver/apache/vhost.go @@ -132,6 +132,11 @@ func (v *baseVhost) SetEnable(enable bool) error { return err } + // 清理保存的根目录文件 + if enable { + _ = os.RemoveAll(filepath.Join(v.configDir, "root.saved")) + } + // 设置 Include 配置 v.vhost.RemoveDirectives("IncludeOptional") if enable { diff --git a/pkg/webserver/nginx/vhost.go b/pkg/webserver/nginx/vhost.go index 1243ddcb..eef75084 100644 --- a/pkg/webserver/nginx/vhost.go +++ b/pkg/webserver/nginx/vhost.go @@ -135,6 +135,11 @@ func (v *baseVhost) SetEnable(enable bool) error { return err } + // 清理保存的根目录文件 + if enable { + _ = os.RemoveAll(filepath.Join(v.configDir, "root.saved")) + } + // 设置导入配置 _ = v.parser.Clear("server.include") if enable { diff --git a/web/src/api/panel/home/index.ts b/web/src/api/panel/home/index.ts index 4e2882c4..3b1a4038 100644 --- a/web/src/api/panel/home/index.ts +++ b/web/src/api/panel/home/index.ts @@ -12,8 +12,8 @@ export default { systemInfo: (): any => http.Get('/home/system_info'), // 统计信息 countInfo: (): any => http.Get('/home/count_info'), - // 已安装的数据库和PHP - installedDbAndPhp: (): any => http.Get('/home/installed_db_and_php'), + // 已安装的环境 + installedEnvironment: (): any => http.Get('/home/installed_environment'), // 检查更新 checkUpdate: (): any => http.Get('/home/check_update'), // 更新日志 diff --git a/web/src/views/backup/IndexView.vue b/web/src/views/backup/IndexView.vue index 8475ccba..1ae3779e 100644 --- a/web/src/views/backup/IndexView.vue +++ b/web/src/views/backup/IndexView.vue @@ -10,7 +10,7 @@ import { useGettext } from 'vue3-gettext' const { $gettext } = useGettext() const currentTab = ref('website') -const { data: installedDbAndPhp } = useRequest(home.installedDbAndPhp, { +const { data: installedEnvironment } = useRequest(home.installedEnvironment, { initialData: { db: [ { @@ -22,11 +22,11 @@ const { data: installedDbAndPhp } = useRequest(home.installedDbAndPhp, { }) const mySQLInstalled = computed(() => { - return installedDbAndPhp.value.db.find((item: any) => item.value === 'mysql') + return installedEnvironment.value.db.find((item: any) => item.value === 'mysql') }) const postgreSQLInstalled = computed(() => { - return installedDbAndPhp.value.db.find((item: any) => item.value === 'postgresql') + return installedEnvironment.value.db.find((item: any) => item.value === 'postgresql') }) diff --git a/web/src/views/task/CreateModal.vue b/web/src/views/task/CreateModal.vue index 897334e8..3dd87765 100644 --- a/web/src/views/task/CreateModal.vue +++ b/web/src/views/task/CreateModal.vue @@ -24,7 +24,7 @@ const createModel = ref({ const websites = ref([]) -const { data: installedDbAndPhp } = useRequest(home.installedDbAndPhp, { +const { data: installedEnvironment } = useRequest(home.installedEnvironment, { initialData: { db: [ { @@ -36,11 +36,11 @@ const { data: installedDbAndPhp } = useRequest(home.installedDbAndPhp, { }) const mySQLInstalled = computed(() => { - return installedDbAndPhp.value.db.find((item: any) => item.value === 'mysql') + return installedEnvironment.value.db.find((item: any) => item.value === 'mysql') }) const postgreSQLInstalled = computed(() => { - return installedDbAndPhp.value.db.find((item: any) => item.value === 'postgresql') + return installedEnvironment.value.db.find((item: any) => item.value === 'postgresql') }) const handleSubmit = async () => { diff --git a/web/src/views/website/CreateModal.vue b/web/src/views/website/CreateModal.vue index 14b14de0..fa65f47b 100644 --- a/web/src/views/website/CreateModal.vue +++ b/web/src/views/website/CreateModal.vue @@ -28,7 +28,7 @@ const createModel = ref({ proxy: '' }) -const { data: installedDbAndPhp } = useRequest(home.installedDbAndPhp, { +const { data: installedEnvironment } = useRequest(home.installedEnvironment, { initialData: { php: [ { @@ -141,7 +141,7 @@ const formatDbValue = (value: string) => { @@ -153,7 +153,7 @@ const formatDbValue = (value: string) => {