diff --git a/cmd/ace/wire_gen.go b/cmd/ace/wire_gen.go index da01aee9..92406b9f 100644 --- a/cmd/ace/wire_gen.go +++ b/cmd/ace/wire_gen.go @@ -85,7 +85,7 @@ func initWeb() (*app.Web, error) { taskService := service.NewTaskService(taskRepo) websiteService := service.NewWebsiteService(websiteRepo, settingRepo) projectRepo := data.NewProjectRepo(locale, db, logger) - projectService := service.NewProjectService(projectRepo) + projectService := service.NewProjectService(projectRepo, settingRepo) databaseService := service.NewDatabaseService(databaseRepo) databaseServerService := service.NewDatabaseServerService(databaseServerRepo) databaseUserService := service.NewDatabaseUserService(databaseUserRepo) diff --git a/internal/biz/setting.go b/internal/biz/setting.go index 755a0c0a..e5767626 100644 --- a/internal/biz/setting.go +++ b/internal/biz/setting.go @@ -17,6 +17,7 @@ const ( SettingKeyMonitorDays SettingKey = "monitor_days" SettingKeyBackupPath SettingKey = "backup_path" SettingKeyWebsitePath SettingKey = "website_path" + SettingKeyProjectPath SettingKey = "project_path" SettingKeyWebsiteTLSVersions SettingKey = "website_tls_versions" SettingKeyWebsiteCipherSuites SettingKey = "website_tls_cipher_suites" SettingKeyMySQLRootPassword SettingKey = "mysql_root_password" diff --git a/internal/data/setting.go b/internal/data/setting.go index be4e71ef..884a005c 100644 --- a/internal/data/setting.go +++ b/internal/data/setting.go @@ -225,6 +225,10 @@ func (r *settingRepo) GetPanel() (*request.SettingPanel, error) { if err != nil { return nil, err } + projectPath, err := r.Get(biz.SettingKeyProjectPath) + if err != nil { + return nil, err + } hiddenMenu, err := r.GetSlice(biz.SettingHiddenMenu) if err != nil { return nil, err @@ -261,6 +265,7 @@ func (r *settingRepo) GetPanel() (*request.SettingPanel, error) { BindUA: r.conf.HTTP.BindUA, WebsitePath: websitePath, BackupPath: backupPath, + ProjectPath: projectPath, HiddenMenu: hiddenMenu, CustomLogo: customLogo, Port: r.conf.HTTP.Port, @@ -291,6 +296,9 @@ func (r *settingRepo) UpdatePanel(ctx context.Context, req *request.SettingPanel if err := r.Set(biz.SettingKeyBackupPath, req.BackupPath); err != nil { return false, err } + if err := r.Set(biz.SettingKeyProjectPath, req.ProjectPath); err != nil { + return false, err + } if err := r.SetSlice(biz.SettingHiddenMenu, req.HiddenMenu); err != nil { return false, err } diff --git a/internal/http/request/project.go b/internal/http/request/project.go index 373eb1c4..e03719a2 100644 --- a/internal/http/request/project.go +++ b/internal/http/request/project.go @@ -6,7 +6,7 @@ type ProjectCreate struct { Name string `form:"name" json:"name" validate:"required|regex:^[a-zA-Z0-9_-]+$"` Type types.ProjectType `form:"type" json:"type" validate:"required|in:general,php,java,go,python,nodejs"` Description string `form:"description" json:"description"` - RootDir string `form:"root_dir" json:"root_dir" validate:"required"` + RootDir string `form:"root_dir" json:"root_dir"` WorkingDir string `form:"working_dir" json:"working_dir"` ExecStart string `form:"exec_start" json:"exec_start"` User string `form:"user" json:"user"` diff --git a/internal/http/request/setting.go b/internal/http/request/setting.go index 075f1825..c1ad04df 100644 --- a/internal/http/request/setting.go +++ b/internal/http/request/setting.go @@ -19,6 +19,7 @@ type SettingPanel struct { BindUA []string `json:"bind_ua"` WebsitePath string `json:"website_path" validate:"required"` BackupPath string `json:"backup_path" validate:"required"` + ProjectPath string `json:"project_path" validate:"required"` HiddenMenu []string `json:"hidden_menu"` // 隐藏的菜单项 CustomLogo string `json:"custom_logo" validate:"isFullURL"` // 自定义 Logo URL Port uint `json:"port" validate:"required|min:1|max:65535"` diff --git a/internal/service/project.go b/internal/service/project.go index 0b736531..5fc44bc7 100644 --- a/internal/service/project.go +++ b/internal/service/project.go @@ -2,6 +2,7 @@ package service import ( "net/http" + "path/filepath" "github.com/libtnb/chix" @@ -12,11 +13,13 @@ import ( type ProjectService struct { projectRepo biz.ProjectRepo + settingRepo biz.SettingRepo } -func NewProjectService(project biz.ProjectRepo) *ProjectService { +func NewProjectService(project biz.ProjectRepo, setting biz.SettingRepo) *ProjectService { return &ProjectService{ projectRepo: project, + settingRepo: setting, } } @@ -63,6 +66,11 @@ func (s *ProjectService) Create(w http.ResponseWriter, r *http.Request) { return } + if len(req.RootDir) == 0 { + req.RootDir, _ = s.settingRepo.Get(biz.SettingKeyProjectPath, "/opt/ace/projects") + req.RootDir = filepath.Join(req.RootDir, req.Name) + } + project, err := s.projectRepo.Create(r.Context(), req) if err != nil { Error(w, http.StatusInternalServerError, "%v", err) diff --git a/web/src/views/project/CreateModal.vue b/web/src/views/project/CreateModal.vue index 8f217a82..eba39e54 100644 --- a/web/src/views/project/CreateModal.vue +++ b/web/src/views/project/CreateModal.vue @@ -25,7 +25,7 @@ const phpFrameworks = [ const createModel = ref({ name: '', type: '', - root_dir: '/opt/ace/projects', + root_dir: '', working_dir: '', exec_start: '', user: 'www' @@ -98,7 +98,7 @@ const handleCreate = async () => { createModel.value = { name: '', type: '', - root_dir: '/opt/ace/projects', + root_dir: '', working_dir: '', exec_start: '', user: 'www' @@ -141,13 +141,17 @@ const modalTitle = computed(() => { /> - +