diff --git a/.gitignore b/.gitignore index 867d2a0..acb381a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ node_modules/ dist/ .web2app/ release/ +installer/ +__appImage-x64/ # Binaries & executables *.exe diff --git a/electron/main.js b/electron/main.js index aed9986..515c3ca 100644 --- a/electron/main.js +++ b/electron/main.js @@ -111,8 +111,8 @@ ipcMain.handle('dir:readTree', async (_event, dirPath) => { return readDirectoryTree(dirPath) }) -ipcMain.handle('project:create', async (_event, name, dir) => { - return createProject(name, dir) +ipcMain.handle('project:create', async (_event, projectPath) => { + return createProject(projectPath) }) ipcMain.handle('project:load', async (_event, projectPath) => { diff --git a/electron/preload.js b/electron/preload.js index 8d623f6..d34e8ac 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -13,7 +13,7 @@ contextBridge.exposeInMainWorld('api', { readTree: (dirPath) => ipcRenderer.invoke('dir:readTree', dirPath) }, project: { - create: (name, dir) => ipcRenderer.invoke('project:create', name, dir), + create: (projectPath) => ipcRenderer.invoke('project:create', projectPath), load: (projectPath) => ipcRenderer.invoke('project:load', projectPath), save: (projectPath, data) => ipcRenderer.invoke('project:save', projectPath, data), importFiles: (projectPath, files) => ipcRenderer.invoke('project:importFiles', projectPath, files), diff --git a/electron/project.js b/electron/project.js index 36de428..fdf2749 100644 --- a/electron/project.js +++ b/electron/project.js @@ -21,16 +21,21 @@ function getDistDir(projectPath) { return dir } -function createProject(name, dir) { - const projectPath = path.join(dir, name) - if (fs.existsSync(projectPath)) { - throw new Error(`目录 ${projectPath} 已存在`) +function createProject(projectPath) { + if (!fs.existsSync(projectPath)) { + fs.mkdirSync(projectPath, { recursive: true }) } + + const configPath = getConfigPath(projectPath) + if (fs.existsSync(configPath)) { + throw new Error(`该目录已是 Web2App 项目`) + } + fs.mkdirSync(path.join(projectPath, '.web2app', 'src'), { recursive: true }) fs.mkdirSync(path.join(projectPath, '.web2app', 'dist'), { recursive: true }) const config = { - name, + name: path.basename(projectPath), version: '1.0.0', description: '', author: '', @@ -47,7 +52,7 @@ function createProject(name, dir) { updatedAt: new Date().toISOString() } - fs.writeFileSync(getConfigPath(projectPath), JSON.stringify(config, null, 2)) + fs.writeFileSync(configPath, JSON.stringify(config, null, 2)) return { projectPath, config } } diff --git a/package.json b/package.json index 4e5ca97..7970cd4 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "appId": "com.web2app.app", "productName": "Web2App", "directories": { - "output": "release" + "output": "installer" }, "files": [ "electron/**/*", diff --git a/src/stores/project.js b/src/stores/project.js index 7e4b76d..5bb6d1b 100644 --- a/src/stores/project.js +++ b/src/stores/project.js @@ -28,8 +28,8 @@ export const useProjectStore = defineStore('project', { }, actions: { - async createProject(name, dir) { - const result = await window.api.project.create(name, dir) + async createProject(projectPath) { + const result = await window.api.project.create(projectPath) this.projectPath = result.projectPath this.config = result.config this.files = [] diff --git a/src/views/Home.vue b/src/views/Home.vue index e763d99..0f4b0e6 100644 --- a/src/views/Home.vue +++ b/src/views/Home.vue @@ -12,13 +12,13 @@
+ 新建项目 - 创建新的 Web2App 项目 + 选择文件夹,快速创建项目
打开项目 - 打开已有的 .web2app 项目 + 打开已有的 Web2App 项目
@@ -42,15 +42,6 @@
- - @@ -58,26 +49,17 @@ import { ref } from 'vue' import { useRouter } from 'vue-router' import { useProjectStore } from '../stores/project' -import InputDialog from '../components/InputDialog.vue' const router = useRouter() const store = useProjectStore() const recentProjects = ref(loadRecentProjects()) -const showInput = ref(false) -const pendingDir = ref('') async function createNewProject() { const dir = await window.api.dialog.selectDirectory() if (!dir) return - pendingDir.value = dir - showInput.value = true -} - -async function onNameConfirmed(name) { - showInput.value = false try { - await store.createProject(name, pendingDir.value) - addRecentProject(pendingDir.value, name) + await store.createProject(dir) + addRecentProject(dir, store.config.name) router.push('/editor') } catch (err) { await window.api.dialog.showMessage({ @@ -88,10 +70,6 @@ async function onNameConfirmed(name) { } } -function onNameCancelled() { - showInput.value = false -} - async function openExistingProject() { const dir = await window.api.dialog.selectDirectory() if (!dir) return diff --git a/src/views/ProjectEditor.vue b/src/views/ProjectEditor.vue index b786a43..cb127b8 100644 --- a/src/views/ProjectEditor.vue +++ b/src/views/ProjectEditor.vue @@ -21,8 +21,8 @@
@@ -32,8 +32,9 @@ @delete="handleDelete" />
-

暂无资源

-

点击上方按钮导入网站文件

+
📁
+

尚未设置资源路径

+

点击上方「路径」按钮,选择你的网站目录导入

@@ -186,6 +187,12 @@ onBeforeUnmount(() => { padding: 8px; } +.empty-icon { + font-size: 48px; + opacity: 0.3; + margin-bottom: 8px; +} + .hint { font-size: 12px; }