diff --git a/web/build/icons/1024x1024.png b/web/build/icons/1024x1024.png deleted file mode 100644 index 9fc1c628..00000000 Binary files a/web/build/icons/1024x1024.png and /dev/null differ diff --git a/web/build/icons/128x128.png b/web/build/icons/128x128.png deleted file mode 100644 index af6310e6..00000000 Binary files a/web/build/icons/128x128.png and /dev/null differ diff --git a/web/build/icons/16x16.png b/web/build/icons/16x16.png deleted file mode 100644 index 25e80fee..00000000 Binary files a/web/build/icons/16x16.png and /dev/null differ diff --git a/web/build/icons/24x24.png b/web/build/icons/24x24.png deleted file mode 100644 index d8e4715d..00000000 Binary files a/web/build/icons/24x24.png and /dev/null differ diff --git a/web/build/icons/256x256.png b/web/build/icons/256x256.png deleted file mode 100644 index c511962f..00000000 Binary files a/web/build/icons/256x256.png and /dev/null differ diff --git a/web/build/icons/32x32.png b/web/build/icons/32x32.png deleted file mode 100644 index d70242bf..00000000 Binary files a/web/build/icons/32x32.png and /dev/null differ diff --git a/web/build/icons/48x48.png b/web/build/icons/48x48.png deleted file mode 100644 index 74fda199..00000000 Binary files a/web/build/icons/48x48.png and /dev/null differ diff --git a/web/build/icons/512x512.png b/web/build/icons/512x512.png deleted file mode 100644 index c5cda241..00000000 Binary files a/web/build/icons/512x512.png and /dev/null differ diff --git a/web/build/icons/64x64.png b/web/build/icons/64x64.png deleted file mode 100644 index 5eee4182..00000000 Binary files a/web/build/icons/64x64.png and /dev/null differ diff --git a/web/build/icons/menu@88.png b/web/build/icons/menu@88.png deleted file mode 100644 index cc14a82d..00000000 Binary files a/web/build/icons/menu@88.png and /dev/null differ diff --git a/web/dist_electron/index.js b/web/dist_electron/index.js index bb282267..0ba09b23 100644 --- a/web/dist_electron/index.js +++ b/web/dist_electron/index.js @@ -1804,7 +1804,7 @@ eval("/*\n Yaku v0.16.7\n (c) 2015 Yad Smood. http://ysmood.org\n License MIT\n* /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue_cli_plugin_electron_builder_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-cli-plugin-electron-builder/lib */ \"./node_modules/vue-cli-plugin-electron-builder/lib/index.js\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _electron_fileHandle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./electron/fileHandle */ \"./src/electron/fileHandle.js\");\n/* harmony import */ var _electron_otherHandle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./electron/otherHandle */ \"./src/electron/otherHandle.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst isDevelopment = \"development\" !== 'production'\r\n\r\n// 在应用程序准备就绪之前,必须注册方案\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"protocol\"].registerSchemesAsPrivileged([\r\n { scheme: 'app', privileges: { secure: true, standard: true } }\r\n])\r\n\r\n// 创建主页面\r\nlet mainWindow = null\r\nasync function createMainWindow() {\r\n mainWindow = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\r\n width: 1200,\r\n height: 800,\r\n frame: false,\r\n titleBarStyle: 'hiddenInset',\r\n webPreferences: {\r\n webSecurity: false,\r\n nodeIntegration: true,\r\n enableRemoteModule: true,\r\n contextIsolation: true,\r\n preload: path__WEBPACK_IMPORTED_MODULE_2___default.a.join(__dirname, 'preload.js')\r\n }\r\n })\r\n\r\n if (true) {\r\n // 如果处于开发模式,则加载开发服务器的url\r\n await mainWindow.loadURL(\r\n \"http://localhost:8080\" + '/#/workbenche'\r\n )\r\n if (!process.env.IS_TEST) mainWindow.webContents.openDevTools()\r\n } else {}\r\n}\r\n\r\n// 绑定事件\r\nconst bindEvent = () => {\r\n Object(_electron_fileHandle__WEBPACK_IMPORTED_MODULE_3__[\"bindFileHandleEvent\"])({ mainWindow })\r\n Object(_electron_otherHandle__WEBPACK_IMPORTED_MODULE_4__[\"bindOtherHandleEvent\"])()\r\n}\r\n\r\n// 关闭所有窗口后退出\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('window-all-closed', () => {\r\n // 在macOS上,应用程序及其菜单栏通常保持活动状态,直到用户使用Cmd+Q明确退出\r\n if (process.platform !== 'darwin') {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n }\r\n})\r\n\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('activate', () => {\r\n // 在macOS上,当点击dock图标且没有其他窗口打开时,通常会在应用程序中重新创建一个窗口。\r\n if (electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].getAllWindows().length === 0) {\r\n createMainWindow()\r\n // bindEvent()\r\n }\r\n})\r\n\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('ready', async () => {\r\n createMainWindow()\r\n bindEvent()\r\n})\r\n\r\n// 在开发模式下,应父进程的请求干净地退出。\r\nif (isDevelopment) {\r\n if (process.platform === 'win32') {\r\n process.on('message', data => {\r\n if (data === 'graceful-exit') {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n }\r\n })\r\n } else {\r\n process.on('SIGTERM', () => {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n })\r\n }\r\n}\r\n\n\n//# sourceURL=webpack:///./src/background.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var vue_cli_plugin_electron_builder_lib__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! vue-cli-plugin-electron-builder/lib */ \"./node_modules/vue-cli-plugin-electron-builder/lib/index.js\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _electron_fileHandle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./electron/fileHandle */ \"./src/electron/fileHandle.js\");\n/* harmony import */ var _electron_otherHandle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./electron/otherHandle */ \"./src/electron/otherHandle.js\");\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nconst isDevelopment = \"development\" !== 'production'\r\n\r\n// 在应用程序准备就绪之前,必须注册方案\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"protocol\"].registerSchemesAsPrivileged([\r\n { scheme: 'app', privileges: { secure: true, standard: true } }\r\n])\r\n\r\n// 创建主页面\r\nlet mainWindow = null\r\nasync function createMainWindow() {\r\n mainWindow = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\r\n width: 1200,\r\n height: 800,\r\n frame: false,\r\n titleBarStyle: 'hiddenInset',\r\n webPreferences: {\r\n webSecurity: false,\r\n nodeIntegration: true,\r\n enableRemoteModule: true,\r\n contextIsolation: true,\r\n preload: path__WEBPACK_IMPORTED_MODULE_2___default.a.join(__dirname, 'preload.js')\r\n }\r\n })\r\n\r\n if (true) {\r\n // 如果处于开发模式,则加载开发服务器的url\r\n await mainWindow.loadURL(\r\n \"http://localhost:8080\" + '/#/workbenche'\r\n )\r\n // if (!process.env.IS_TEST) mainWindow.webContents.openDevTools()\r\n } else {}\r\n}\r\n\r\n// 绑定事件\r\nconst bindEvent = () => {\r\n Object(_electron_fileHandle__WEBPACK_IMPORTED_MODULE_3__[\"bindFileHandleEvent\"])({ mainWindow })\r\n Object(_electron_otherHandle__WEBPACK_IMPORTED_MODULE_4__[\"bindOtherHandleEvent\"])()\r\n}\r\n\r\n// 关闭所有窗口后退出\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('window-all-closed', () => {\r\n // 在macOS上,应用程序及其菜单栏通常保持活动状态,直到用户使用Cmd+Q明确退出\r\n if (process.platform !== 'darwin') {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n }\r\n})\r\n\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('activate', () => {\r\n // 在macOS上,当点击dock图标且没有其他窗口打开时,通常会在应用程序中重新创建一个窗口。\r\n if (electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].getAllWindows().length === 0) {\r\n createMainWindow()\r\n // bindEvent()\r\n }\r\n})\r\n\r\nelectron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].on('ready', async () => {\r\n createMainWindow()\r\n bindEvent()\r\n})\r\n\r\n// 在开发模式下,应父进程的请求干净地退出。\r\nif (isDevelopment) {\r\n if (process.platform === 'win32') {\r\n process.on('message', data => {\r\n if (data === 'graceful-exit') {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n }\r\n })\r\n } else {\r\n process.on('SIGTERM', () => {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"app\"].quit()\r\n })\r\n }\r\n}\r\n\n\n//# sourceURL=webpack:///./src/background.js?"); /***/ }), @@ -1816,7 +1816,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var elec /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindFileHandleEvent\", function() { return bindFileHandleEvent; });\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fs_extra__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs-extra */ \"./node_modules/fs-extra/lib/index.js\");\n/* harmony import */ var fs_extra__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs_extra__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./storage */ \"./src/electron/storage.js\");\n/* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! uuid */ \"./node_modules/uuid/index.js\");\n/* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(uuid__WEBPACK_IMPORTED_MODULE_4__);\n\r\n\r\n\r\n\r\n\r\n\r\nconst bindFileHandleEvent = ({ mainWindow }) => {\r\n // 通知主页面刷新最近文件列表\r\n const notifyMainWindowRefreshRecentFileList = () => {\r\n mainWindow.webContents.send('refreshRecentFileList')\r\n }\r\n\r\n // 新建编辑页面\r\n const openIds = []\r\n const createEditWindow = async (event, id) => {\r\n openIds.push(id)\r\n const win = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\r\n width: 1200,\r\n height: 800,\r\n frame: false,\r\n titleBarStyle: 'hiddenInset',\r\n webPreferences: {\r\n webSecurity: false,\r\n nodeIntegration: true,\r\n enableRemoteModule: true,\r\n contextIsolation: true,\r\n preload: path__WEBPACK_IMPORTED_MODULE_2___default.a.join(__dirname, 'preload.js')\r\n }\r\n })\r\n win.on('closed', () => {\r\n // 从openIds数组中删除\r\n let index = openIds.find(item => {\r\n return item === id\r\n })\r\n if (index !== -1) {\r\n openIds.splice(index, 1)\r\n }\r\n // 从idToFilePath中删除\r\n delete idToFilePath[id]\r\n })\r\n if (true) {\r\n // Load the url of the dev server if in development mode\r\n win.loadURL(\r\n \"http://localhost:8080\" + '/#/workbenche/edit/' + id\r\n )\r\n if (!process.env.IS_TEST) win.webContents.openDevTools()\r\n } else {}\r\n }\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('create', createEditWindow)\r\n\r\n // 保存文件\r\n const idToFilePath = {}\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('save', async (event, id, data, fileName = '未命名') => {\r\n if (!idToFilePath[id]) {\r\n const webContents = event.sender\r\n const win = electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].fromWebContents(webContents)\r\n const res = electron__WEBPACK_IMPORTED_MODULE_0__[\"dialog\"].showSaveDialogSync(win, {\r\n title: '保存',\r\n defaultPath: fileName + '.smm',\r\n filters: [{ name: '思维导图', extensions: ['smm'] }]\r\n })\r\n if (res) {\r\n idToFilePath[id] = res\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.writeFile(res, data)\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(res).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n return path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(idToFilePath[id]).name\r\n }\r\n } else {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.writeFile(idToFilePath[id], data)\r\n }\r\n })\r\n\r\n // 打开文件\r\n const openFile = (event, file) => {\r\n let id = Object(uuid__WEBPACK_IMPORTED_MODULE_4__[\"v4\"])()\r\n idToFilePath[id] = file\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(file).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n createEditWindow(null, id)\r\n }\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('openFile', openFile)\r\n\r\n // 选择打开本地文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('selectOpenFile', event => {\r\n const res = electron__WEBPACK_IMPORTED_MODULE_0__[\"dialog\"].showOpenDialogSync({\r\n title: '选择',\r\n filters: [{ name: '思维导图', extensions: ['smm'] }]\r\n })\r\n if (res && res[0]) {\r\n openFile(null, res[0])\r\n }\r\n })\r\n\r\n // 获取文件内容\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('getFileContent', (event, id) => {\r\n return new Promise(resolve => {\r\n let file = idToFilePath[id]\r\n if (!file) {\r\n resolve(null)\r\n return\r\n }\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.readFile(file, { encoding: 'utf-8' }, (err, data) => {\r\n resolve({\r\n name: path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(file).name,\r\n content: JSON.parse(data)\r\n })\r\n })\r\n })\r\n })\r\n\r\n // 重命名文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('rename', (event, id, name) => {\r\n return new Promise(resolve => {\r\n if (!idToFilePath[id]) {\r\n resolve('文件不存在')\r\n return\r\n }\r\n let oldPath = idToFilePath[id]\r\n let { base, ...oldPathData } = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(oldPath)\r\n oldPathData.name = name\r\n let newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n idToFilePath[id] = newPath\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.rename(oldPath, newPath, err => {\r\n if (err) {\r\n resolve('重命名失败')\r\n } else {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"replaceFileInRecent\"])(oldPath, newPath).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n resolve()\r\n })\r\n }\r\n })\r\n })\r\n })\r\n\r\n // 获取最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('getRecentFileList', () => {\r\n return Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"getRecent\"])().map(item => {\r\n let data = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(item)\r\n return {\r\n url: item,\r\n dir: data.dir,\r\n name: data.name\r\n }\r\n })\r\n })\r\n\r\n // 清空最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('clearRecentFileList', async () => {\r\n try {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"clearRecent\"])()\r\n return ''\r\n } catch (error) {\r\n return '清空失败'\r\n }\r\n })\r\n\r\n // 添加到最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('addRecentFileList', async (event, fileList) => {\r\n try {\r\n console.log(fileList);\r\n await Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveFileListToRecent\"])(fileList)\r\n notifyMainWindowRefreshRecentFileList()\r\n } catch (error) {\r\n return error\r\n } \r\n })\r\n\r\n // 打开指定目录\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('openFileInDir', (event, file) => {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"shell\"].showItemInFolder(file)\r\n })\r\n\r\n // 删除指定文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('deleteFile', (event, file) => {\r\n let res = ''\r\n let id = Object.keys(idToFilePath).find(item => {\r\n return idToFilePath[item] === file\r\n })\r\n let index = -1\r\n if (id) {\r\n index = openIds.findIndex(item => {\r\n return item === id\r\n })\r\n }\r\n if (index === -1) {\r\n try {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.rmSync(file)\r\n } catch (error) {}\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"removeFileInRecent\"])(file)\r\n } else {\r\n res = '该文件正在编辑,请关闭后再试'\r\n }\r\n return res\r\n })\r\n\r\n // 复制文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('copyFile', async (event, file) => {\r\n return new Promise((resolve, reject) => {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.pathExists(file, (err, exists) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n if (exists) {\r\n let { base, ...oldPathData } = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(file)\r\n let newName = oldPathData.name + '-复制'\r\n let index = 1\r\n oldPathData.name = newName\r\n let newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n // 检查新路径是否已存在\r\n while (fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.pathExistsSync(newPath)) {\r\n oldPathData.name = newName + index\r\n newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n index++\r\n }\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.copy(file, newPath, err => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(newPath).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n resolve()\r\n }\r\n })\r\n } else {\r\n reject('文件不存在')\r\n }\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\n\n//# sourceURL=webpack:///./src/electron/fileHandle.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"bindFileHandleEvent\", function() { return bindFileHandleEvent; });\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var fs_extra__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs-extra */ \"./node_modules/fs-extra/lib/index.js\");\n/* harmony import */ var fs_extra__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs_extra__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./storage */ \"./src/electron/storage.js\");\n/* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! uuid */ \"./node_modules/uuid/index.js\");\n/* harmony import */ var uuid__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(uuid__WEBPACK_IMPORTED_MODULE_4__);\n\r\n\r\n\r\n\r\n\r\n\r\nconst bindFileHandleEvent = ({ mainWindow }) => {\r\n // 通知主页面刷新最近文件列表\r\n const notifyMainWindowRefreshRecentFileList = () => {\r\n mainWindow.webContents.send('refreshRecentFileList')\r\n }\r\n\r\n // 新建编辑页面\r\n const openIds = []\r\n const createEditWindow = async (event, id) => {\r\n openIds.push(id)\r\n const win = new electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"]({\r\n width: 1200,\r\n height: 800,\r\n frame: false,\r\n titleBarStyle: 'hiddenInset',\r\n webPreferences: {\r\n webSecurity: false,\r\n nodeIntegration: true,\r\n enableRemoteModule: true,\r\n contextIsolation: true,\r\n preload: path__WEBPACK_IMPORTED_MODULE_2___default.a.join(__dirname, 'preload.js')\r\n }\r\n })\r\n win.on('closed', () => {\r\n // 从openIds数组中删除\r\n let index = openIds.find(item => {\r\n return item === id\r\n })\r\n if (index !== -1) {\r\n openIds.splice(index, 1)\r\n }\r\n // 从idToFilePath中删除\r\n delete idToFilePath[id]\r\n })\r\n if (true) {\r\n // Load the url of the dev server if in development mode\r\n win.loadURL(\r\n \"http://localhost:8080\" + '/#/workbenche/edit/' + id\r\n )\r\n // if (!process.env.IS_TEST) win.webContents.openDevTools()\r\n } else {}\r\n }\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('create', createEditWindow)\r\n\r\n // 保存文件\r\n const idToFilePath = {}\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('save', async (event, id, data, fileName = '未命名') => {\r\n if (!idToFilePath[id]) {\r\n const webContents = event.sender\r\n const win = electron__WEBPACK_IMPORTED_MODULE_0__[\"BrowserWindow\"].fromWebContents(webContents)\r\n const res = electron__WEBPACK_IMPORTED_MODULE_0__[\"dialog\"].showSaveDialogSync(win, {\r\n title: '保存',\r\n defaultPath: fileName + '.smm',\r\n filters: [{ name: '思维导图', extensions: ['smm'] }]\r\n })\r\n if (res) {\r\n idToFilePath[id] = res\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.writeFile(res, data)\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(res).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n return path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(idToFilePath[id]).name\r\n }\r\n } else {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.writeFile(idToFilePath[id], data)\r\n }\r\n })\r\n\r\n // 打开文件\r\n const openFile = (event, file) => {\r\n let id = Object(uuid__WEBPACK_IMPORTED_MODULE_4__[\"v4\"])()\r\n idToFilePath[id] = file\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(file).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n createEditWindow(null, id)\r\n }\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('openFile', openFile)\r\n\r\n // 选择打开本地文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('selectOpenFile', event => {\r\n const res = electron__WEBPACK_IMPORTED_MODULE_0__[\"dialog\"].showOpenDialogSync({\r\n title: '选择',\r\n filters: [{ name: '思维导图', extensions: ['smm'] }]\r\n })\r\n if (res && res[0]) {\r\n openFile(null, res[0])\r\n }\r\n })\r\n\r\n // 获取文件内容\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('getFileContent', (event, id) => {\r\n return new Promise(resolve => {\r\n let file = idToFilePath[id]\r\n if (!file) {\r\n resolve(null)\r\n return\r\n }\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.readFile(file, { encoding: 'utf-8' }, (err, data) => {\r\n resolve({\r\n name: path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(file).name,\r\n content: JSON.parse(data)\r\n })\r\n })\r\n })\r\n })\r\n\r\n // 重命名文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('rename', (event, id, name) => {\r\n return new Promise(resolve => {\r\n if (!idToFilePath[id]) {\r\n resolve('文件不存在')\r\n return\r\n }\r\n let oldPath = idToFilePath[id]\r\n let { base, ...oldPathData } = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(oldPath)\r\n oldPathData.name = name\r\n let newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n idToFilePath[id] = newPath\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.rename(oldPath, newPath, err => {\r\n if (err) {\r\n resolve('重命名失败')\r\n } else {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"replaceFileInRecent\"])(oldPath, newPath).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n resolve()\r\n })\r\n }\r\n })\r\n })\r\n })\r\n\r\n // 获取最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('getRecentFileList', () => {\r\n return Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"getRecent\"])().map(item => {\r\n let data = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(item)\r\n return {\r\n url: item,\r\n dir: data.dir,\r\n name: data.name\r\n }\r\n })\r\n })\r\n\r\n // 清空最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('clearRecentFileList', async () => {\r\n try {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"clearRecent\"])()\r\n return ''\r\n } catch (error) {\r\n return '清空失败'\r\n }\r\n })\r\n\r\n // 添加到最近文件列表\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('addRecentFileList', async (event, fileList) => {\r\n try {\r\n console.log(fileList);\r\n await Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveFileListToRecent\"])(fileList)\r\n notifyMainWindowRefreshRecentFileList()\r\n } catch (error) {\r\n return error\r\n } \r\n })\r\n\r\n // 打开指定目录\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].on('openFileInDir', (event, file) => {\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"shell\"].showItemInFolder(file)\r\n })\r\n\r\n // 删除指定文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('deleteFile', (event, file) => {\r\n let res = ''\r\n let id = Object.keys(idToFilePath).find(item => {\r\n return idToFilePath[item] === file\r\n })\r\n let index = -1\r\n if (id) {\r\n index = openIds.findIndex(item => {\r\n return item === id\r\n })\r\n }\r\n if (index === -1) {\r\n try {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.rmSync(file)\r\n } catch (error) {}\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"removeFileInRecent\"])(file)\r\n } else {\r\n res = '该文件正在编辑,请关闭后再试'\r\n }\r\n return res\r\n })\r\n\r\n // 复制文件\r\n electron__WEBPACK_IMPORTED_MODULE_0__[\"ipcMain\"].handle('copyFile', async (event, file) => {\r\n return new Promise((resolve, reject) => {\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.pathExists(file, (err, exists) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n if (exists) {\r\n let { base, ...oldPathData } = path__WEBPACK_IMPORTED_MODULE_2___default.a.parse(file)\r\n let newName = oldPathData.name + '-复制'\r\n let index = 1\r\n oldPathData.name = newName\r\n let newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n // 检查新路径是否已存在\r\n while (fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.pathExistsSync(newPath)) {\r\n oldPathData.name = newName + index\r\n newPath = path__WEBPACK_IMPORTED_MODULE_2___default.a.format(oldPathData)\r\n index++\r\n }\r\n fs_extra__WEBPACK_IMPORTED_MODULE_1___default.a.copy(file, newPath, err => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n Object(_storage__WEBPACK_IMPORTED_MODULE_3__[\"saveToRecent\"])(newPath).then(() => {\r\n notifyMainWindowRefreshRecentFileList()\r\n })\r\n resolve()\r\n }\r\n })\r\n } else {\r\n reject('文件不存在')\r\n }\r\n }\r\n })\r\n })\r\n })\r\n}\r\n\n\n//# sourceURL=webpack:///./src/electron/fileHandle.js?"); /***/ }), diff --git a/web/dist_electron/package.json b/web/dist_electron/package.json index 15281f30..d5980fd2 100644 --- a/web/dist_electron/package.json +++ b/web/dist_electron/package.json @@ -15,6 +15,10 @@ "autoBuildDoc": "node ./scripts/autoBuildDoc.js", "buildDoc": "node ./scripts/buildDoc.js", "electron:build": "vue-cli-service electron:build", + "electron:build-all": "vue-cli-service electron:build -p never -mwl", + "electron:build-mac": "vue-cli-service electron:build -p never -m", + "electron:build-win": "vue-cli-service electron:build -p never -w", + "electron:build-linux": "vue-cli-service electron:build -p never -l", "electron:serve": "vue-cli-service electron:serve", "buildLibrary": "vue-cli-service build --target lib --name simpleMindMap ../simple-mind-map/full.js --dest ../simple-mind-map/dist && esbuild ../simple-mind-map/full.js --bundle --external:buffer --format=esm --outfile=../simple-mind-map/dist/simpleMindMap.esm.js", "format": "prettier --write src/* src/*/* src/*/*/* src/*/*/*/*", diff --git a/web/src/assets/icon-font/iconfont.css b/web/src/assets/icon-font/iconfont.css index 69d6c008..5193dd1c 100644 --- a/web/src/assets/icon-font/iconfont.css +++ b/web/src/assets/icon-font/iconfont.css @@ -1,8 +1,8 @@ @font-face { font-family: "iconfont"; /* Project id 2479351 */ - src: url('iconfont.woff2?t=1678265970945') format('woff2'), - url('iconfont.woff?t=1678265970945') format('woff'), - url('iconfont.ttf?t=1678265970945') format('truetype'); + src: url('iconfont.woff2?t=1679621707211') format('woff2'), + url('iconfont.woff?t=1679621707211') format('woff'), + url('iconfont.ttf?t=1679621707211') format('truetype'); } .iconfont { diff --git a/web/src/assets/icon-font/iconfont.ttf b/web/src/assets/icon-font/iconfont.ttf index 117c7af3..2311cfcd 100644 Binary files a/web/src/assets/icon-font/iconfont.ttf and b/web/src/assets/icon-font/iconfont.ttf differ diff --git a/web/src/assets/icon-font/iconfont.woff b/web/src/assets/icon-font/iconfont.woff index 40cf27e3..1bdad3ba 100644 Binary files a/web/src/assets/icon-font/iconfont.woff and b/web/src/assets/icon-font/iconfont.woff differ diff --git a/web/src/assets/icon-font/iconfont.woff2 b/web/src/assets/icon-font/iconfont.woff2 index b2398ab3..f3c1c366 100644 Binary files a/web/src/assets/icon-font/iconfont.woff2 and b/web/src/assets/icon-font/iconfont.woff2 differ diff --git a/web/src/assets/img/icon.png b/web/src/assets/img/icon.png new file mode 100644 index 00000000..23f64d25 Binary files /dev/null and b/web/src/assets/img/icon.png differ diff --git a/web/src/background.js b/web/src/background.js index 1df80d95..097e9098 100644 --- a/web/src/background.js +++ b/web/src/background.js @@ -35,7 +35,7 @@ async function createMainWindow() { await mainWindow.loadURL( process.env.WEBPACK_DEV_SERVER_URL + '/#/workbenche' ) - if (!process.env.IS_TEST) mainWindow.webContents.openDevTools() + // if (!process.env.IS_TEST) mainWindow.webContents.openDevTools() } else { createProtocol('app') // 非开发环境时加载index.html diff --git a/web/src/electron/fileHandle.js b/web/src/electron/fileHandle.js index 102275eb..69aa4020 100644 --- a/web/src/electron/fileHandle.js +++ b/web/src/electron/fileHandle.js @@ -50,7 +50,7 @@ export const bindFileHandleEvent = ({ mainWindow }) => { win.loadURL( process.env.WEBPACK_DEV_SERVER_URL + '/#/workbenche/edit/' + id ) - if (!process.env.IS_TEST) win.webContents.openDevTools() + // if (!process.env.IS_TEST) win.webContents.openDevTools() } else { // Load the index.html when not in development win.loadURL('app://./index.html/#/workbenche/edit/' + id) diff --git a/web/src/pages/Workbenche/Index.vue b/web/src/pages/Workbenche/Index.vue index 04581994..5edfecdf 100644 --- a/web/src/pages/Workbenche/Index.vue +++ b/web/src/pages/Workbenche/Index.vue @@ -9,6 +9,9 @@ diff --git a/web/src/pages/Workbenche/components/AboutDialog.vue b/web/src/pages/Workbenche/components/AboutDialog.vue new file mode 100644 index 00000000..64b38326 --- /dev/null +++ b/web/src/pages/Workbenche/components/AboutDialog.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/web/src/pages/Workbenche/views/Edit.vue b/web/src/pages/Workbenche/views/Edit.vue index b5e85276..30ff1886 100644 --- a/web/src/pages/Workbenche/views/Edit.vue +++ b/web/src/pages/Workbenche/views/Edit.vue @@ -43,6 +43,7 @@ export default { watch: { fileName(val) { this.name = val + document.title = val }, name(val) { if (!val.trim()) return diff --git a/web/src/pages/Workbenche/views/Home.vue b/web/src/pages/Workbenche/views/Home.vue index 8d5f331b..87413a9c 100644 --- a/web/src/pages/Workbenche/views/Home.vue +++ b/web/src/pages/Workbenche/views/Home.vue @@ -9,11 +9,20 @@
+
+ + + + 关于软件 + + +
+ @@ -22,15 +31,32 @@ import WinControl from '../components/WinControl.vue' import MacControl from '../components/MacControl.vue' import Sidebar from '../components/Sidebar.vue' import FileList from '../components/FileList.vue' +import AboutDialog from '../components/AboutDialog.vue' export default { components: { WinControl, MacControl, Sidebar, - FileList + FileList, + AboutDialog + }, + data() { + return { + showAboutDialog: false + } }, methods: { + handleCommand(command) { + switch (command) { + case 'about': + this.showAboutDialog = true + break + default: + break + } + }, + onDrop(e) { e.preventDefault() e.stopPropagation() @@ -54,9 +80,11 @@ export default { window.electronAPI.openFile(dropFiles[0].path) } else if (dropFiles.length > 1) { // 否则添加到最近文件列表 - window.electronAPI.addRecentFileList(dropFiles.map((file) => { - return file.path - })) + window.electronAPI.addRecentFileList( + dropFiles.map(file => { + return file.path + }) + ) } }, @@ -87,6 +115,7 @@ export default { flex-direction: column; .workbencheHomeHeader { + position: relative; width: 100%; height: 40px; background-color: #ebeef1; @@ -94,6 +123,21 @@ export default { display: flex; align-items: center; flex-shrink: 0; + + .rightBar { + -webkit-app-region: no-drag; + position: absolute; + right: 20px; + top: 0; + height: 100%; + display: flex; + align-items: center; + + .settingBtn { + font-size: 20px; + cursor: pointer; + } + } } .workbencheHomeContent {