├── .env ├── .env.production ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── bug_report.md └── workflows │ └── static.yml ├── .gitignore ├── CNAME ├── LICENSE ├── README.md ├── babel.config.js ├── blog ├── About This Blog │ └── Some Secrets │ │ └── No peeking!.md └── Hi there.md ├── docs ├── CNAME ├── css │ ├── app.b7d5d79d.css │ └── chunk-vendors.b3663433.css ├── desktop_Hi_there.json ├── favicon.png ├── fonts │ ├── element-icons.535877f5.535877f5.woff │ ├── element-icons.732389de.732389de.ttf │ ├── fontawesome-webfont.674f50d2.674f50d2.eot │ ├── fontawesome-webfont.af7ae505.af7ae505.woff2 │ ├── fontawesome-webfont.b06871f2.b06871f2.ttf │ └── fontawesome-webfont.fee66e71.fee66e71.woff ├── img │ ├── avatar.41ef9008.jpg │ ├── b1.8a3846da.svg │ ├── b2.22f16eef.svg │ ├── b3.ccbca9ea.svg │ ├── d1.9e76ba90.svg │ ├── d2.d6ec312b.svg │ ├── d3.ad56d8f9.svg │ ├── deepin_3.7afd7a6f.png │ ├── deepin_text_1.5a28ffd5.png │ ├── desktop_1.cf7e5143.jpg │ ├── folder.81c64b6d.png │ ├── fontawesome-webfont.912ec66d.912ec66d.svg │ ├── goodmanwen.5637d700.png │ └── holo.93148926.gif ├── index.html ├── js │ ├── app.7ba08478.js │ └── chunk-vendors.7760397e.js ├── map.json ├── musiccovers │ ├── m0.png │ ├── m1.png │ ├── m10.png │ ├── m11.png │ ├── m12.png │ ├── m13.png │ ├── m14.png │ ├── m15.png │ ├── m16.png │ ├── m2.png │ ├── m3.png │ ├── m4.png │ ├── m5.png │ ├── m6.png │ ├── m7.png │ ├── m8.png │ └── m9.png └── musics.json ├── generate.py ├── misc ├── Guidelines for further development.md ├── chika.JPG ├── figure.png ├── modify_commit_date.sh └── readme_chs.md ├── package-lock.json ├── package.json ├── postcss.config.js ├── public ├── desktop_Hi_there.json ├── index.html ├── linux.png ├── map.json ├── musiccovers │ ├── m0.png │ ├── m1.png │ ├── m10.png │ ├── m11.png │ ├── m12.png │ ├── m13.png │ ├── m14.png │ ├── m15.png │ ├── m16.png │ ├── m2.png │ ├── m3.png │ ├── m4.png │ ├── m5.png │ ├── m6.png │ ├── m7.png │ ├── m8.png │ └── m9.png └── musics.json ├── src ├── App.vue ├── assets │ ├── images │ │ ├── avatar.jpg │ │ ├── deepin_1.png │ │ ├── deepin_2.png │ │ ├── deepin_3.png │ │ ├── deepin_4.png │ │ ├── deepin_text_1.png │ │ ├── desktop_1.jpg │ │ ├── goodmanwen.png │ │ ├── holo.gif │ │ ├── icons │ │ │ ├── b1.svg │ │ │ ├── b2.svg │ │ │ ├── b3.svg │ │ │ ├── browser.png │ │ │ ├── d1.svg │ │ │ ├── d2.svg │ │ │ ├── d3.svg │ │ │ ├── desktop.png │ │ │ ├── doc.png │ │ │ ├── explorer.png │ │ │ ├── folder.png │ │ │ ├── menu.png │ │ │ ├── music.png │ │ │ ├── paint.png │ │ │ ├── profile.png │ │ │ ├── recycle.png │ │ │ ├── settings.png │ │ │ ├── shell.png │ │ │ ├── skills.png │ │ │ ├── tasks.png │ │ │ ├── text.png │ │ │ ├── text2.png │ │ │ └── vscode.png │ │ └── instagram.png │ └── tailwind.css ├── components │ ├── Blank.vue │ ├── ContextMenu │ │ ├── ContextMenu.vue │ │ ├── ContextMenuBottomBar.vue │ │ └── ContextMenuButton.vue │ ├── Desktop │ │ ├── BottomBar.vue │ │ ├── Desktop.vue │ │ ├── DesktopFileArray.vue │ │ ├── DesktopFileIcon.vue │ │ ├── Icon.vue │ │ ├── Message.vue │ │ └── SideBar.vue │ ├── Down.vue │ ├── Interlude.vue │ ├── Keyboard │ │ ├── Key.vue │ │ ├── Key2.vue │ │ ├── KeyBoard.vue │ │ └── KeyBoardMoveIcon.vue │ ├── LoginPage │ │ ├── LoginPage.vue │ │ └── RestartButton.vue │ ├── WindowBasic │ │ ├── Window.vue │ │ ├── WindowHeaderButton.vue │ │ ├── WindowHeaderCursor.vue │ │ └── WindowSider.vue │ └── WindowChildren │ │ ├── WindowBrowser.vue │ │ ├── WindowBrowserButton.vue │ │ ├── WindowFolder.vue │ │ ├── WindowFolderIcon.vue │ │ ├── WindowFolderSlider.vue │ │ ├── WindowMusic.vue │ │ ├── WindowSetting.vue │ │ ├── WindowSettingIcon.vue │ │ ├── WindowTerminal.vue │ │ ├── WindowText.vue │ │ └── WindowVSCode.vue ├── main.js ├── network │ └── request.js ├── plugins │ ├── cookies.js │ ├── utils.js │ └── vuetify.js ├── router │ └── index.js └── store │ └── index.js ├── tailwind.config.js ├── update.cmd └── vue.config.js /.env: -------------------------------------------------------------------------------- 1 | NODE_ENV = 'development' 2 | VUE_APP_APIURL = "/dev/" -------------------------------------------------------------------------------- /.env.production: -------------------------------------------------------------------------------- 1 | NODE_ENV = 'production' 2 | VUE_APP_APIURL = "/" -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [dawidolko] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots** 24 | If applicable, add screenshots to help explain your problem. 25 | 26 | **Desktop (please complete the following information):** 27 | - OS: [e.g. iOS] 28 | - Browser [e.g. chrome, safari] 29 | - Version [e.g. 22] 30 | 31 | **Smartphone (please complete the following information):** 32 | - Device: [e.g. iPhone6] 33 | - OS: [e.g. iOS8.1] 34 | - Browser [e.g. stock browser, safari] 35 | - Version [e.g. 22] 36 | 37 | **Additional context** 38 | Add any other context about the problem here. 39 | -------------------------------------------------------------------------------- /.github/workflows/static.yml: -------------------------------------------------------------------------------- 1 | # Simple workflow for deploying static content to GitHub Pages 2 | name: Deploy static content to Pages 3 | 4 | on: 5 | # Runs on pushes targeting the default branch 6 | push: 7 | branches: ["main"] 8 | 9 | # Allows you to run this workflow manually from the Actions tab 10 | workflow_dispatch: 11 | 12 | # Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages 13 | permissions: 14 | contents: read 15 | pages: write 16 | id-token: write 17 | 18 | # Allow only one concurrent deployment, skipping runs queued between the run in-progress and latest queued. 19 | # However, do NOT cancel in-progress runs as we want to allow these production deployments to complete. 20 | concurrency: 21 | group: "pages" 22 | cancel-in-progress: false 23 | 24 | jobs: 25 | # Single deploy job since we're just deploying 26 | deploy: 27 | environment: 28 | name: github-pages 29 | url: ${{ steps.deployment.outputs.page_url }} 30 | runs-on: ubuntu-latest 31 | steps: 32 | - name: Checkout 33 | uses: actions/checkout@v4 34 | - name: Setup Pages 35 | uses: actions/configure-pages@v4 36 | - name: Upload artifact 37 | uses: actions/upload-pages-artifact@v3 38 | with: 39 | # Upload entire repository 40 | path: '.' 41 | - name: Deploy to GitHub Pages 42 | id: deployment 43 | uses: actions/deploy-pages@v4 44 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | 25 | # Python Byte-compiled / optimized / DLL files 26 | __pycache__/ 27 | *.py[cod] 28 | *$py.class 29 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | linux.dawidolko.pl 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Dawid Olko 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🐧 linux.dawidolko.pl 2 | _A Vue-powered blog & desktop simulator that looks just like Deepin Linux_ 3 | 4 | [![Build](https://img.shields.io/github/actions/workflow/status/dawidolko/Linux-Simulaing-System-GUI/Build.yml?label=build&logo=github)](https://github.com/dawidolko/Linux-Simulaing-System-GUI/actions) 5 | [![Website Status](https://img.shields.io/website?down_color=red&down_message=offline&up_message=online&url=https%3A%2F%2Flinux.dawidolko.pl)](https://linux.dawidolko.pl) 6 | [![Stars](https://img.shields.io/github/stars/dawidolko/Simulaing-Linux-System-GUI?style=social)](https://github.com/dawidolko/Simulaing-Linux-System-GUI/stargazers) 7 | 8 | > **Live Demo:** 9 | 10 | --- 11 | 12 | ## 📑 Table of Contents 13 | 1. [About](#about) 14 | 2. [Project Structure](#project-structure) 15 | 3. [Star History](#star-history) 16 | 4. [Quick Start](#quick-start) 17 | 5. [Blog & Content Management](#blog--content-management) 18 | 6. [Feature Highlights](#feature-highlights) 19 | 7. [Contributing](#contributing) 20 | 8. [License & Author](#license--author) 21 | 22 | --- 23 | 24 | ## About 25 | `linux.dawidolko.pl` is an **open-source portfolio and blogging platform** that perfectly imitates the Deepin Linux desktop inside the browser. 26 | Windows can be opened, moved, resized and layered just like on the real OS; a toy terminal, music player, recursive file system and markdown-powered blog come built-in. All pages are pre-rendered to static files so the whole site can be hosted for free on **GitHub Pages**. 🐧🖥️ 27 | 28 | Tech stack: 29 | 30 | - **Vue 2** + **Vuetify** UI 31 | - **Tailwind CSS** & **PostCSS** for styling 32 | - **Vue Router** + **Vuex** + **Axios** 33 | - **Markdown-it** for article rendering 34 | - Fully static **/docs** output for easy deployment 35 | 36 | --- 37 | 38 | ## Project Structure 39 | ```text 40 | . 41 | ├── .github/ # GitHub Actions & issue templates 42 | ├── docs/ # Pre-built static files (deployment target) 43 | ├── misc/ # Dev guidelines & helper scripts 44 | ├── public/ # Static assets served at / 45 | ├── src/ # Vue application source 46 | │ ├── .env* # Environment configs 47 | │ ├── components/ # Re-usable Vue components 48 | │ ├── router/ # Vue-Router setup 49 | │ ├── store/ # Vuex modules 50 | │ ├── views/ # Page-level components 51 | │ └── assets/ # Images, icons, sounds 52 | ├── blog/ # 💡 Your markdown posts live here 53 | ├── generate.py # Converts blog → static markdown JSON 54 | ├── tailwind.config.js 55 | ├── vue.config.js 56 | ├── package*.json # NPM metadata & scripts 57 | ├── LICENSE # AGPL-3.0 58 | └── README.md # You are here! 59 | ```` 60 | 61 | --- 62 | 63 | ## Star History 64 | 65 | [![Star History Chart](https://api.star-history.com/svg?repos=dawidolko/Linux-Simulaing-System-GUI\&type=Date)](https://star-history.com/#dawidolko/Linux-Simulaing-System-GUI&Date) 66 | 67 | --- 68 | 69 | ## Quick Start 70 | 71 | > Tested with **Node 16+** and **@vue/cli 4.5.11** 72 | 73 | ```bash 74 | # 1 – Clone the repo 75 | git clone https://github.com/dawidolko/Linux-Simulaing-System-GUI 76 | cd Linux-Simulaing-System-GUI 77 | 78 | # 2 – Install dependencies 79 | npm install # or yarn / pnpm 80 | 81 | # 3 – Run a local dev server (hot-reload) 82 | npm run serve 83 | ``` 84 | 85 | ### Build for Production 86 | 87 | ```bash 88 | # Generate static markdown metadata 89 | python3 generate.py 90 | 91 | # Compile & minify to /docs 92 | npm run build 93 | ``` 94 | 95 | `vue.config.js` is already configured so that GitHub Pages serves `docs/` as the site root. 96 | 97 | --- 98 | 99 | ## Blog & Content Management 100 | 101 | | Task | How-to | 102 | | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | 103 | | **Add / edit articles** | Place `.md` files anywhere under `/blog`. The first `# Heading` is used as the title; the first normal line becomes the excerpt. | 104 | | **Direct-link to an article** | `https://linux.dawidolko.pl/#/desktop/post/.md` | 105 | | **Update playlist** | Edit `public/musics.json` *(see existing format)* and store album art in `public/musiccovers/`. | 106 | | **Customise terminal commands** | Look inside `src/components/Terminal/commands.js`. | 107 | | **Static rebuild** | After changing blog posts or music list, re-run `python3 generate.py && npm run build`. | 108 | 109 | --- 110 | 111 | ## Feature Highlights 112 | 113 | * 💻 **Deepin-inspired window system** – drag, resize, minimise, z-index management 114 | * 📝 **Markdown-driven blog** – write posts in plain `.md`, no CMS required 115 | * 🎵 **Mini music player** – powered by `vue-aplayer`; playlist is JSON-based 116 | * 🖼️ **Theming** – Tailwind utility classes + Vuetify make style tweaks trivial 117 | * ✨ **Zero-backend deployment** – everything compiles to static files for GitHub Pages 118 | 119 | --- 120 | 121 | ## Contributing 122 | 123 | Whether you want to squash a bug 🐞, add a feature ✨ or fix a typo ✍️—PRs are welcome! 124 | 125 | ```bash 126 | # Fork → clone 127 | git checkout -b feat/amazing-feature 128 | 129 | # Make your changes 130 | npm run lint # please keep the linter happy! 131 | 132 | # Commit & push 133 | git commit -m "Add amazing feature" 134 | git push origin feat/amazing-feature 135 | 136 | # Open a Pull Request 🚀 137 | ``` 138 | 139 | Because there are no automated GUI tests, **please describe what you changed and include screenshots or GIFs** when your PR touches the UI. 140 | 141 | --- 142 | 143 | ## License & Author 144 | 145 | * **License:** GNU **AGPL v3** – free as in freedom 🆓 146 | * **Author:** **Dawid Olko** 147 | 148 | * Portfolio: [https://dawidolko.pl](https://dawidolko.pl) 149 | * GitHub: [https://github.com/dawidolko](https://github.com/dawidolko) 150 | * LinkedIn: [https://www.linkedin.com/in/dawidolko/](https://www.linkedin.com/in/dawidolko/) 151 | 152 | > Built in three caffeine-fuelled nights ☕ with Vue, Tailwind and tons of penguin love. 153 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /blog/About This Blog/Some Secrets/No peeking!.md: -------------------------------------------------------------------------------- 1 | # Suprise! 2 | 3 | Congratulations on your discovery of this hidden directory! 4 | 5 | This file exists only to show that directories can be nested. 6 | -------------------------------------------------------------------------------- /blog/Hi there.md: -------------------------------------------------------------------------------- 1 | # Hi everyone! 👋 2 | 3 | This project is a web page emulation of a particular Linux distro called deepin. It is designed to allow you to host an open source blog, needless your own server. 4 | 5 | Currently this project has implemented some basic features of blogs, windows, directories, also it has a shell with very fundamental functionalities. 6 | 7 | **Hope you enjoy this blog and have fun 😃.** 8 | -------------------------------------------------------------------------------- /docs/CNAME: -------------------------------------------------------------------------------- 1 | linux.dawidolko.pl 2 | -------------------------------------------------------------------------------- /docs/desktop_Hi_there.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": "# Hi everyone! \ud83d\udc4b\n\nThis project is a web page emulation of a particular Linux distro called deepin. It is designed to allow you to host an open source blog, needless your own server. \n\nCurrently this project has implemented some basic features of blogs, windows, directories, also it has a shell with very fundamental functionalities. \n\n**Hope you enjoy this blog and have fun \ud83d\ude03.**\n![](https://raw.githubusercontent.com/dawidolko/Simulaing-Linux-System-GUI/main/misc/chika.JPG)\n" 3 | } 4 | -------------------------------------------------------------------------------- /docs/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/favicon.png -------------------------------------------------------------------------------- /docs/fonts/element-icons.535877f5.535877f5.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/element-icons.535877f5.535877f5.woff -------------------------------------------------------------------------------- /docs/fonts/element-icons.732389de.732389de.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/element-icons.732389de.732389de.ttf -------------------------------------------------------------------------------- /docs/fonts/fontawesome-webfont.674f50d2.674f50d2.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/fontawesome-webfont.674f50d2.674f50d2.eot -------------------------------------------------------------------------------- /docs/fonts/fontawesome-webfont.af7ae505.af7ae505.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/fontawesome-webfont.af7ae505.af7ae505.woff2 -------------------------------------------------------------------------------- /docs/fonts/fontawesome-webfont.b06871f2.b06871f2.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/fontawesome-webfont.b06871f2.b06871f2.ttf -------------------------------------------------------------------------------- /docs/fonts/fontawesome-webfont.fee66e71.fee66e71.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/fonts/fontawesome-webfont.fee66e71.fee66e71.woff -------------------------------------------------------------------------------- /docs/img/avatar.41ef9008.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/avatar.41ef9008.jpg -------------------------------------------------------------------------------- /docs/img/b1.8a3846da.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 9 | -------------------------------------------------------------------------------- /docs/img/b2.22f16eef.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/img/b3.ccbca9ea.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /docs/img/d1.9e76ba90.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 9 | -------------------------------------------------------------------------------- /docs/img/d2.d6ec312b.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /docs/img/d3.ad56d8f9.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /docs/img/deepin_3.7afd7a6f.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/deepin_3.7afd7a6f.png -------------------------------------------------------------------------------- /docs/img/deepin_text_1.5a28ffd5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/deepin_text_1.5a28ffd5.png -------------------------------------------------------------------------------- /docs/img/desktop_1.cf7e5143.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/desktop_1.cf7e5143.jpg -------------------------------------------------------------------------------- /docs/img/folder.81c64b6d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/folder.81c64b6d.png -------------------------------------------------------------------------------- /docs/img/goodmanwen.5637d700.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/goodmanwen.5637d700.png -------------------------------------------------------------------------------- /docs/img/holo.93148926.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/img/holo.93148926.gif -------------------------------------------------------------------------------- /docs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | linux.dawidolko.pl - Simulaing System Linux 9 | 12 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 29 |
30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /docs/map.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Hi there.md", 4 | "path": "desktop_Hi_there.json", 5 | "lastedittime": 1619756653, 6 | "title": "Hi everyone! \ud83d\udc4b", 7 | "abstract": "This project is a web page emulation of a particular Linux distro called deepin. It is designed to allow you to host an ...", 8 | "size": 478 9 | } 10 | ] 11 | -------------------------------------------------------------------------------- /docs/musiccovers/m0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m0.png -------------------------------------------------------------------------------- /docs/musiccovers/m1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m1.png -------------------------------------------------------------------------------- /docs/musiccovers/m10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m10.png -------------------------------------------------------------------------------- /docs/musiccovers/m11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m11.png -------------------------------------------------------------------------------- /docs/musiccovers/m12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m12.png -------------------------------------------------------------------------------- /docs/musiccovers/m13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m13.png -------------------------------------------------------------------------------- /docs/musiccovers/m14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m14.png -------------------------------------------------------------------------------- /docs/musiccovers/m15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m15.png -------------------------------------------------------------------------------- /docs/musiccovers/m16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m16.png -------------------------------------------------------------------------------- /docs/musiccovers/m2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m2.png -------------------------------------------------------------------------------- /docs/musiccovers/m3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m3.png -------------------------------------------------------------------------------- /docs/musiccovers/m4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m4.png -------------------------------------------------------------------------------- /docs/musiccovers/m5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m5.png -------------------------------------------------------------------------------- /docs/musiccovers/m6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m6.png -------------------------------------------------------------------------------- /docs/musiccovers/m7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m7.png -------------------------------------------------------------------------------- /docs/musiccovers/m8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m8.png -------------------------------------------------------------------------------- /docs/musiccovers/m9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/docs/musiccovers/m9.png -------------------------------------------------------------------------------- /docs/musics.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "So I Gave Up on Music", 4 | "artist": "Yorushika", 5 | "src": "https://oss.wendemoapi.site/ta-01/5daad1f8-de0d-e303-f036-d344a14fab81.mp3", 6 | "pic": "/musiccovers/m0.png" 7 | }, 8 | { 9 | "title": "Song of a Troubled Youth", 10 | "artist": "Choir of the Sretensky Monastery", 11 | "src": "https://oss.wendemoapi.site/ta-01/b27523db-4b9b-bbed-ec12-a8b8afc8fd85.mp3", 12 | "pic": "/musiccovers/m1.png" 13 | }, 14 | { 15 | "title": "Don't Forget That Smile", 16 | "artist": "ZARD", 17 | "src": "https://oss.wendemoapi.site/ta-01/df1c22f6-6ba8-0a97-f4ac-6aef7f4fbc57.mp3", 18 | "pic": "/musiccovers/m2.png" 19 | }, 20 | { 21 | "title": "Night of Confessions (LIVE!! Ayasa Theater episode 7)", 22 | "artist": "Ayasa", 23 | "src": "https://oss.wendemoapi.site/ta-01/f1be7233-eec6-012f-a0e1-e6edf97dccc3.mp3", 24 | "pic": "/musiccovers/m3.png" 25 | }, 26 | { 27 | "title": "Dream of the Red Chamber Overture", 28 | "artist": "Chen Li", 29 | "src": "https://oss.wendemoapi.site/ta-01/56e4f8cd-7973-1930-d2cc-c3957afa414e.mp3", 30 | "pic": "/musiccovers/m4.png" 31 | }, 32 | { 33 | "title": "I'll remember you", 34 | "artist": "Megumi Sasaka", 35 | "src": "https://oss.wendemoapi.site/ta-01/1491e002-f300-6c05-28ba-d321c47a86f8.mp3", 36 | "pic": "/musiccovers/m5.png" 37 | }, 38 | { 39 | "title": "Tell Me a Lie That Lasts Forever", 40 | "artist": "Miyuki Nakajima", 41 | "src": "https://oss.wendemoapi.site/ta-01/85403895-bc58-7918-dc75-5f0d4ddd14da.mp3", 42 | "pic": "/musiccovers/m6.png" 43 | }, 44 | { 45 | "title": "Elephant", 46 | "artist": "Yu Takahashi", 47 | "src": "https://oss.wendemoapi.site/ta-01/57754788-cea5-74f8-d7bc-98418c75dbb0.mp3", 48 | "pic": "/musiccovers/m7.png" 49 | }, 50 | { 51 | "title": "Crescent Bay", 52 | "artist": "F.I.R.", 53 | "src": "https://oss.wendemoapi.site/ta-01/0fdc2b9a-15be-7801-87ef-75730fc92f9e.mp3", 54 | "pic": "/musiccovers/m8.png" 55 | }, 56 | { 57 | "title": "Cry Cry", 58 | "artist": "T-ara", 59 | "src": "https://oss.wendemoapi.site/ta-01/e21b27a7-3518-9cbb-d4aa-f96b12a43b24.mp3", 60 | "pic": "/musiccovers/m9.png" 61 | }, 62 | { 63 | "title": "Twinkle Starlight", 64 | "artist": "Sayaka Sasaki", 65 | "src": "https://oss.wendemoapi.site/ta-01/1eb92111-1962-1666-a6f8-ca81cb51cb67.mp3", 66 | "pic": "/musiccovers/m10.png" 67 | }, 68 | { 69 | "title": "Komm, süsser Tod (Come, Sweet Death)", 70 | "artist": "ARIANNE", 71 | "src": "https://oss.wendemoapi.site/ta-01/5b71dd18-505d-07bc-bebf-57e7a0be2d62.mp3", 72 | "pic": "/musiccovers/m11.png" 73 | }, 74 | { 75 | "title": "On the Taihang Mountains", 76 | "artist": "China Symphony Orchestra Choir", 77 | "src": "https://oss.wendemoapi.site/ta-01/d6ab4aac-b458-8413-f3e4-4a8cc4062682.m4a", 78 | "pic": "/musiccovers/m12.png" 79 | }, 80 | { 81 | "title": "Angel Wink", 82 | "artist": "Ai Kayano", 83 | "src": "https://oss.wendemoapi.site/ta-01/48a3a925-4753-e602-fa50-1bfbfc9d0895.mp3", 84 | "pic": "/musiccovers/m13.png" 85 | }, 86 | { 87 | "title": "La Reine De Saba", 88 | "artist": "Paul Mauriat", 89 | "src": "https://oss.wendemoapi.site/ta-01/12da445c-7cf5-8d06-e78e-0deededf090f.mp3", 90 | "pic": "/musiccovers/m14.png" 91 | }, 92 | { 93 | "title": "Silhouette Dancer", 94 | "artist": "Yuko Imai", 95 | "src": "https://oss.wendemoapi.site/ta-01/2d362db6-e6c0-c6ee-866a-74d4f5c69856.mp3", 96 | "pic": "/musiccovers/m15.png" 97 | }, 98 | { 99 | "title": "and I'm home", 100 | "artist": "Eri Kitamura", 101 | "src": "https://oss.wendemoapi.site/ta-01/597a457f-0a2d-8002-d32e-d20080d9accd.mp3", 102 | "pic": "/musiccovers/m16.png" 103 | } 104 | ] 105 | -------------------------------------------------------------------------------- /generate.py: -------------------------------------------------------------------------------- 1 | import os 2 | import json 3 | 4 | def determine_markdown_file(file_name): 5 | return os.path.splitext(file_name)[1] == '.md' 6 | 7 | def get_modify_time(file_path): 8 | return int(os.path.getmtime(file_path) + 0.5) 9 | 10 | def split_file_name(file_name): 11 | return os.path.splitext(file_name)[0] 12 | 13 | def get_title_and_abstract(file_path): 14 | title = None 15 | abstract = None 16 | with open(file_path, 'r', encoding='utf-8') as f: 17 | for line in f.readlines(): 18 | if title is not None: 19 | line = line.strip() 20 | if len(line) == 0: 21 | pass 22 | elif ord(line[0]) in (33, 35, 40, 45, 46, 58, 91): 23 | pass 24 | elif len(line) > 120: 25 | abstract = line[:120] + '...' 26 | else: 27 | abstract = line 28 | if line[:2]=='# ': 29 | title = line[2:].strip() 30 | if title is not None and abstract is not None: 31 | break 32 | return title if title else "", abstract if abstract else "" 33 | 34 | def mywalk(directory, append_pointer, header, copy_target): 35 | for current_path, sub_paths, files in os.walk(directory): 36 | for file in files: 37 | file_path = os.path.join(current_path, file) 38 | if determine_markdown_file(file): 39 | title, abstract = get_title_and_abstract(file_path) 40 | last_edit_time = get_modify_time(file_path) 41 | append_pointer.append({ 42 | 'name': file, 43 | 'path': f"{header}_{split_file_name(file).replace(' ','_')}.json", 44 | 'lastedittime': last_edit_time , 45 | 'title': title, 46 | 'abstract': abstract, 47 | 'size': os.path.getsize(file_path), 48 | }) 49 | with open(file_path,'r',encoding='utf-8') as fp: 50 | content = fp.read() 51 | output_target = os.path.join(copy_target, f"{header}_{split_file_name(file).replace(' ','_')}.json") 52 | with open(output_target,'w',encoding='utf-8') as fp: 53 | fp.write(json.dumps({'data':content})) 54 | 55 | for path in sub_paths: 56 | path_path = os.path.join(current_path, path) 57 | new_append_pointer = [] 58 | append_pointer.append({ 59 | 'name': path, 60 | 'path': '', 61 | 'lastedittime': get_modify_time(path_path), 62 | 'size': -1, 63 | 'children': new_append_pointer, 64 | }) 65 | mywalk(path_path, new_append_pointer, f"{header}_{path.replace(' ','_')}", copy_target) 66 | break 67 | 68 | root = os.path.abspath('./blog') 69 | copy_target = os.path.abspath('public') 70 | 71 | # clean 72 | protect_file_list = ('favicon.ico', 'index.html', 'musics.json', 'musiccovers') 73 | for files in os.walk(copy_target): 74 | files = files[2]; break 75 | 76 | for rm_file in files: 77 | if rm_file not in protect_file_list: 78 | os.remove(os.path.join(copy_target, rm_file)) 79 | 80 | # copy 81 | root_struct = [] 82 | append_pointer = root_struct 83 | mywalk(root, root_struct, 'desktop', copy_target) 84 | with open(os.path.join(copy_target, 'map.json'),'w',encoding='utf-8') as f: 85 | f.write(json.dumps(root_struct)) -------------------------------------------------------------------------------- /misc/Guidelines for further development.md: -------------------------------------------------------------------------------- 1 | # Guidelines for further development 2 | 3 | Due to the rushed development time of this project, there's no well commentary explain what this code is doing in many places. This additional article serves as a patch, to help those who are willing to do further development to understand the logic of this project. 4 | 5 | ## Basic Architecture 6 | 7 | The virtual directory structure is a tree structure which is generated by `generate.py` after who scanning the file directories. Every time the `/desktop` route is triggered, it will be requested first before the DOM is rendered. It is managed by a global state by vuex (`{{$store.state.filemap}}`). Basically, it will stay unchanged after each opening in our requirements, although by design it can be modified. 8 | 9 | Most of the operations are done by traversal in this project, this is obviously unfriendly to efficiency, due to the fact that when the tree structure was originally designed, it is designed according to the return value of the back-end, without taking into account the further control needs of the front-end. But the good news is that GUIs don't usually take up huge computing resources, and the JS engine is fast enough at small data volumes (where small may refer to tens of thousands, much higher than what is possible with daily use). 10 | 11 | Most of the left-click operations in the screen are left to the global status manager but not internally digested in the component itself. This is because most clicks are accompanied by the concerted action of numbers of components. The global manager usually needs to handle the following parts of logic: 12 | - About the logic of the component itself, such as minimizing, or closing this window. This relates to our virtual-virtual-dom object management. 13 | - Handling global window sorting, in order of click, a queue should be maintained to ensure which are on top or below. 14 | - Dealing with focus issues, windows selected most recently by left click should be clearly highlighted, while other windows, icons, etc. should be clearly blur. 15 | - Dealing with the right-click context menu, it has some logic of its own, generally speaking context menus will always disappear when you tap on a different location. 16 | 17 | The window's own resize & move event is managed by itself, as they usually do not conflict with any other logic. 18 | 19 | The exception is that the window's closing animation is handled by itself, which is a design fault that it was not initially considered as the closing event could come from outside the window itself. 20 | 21 | ### And that's it 22 | 23 | All above are pretty much the entire logic. Since we're not writting a real GUI, most of the logic stays simple. Hope this project reduces your workload if you want to do similar development. Basically if you just want to add your own window based on this framework, then the only thing you need do is to create new `WindowChildren` component and design its trigger button. And if you wish to change the entire theme, you basically need to redesign the taskbar components (including some buttons and some window styles), after all the desktop background is always easy to change. 24 | 25 | Thanks for watching. 26 | -------------------------------------------------------------------------------- /misc/chika.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/misc/chika.JPG -------------------------------------------------------------------------------- /misc/figure.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/misc/figure.png -------------------------------------------------------------------------------- /misc/modify_commit_date.sh: -------------------------------------------------------------------------------- 1 | git filter-branch -f \ 2 | --env-filter 'if [ $GIT_COMMIT = eaaf5577f402c0a8b10f0604dfa0d29558b2a4e2 ] 3 | then 4 | export GIT_AUTHOR_DATE="2021-01-01 00:00:00" 5 | export GIT_COMMITTER_DATE="2021-01-01 00:00:00" 6 | elif [ $GIT_COMMIT = 815bb0121c3fc96cc5529eb4c8b3990cd10f9113 ] 7 | then 8 | export GIT_AUTHOR_DATE="2016-08-25 00:00:00" 9 | export GIT_COMMITTER_DATE="2016-08-25 00:00:00" 10 | fi' -------------------------------------------------------------------------------- /misc/readme_chs.md: -------------------------------------------------------------------------------- 1 | # linux.dawidolko.pl 2 | 3 | ``` 4 | This is a web-driven blog tool that emulates the Deepin desktop UI, entirely reliant on Github Pages for open-source deployment. You can use it for a personal blog or as a personal resume. 5 | 6 | This project was born by chance, as there was a need to organize a blog for project display recently. The author saw a similar version for Ubuntu on a forum, but since it was written in react, which I am not familiar with, I wanted to migrate a similar version to vue, hence this project. 7 | 8 | When planning to start a project, the first challenge is deciding which system to emulate. Since the most popular Ubuntu has been done by others, reinventing the wheel seemed pointless. The author had also seen a MacOS version before, and Windows seemed too costly to mimic in detail due to many years of development. Despite the richness of Linux distributions, our choices seemed limited, with daily-use Red Hat-based distributions not focusing on desktop experience, making implementation less meaningful. The remaining widely accepted distributions were Manjaro, Fedora, and some so-called Gaming ready distros. I finally chose Deepin, which I haven't used but have heard a lot about, and the project is available on Github for vue developers worldwide, also serving as promotion for a domestic product. 9 | ``` 10 | 11 | ## Quick Start 12 | 13 | This project is designed to be served by Github Pages, with all APIs being converted into static files for distribution. If you want to run and debug locally, try the following steps: 14 | 15 | ``` 16 | git clone https://github.com/dawidolko/Simulaing-Linux-System-GUI 17 | cd Simulaing-Linux-System-GUI 18 | npm install 19 | npm run serve 20 | ``` 21 | 22 | If your npm and vue-cli versions are appropriate, this should be enough to get the program running. You can find the used versions in the following section and `package.json` for reference. 23 | 24 | If you wish to modify blog content, you should directly modify the content in the `/blog` directory, with all .md content being directly mapped to the website. 25 | 26 | After modifications, execute the following commands to generate static files. 27 | 28 | ``` 29 | python3 generate.py 30 | npm run build 31 | ``` 32 | 33 | Since vue-cli's default settings were modified, static files are generated in the /docs directory. 34 | 35 | ### How is this project different from similar desktop emulations? 36 | 37 | The main focus is on a more complete window system implemented in this project. You can freely create multiple windows, move, resize them, and manage their display order just like in a normal operating system. It implements a simple recursive directory system, so you can map an entire folder as your blog. Additionally, a toy terminal is included. 38 | 39 | ### How can I update my blog? 40 | 41 | If your blog is forked from this project and fully served by Github Pages, you only need to modify the content in the /blog directory and submit a commit. The compilation and distribution of static files will be automatically done by Actions in the background. 42 | 43 | If you directly forked this project, you need to check if your Actions are executed correctly. To my knowledge, some actions are automatically turned off upon forking until manually reactivated. 44 | 45 | ### How can I modify the music player? 46 | 47 | This project implements a simple music player based on `vue-aplayer`. To modify the playlist, please change the `musics.json` file in the `public` directory, following the specified format. Due to copyright policies, I have not provided music source addresses in the default version. You can configure your distribution strategy and paste the music access links accordingly. 48 | 49 | By default, if your music covers are self-distributed (not through a third party), the covers' directory is `/public/musiccovers` 50 | 51 | ### Further Explanation of Blog Functionality 52 | 53 | To implement basic blog functionality, a typical requirement is to publish article links on third-party platforms, allowing users to directly locate your articles through the links. To achieve this effect, follow the routing rules below to construct links. 54 | 55 | ``` 56 | https://{{domain}}/#/desktop/post/{{filename}}.md 57 | 58 | For example: 59 | https://linux.dawidolko.pl/#/desktop/post/README.md 60 | ``` 61 | 62 | On the logic level, the program recursively searches and returns the **first** item in the file tree that matches the required value. This means if you have multiple files with the same name but placed in different directories, the program can only return one and ignore the others. You do not need to worry about spaces in filenames, as they will be automatically escaped. 63 | 64 | If no match is found, a 404 article will be displayed. 65 | 66 | Articles are recognized by the program as follows: the program identifies the first line starting with `#` as the title, and the first line starting with a non-punctuation character as the summary. 67 | 68 | ### Acknowledgments 69 | 70 | This project is based on the following open-source projects: 71 | 72 | ``` 73 | @vue/cli 4.5.11, Blank template with ESLint 74 | vuetify default settings 75 | node-sass & sass-loader 76 | tailwindcss + postcss 77 | animate.css 78 | vuex 79 | 80 | 81 | vue-router 82 | axios & vue-axios 83 | vue-wechat-title 84 | ``` 85 | 86 | Markdown rendering is based on: 87 | 88 | ``` 89 | markdown-it-vue 90 | ``` 91 | 92 | The music player is based on: 93 | 94 | ``` 95 | vue-aplayer 96 | ``` 97 | 98 | Inspired by the following projects: 99 | 100 | - [https://github.com/dawidolko/Simulaing-Ubuntu-System-GUI](https://linux.dawidolko.pl) 101 | - [https://codepen.io/Krishna1947/pen/KKgZgLd](https://codepen.io/Krishna1947/pen/KKgZgLd) 102 | 103 | ### Contribution Methods 104 | 105 | Any form of contribution to improve this system is welcome. However, since the author is a non-professional frontend programmer and is not familiar with how GUI should deploy automatic tests, this poses some difficulties for code merging in the open-source community. Without automatic tests, if you wish to submit a PR, you should indicate in the PR the reason for your changes, all the places modified, and the expected effects. 106 | 107 | ##### [Guidelines for further development](https://github.com/dawidolko/Simulaing-Linux-System-GUI/blob/main/misc/Guidelines%20for%20further%20development.md) 108 | 109 | ### Existing Issues 110 | 111 | As the author is from a big data background, this is a severe case of a non-professional frontend developer running off-topic. Due to limited time, the actual coding time was about three days, and many places were implemented with the principle of simplicity for small-scale data, inevitably bringing many problems. 112 | 113 | Currently known UI differences from the native interface: 114 | 115 | - I didn't have time to adjust fonts, and the interface uses a set of universal fonts, which have a significant difference from the original. 116 | - Icons are all from screenshots to minimize acquisition difficulties. 117 | 118 | Similarly, although this module adheres to responsive design, it performs poorly on mobile platforms. Partly due to animate.css compatibility issues on mobile platforms and partly because many UI components were designed specifically for desktop platforms, I do not know how they should be laid out on mobile platforms. 119 | 120 | ## About Deepin 121 | 122 | I have no affiliation with Deepin officials; this was purely written out of interest and to promote a domestic system, not for any form of profit from the project. If you are interested in Deepin, please visit the official website [https://www.deepin.org/](https://www.deepin.org/) 123 | 124 | ### Thanks 125 | 126 | This project is open-source under the AGPLv3 license. Thank you for browsing this project, and I hope you find joy in exploring it. 127 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Deepin", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "autoprefixer": "^9.8.6", 12 | "axios": "^0.21.1", 13 | "core-js": "^3.6.5", 14 | "markdown-it-vue": "^1.1.6", 15 | "postcss": "^7.0.35", 16 | "tailwindcss": "npm:@tailwindcss/postcss7-compat@^2.1.0", 17 | "vue": "^2.6.11", 18 | "vue-aplayer": "^1.6.1", 19 | "vue-axios": "^3.2.4", 20 | "vue-router": "^3.5.1", 21 | "vue-wechat-title": "^2.0.7", 22 | "vuetify": "^2.4.0", 23 | "vuex": "^3.6.2" 24 | }, 25 | "devDependencies": { 26 | "@vue/cli-plugin-babel": "~4.5.0", 27 | "@vue/cli-plugin-eslint": "~4.5.0", 28 | "@vue/cli-service": "~4.5.0", 29 | "babel-eslint": "^10.1.0", 30 | "eslint": "^6.7.2", 31 | "eslint-plugin-vue": "^6.2.2", 32 | "node-sass": "^5.0.0", 33 | "sass": "^1.32.0", 34 | "sass-loader": "^10.1.1", 35 | "vue-cli-plugin-vuetify": "~2.3.1", 36 | "vue-template-compiler": "^2.6.11", 37 | "vuetify-loader": "^1.7.0" 38 | }, 39 | "eslintConfig": { 40 | "root": true, 41 | "env": { 42 | "node": true 43 | }, 44 | "extends": [ 45 | "plugin:vue/essential", 46 | "eslint:recommended" 47 | ], 48 | "parserOptions": { 49 | "parser": "babel-eslint" 50 | }, 51 | "rules": { 52 | "no-debugger": "off" 53 | } 54 | }, 55 | "browserslist": [ 56 | "> 1%", 57 | "last 2 versions", 58 | "not dead" 59 | ] 60 | } 61 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /public/desktop_Hi_there.json: -------------------------------------------------------------------------------- 1 | { 2 | "data": "# Hi everyone! \ud83d\udc4b\n\nThis project is a web page emulation of a particular Linux distro called deepin. It is designed to allow you to host an open source blog, needless your own server. \n\nCurrently this project has implemented some basic features of blogs, windows, directories, also it has a shell with very fundamental functionalities. \n\n**Hope you enjoy this blog and have fun \ud83d\ude03.**\n![](https://raw.githubusercontent.com/dawidolko/dawidolko.github.io/main/misc/chika.JPG)\n" 3 | } 4 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 12 | 15 | 16 | 17 | 24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /public/linux.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/linux.png -------------------------------------------------------------------------------- /public/map.json: -------------------------------------------------------------------------------- 1 | [{"name": "Hi there.md", "path": "desktop_Hi_there.json", "lastedittime": 1619756653, "title": "Hi everyone! \ud83d\udc4b", "abstract": "This project is a web page emulation of a particular Linux distro called deepin. It is designed to allow you to host an ...", "size": 478}, {"name": "Video Compression Technology (In Chinese)", "path": "", "lastedittime": 1651011960, "size": -1, "children": [{"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e09\uff09\uff1a\u8272\u5f69\u8303\u56f4\u788e\u788e\u5ff5\uff0c\u4ee5\u53caExpr.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e09\uff09\uff1a\u8272\u5f69\u8303\u56f4\u788e\u788e\u5ff5\uff0c\u4ee5\u53caExpr.json", "lastedittime": 1651011946, "title": "", "abstract": "", "size": 9645}, {"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u56db\uff09\uff1a\u5206\u8fa8\u7387\u4e0e\u6548\u7387\u7684\u8fa9\u8bc1\u5173\u7cfb\u3001\u4ee5\u53ca\u5ba2\u89c2\u8bc4\u4ef7\u7b97\u6cd5.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u56db\uff09\uff1a\u5206\u8fa8\u7387\u4e0e\u6548\u7387\u7684\u8fa9\u8bc1\u5173\u7cfb\u3001\u4ee5\u53ca\u5ba2\u89c2\u8bc4\u4ef7\u7b97\u6cd5.json", "lastedittime": 1651011946, "title": "", "abstract": "", "size": 19638}, {"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u516d\uff09\uff1a\u5e38\u7528\u5904\u7406\u6280\u5de7\u4e4b\u4f3d\u9a6c\u66f2\u7ebf\u8c03\u6574\uff0c\u8fd8\u6709\u5377\u79ef\uff01.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u516d\uff09\uff1a\u5e38\u7528\u5904\u7406\u6280\u5de7\u4e4b\u4f3d\u9a6c\u66f2\u7ebf\u8c03\u6574\uff0c\u8fd8\u6709\u5377\u79ef\uff01.json", "lastedittime": 1651011946, "title": "\u5b9a\u4e49\u6574\u6570\u8fd0\u7b97\u7684\u4f4d\u6df1\u8f6c\u6362\u5668", "abstract": "def Scale(val, d):", "size": 31165}, {"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e00\uff09\uff1a\u672c\u7ec4\u5de5\u4f5c\u57fa\u672c\u6d41\u7a0b.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e00\uff09\uff1a\u672c\u7ec4\u5de5\u4f5c\u57fa\u672c\u6d41\u7a0b.json", "lastedittime": 1651011946, "title": "", "abstract": "", "size": 4923}, {"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e8c\uff09\uff1aWaifu2X-caffe\u7684\u4f7f\u7528\u65b9\u6cd5.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e8c\uff09\uff1aWaifu2X-caffe\u7684\u4f7f\u7528\u65b9\u6cd5.json", "lastedittime": 1651011946, "title": "", "abstract": "", "size": 12656}, {"name": "\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e94\uff09\uff1a\u81ea\u9002\u5e94\u5904\u7406\u3001\u8d1d\u585e\u5c14\u66f2\u7ebf\u3001\u4ee5\u53ca\u52a8\u6001\u4fa6\u6d4b\uff01.md", "path": "desktop_Video_Compression_Technology_(In_Chinese)_\u7ec4\u5185\u65b0\u4eba\u57f9\u8bad\uff08\u4e94\uff09\uff1a\u81ea\u9002\u5e94\u5904\u7406\u3001\u8d1d\u585e\u5c14\u66f2\u7ebf\u3001\u4ee5\u53ca\u52a8\u6001\u4fa6\u6d4b\uff01.json", "lastedittime": 1651011946, "title": "", "abstract": "", "size": 31117}]}, {"name": "About This Blog", "path": "", "lastedittime": 1651011960, "size": -1, "children": [{"name": "README.md", "path": "desktop_About_This_Blog_README.json", "lastedittime": 1627462053, "title": "About linux.dawidolko.pl", "abstract": "A website simulating linux system's GUI, using theme of Deepin distro. You can write blogs with markdown and use it to s...", "size": 6717}, {"name": "Some Secrets", "path": "", "lastedittime": 1651011960, "size": -1, "children": [{"name": "No peeking!.md", "path": "desktop_About_This_Blog_Some_Secrets_No_peeking!.json", "lastedittime": 1609459200, "title": "Suprise!", "abstract": "Congratulations on your discovery of this hidden directory!", "size": 136}]}]}, {"name": "Previous Projects", "path": "", "lastedittime": 1651011960, "size": -1, "children": [{"name": "ComparePictureOnline.md", "path": "desktop_Previous_Projects_ComparePictureOnline.json", "lastedittime": 1580428800, "title": "", "abstract": "", "size": 819}, {"name": "Programming-Language-Benchmarks-Visualization.md", "path": "desktop_Previous_Projects_Programming-Language-Benchmarks-Visualization.json", "lastedittime": 1621640239, "title": "Programming-Language-Benchmarks-Visualization", "abstract": "Benchmarks data & source codes come from", "size": 4952}, {"name": "dynamic_salt.md", "path": "desktop_Previous_Projects_dynamic_salt.json", "lastedittime": 1616371200, "title": "Dynamic Salt", "abstract": "Accepts a byte string, add salt at dynamic locations & values under some certain rules.", "size": 795}, {"name": "cx_Oracle_async.md", "path": "desktop_Previous_Projects_cx_Oracle_async.json", "lastedittime": 1616716800, "title": "cx_Oracle_async", "abstract": "A very simple asynchronous wrapper that allows you to get access to the Oracle database in asyncio programs.", "size": 3611}, {"name": "danmuG.md", "path": "desktop_Previous_Projects_danmuG.json", "lastedittime": 1639152117, "title": "danmuG", "abstract": "\u79e6\u5ddd\u5f39\u5e55\u673a\u5668\u4eba", "size": 2466}, {"name": "setu-bot.md", "path": "desktop_Previous_Projects_setu-bot.json", "lastedittime": 1583366400, "title": "setu-bot", "abstract": "build instructions for a coolq setu-bot.
", "size": 2858}, {"name": "aioredlock-py.md", "path": "desktop_Previous_Projects_aioredlock-py.json", "lastedittime": 1650576604, "title": "aioredlock-py", "abstract": "Secure and efficient distributed locks (Redisson like) implemetation. Ensure efficient performance with biased locking's...", "size": 2585}, {"name": "ThreadPoolExecutorPlus.md", "path": "desktop_Previous_Projects_ThreadPoolExecutorPlus.json", "lastedittime": 1616803200, "title": "ThreadPoolExecutorPlus", "abstract": "This package provides you a duck typing of concurrent.futures.ThreadPoolExecutor , which has the very similar api and co...", "size": 5698}, {"name": "fastapi-queue.md", "path": "desktop_Previous_Projects_fastapi-queue.json", "lastedittime": 1651011946, "title": "fastapi-queue", "abstract": "A python implementation of a task queue based on `Redis` that can serve as a peak shaver and protect your app.", "size": 9783}, {"name": "aiohttp-jwtplus.md", "path": "desktop_Previous_Projects_aiohttp-jwtplus.json", "lastedittime": 1583798400, "title": "aiohttp-jwtplus", "abstract": "Aiohttp middleware and helper utils for working with JSON web token(signature).", "size": 8922}, {"name": "easyrpc.md", "path": "desktop_Previous_Projects_easyrpc.json", "lastedittime": 1560380400, "title": "client.py", "abstract": "from easyrpc import *", "size": 8853}, {"name": "pipeit.md", "path": "desktop_Previous_Projects_pipeit.json", "lastedittime": 1648418805, "title": "pipeit", "abstract": "Let's use python functional programming like Unix pipe!", "size": 2600}, {"name": "EasySeedboxPlus.md", "path": "desktop_Previous_Projects_EasySeedboxPlus.json", "lastedittime": 1580515200, "title": "What is EasySeedbox?", "abstract": "EasySeedbox is an unobtrusive seedbox installation script for Ubuntu and Debian systems.", "size": 837}, {"name": "aiohttp-debugmode.md", "path": "desktop_Previous_Projects_aiohttp-debugmode.json", "lastedittime": 1584057600, "title": "aiohttp-debugmode", "abstract": "This package helps you easily start a aiohttp develpment server in subprocess ,everytime dependencies/statics are modifi...", "size": 4536}, {"name": "py-fnvhash-c.md", "path": "desktop_Previous_Projects_py-fnvhash-c.json", "lastedittime": 1610496000, "title": "fnvhash-c", "abstract": "Python FNV hash implementation based on cython, to give you an alternative choice when you need a high speed hash in pyt...", "size": 3165}]}] -------------------------------------------------------------------------------- /public/musiccovers/m0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m0.png -------------------------------------------------------------------------------- /public/musiccovers/m1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m1.png -------------------------------------------------------------------------------- /public/musiccovers/m10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m10.png -------------------------------------------------------------------------------- /public/musiccovers/m11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m11.png -------------------------------------------------------------------------------- /public/musiccovers/m12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m12.png -------------------------------------------------------------------------------- /public/musiccovers/m13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m13.png -------------------------------------------------------------------------------- /public/musiccovers/m14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m14.png -------------------------------------------------------------------------------- /public/musiccovers/m15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m15.png -------------------------------------------------------------------------------- /public/musiccovers/m16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m16.png -------------------------------------------------------------------------------- /public/musiccovers/m2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m2.png -------------------------------------------------------------------------------- /public/musiccovers/m3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m3.png -------------------------------------------------------------------------------- /public/musiccovers/m4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m4.png -------------------------------------------------------------------------------- /public/musiccovers/m5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m5.png -------------------------------------------------------------------------------- /public/musiccovers/m6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m6.png -------------------------------------------------------------------------------- /public/musiccovers/m7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m7.png -------------------------------------------------------------------------------- /public/musiccovers/m8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m8.png -------------------------------------------------------------------------------- /public/musiccovers/m9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/public/musiccovers/m9.png -------------------------------------------------------------------------------- /public/musics.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "title": "So I Gave Up on Music", 4 | "artist": "Yorushika", 5 | "src": "https://oss.wendemoapi.site/ta-01/5daad1f8-de0d-e303-f036-d344a14fab81.mp3", 6 | "pic": "/musiccovers/m0.png" 7 | }, 8 | { 9 | "title": "Song of a Troubled Youth", 10 | "artist": "Choir of the Sretensky Monastery", 11 | "src": "https://oss.wendemoapi.site/ta-01/b27523db-4b9b-bbed-ec12-a8b8afc8fd85.mp3", 12 | "pic": "/musiccovers/m1.png" 13 | }, 14 | { 15 | "title": "Don't Forget That Smile", 16 | "artist": "ZARD", 17 | "src": "https://oss.wendemoapi.site/ta-01/df1c22f6-6ba8-0a97-f4ac-6aef7f4fbc57.mp3", 18 | "pic": "/musiccovers/m2.png" 19 | }, 20 | { 21 | "title": "Night of Confessions (LIVE!! Ayasa Theater episode 7)", 22 | "artist": "Ayasa", 23 | "src": "https://oss.wendemoapi.site/ta-01/f1be7233-eec6-012f-a0e1-e6edf97dccc3.mp3", 24 | "pic": "/musiccovers/m3.png" 25 | }, 26 | { 27 | "title": "Dream of the Red Chamber Overture", 28 | "artist": "Chen Li", 29 | "src": "https://oss.wendemoapi.site/ta-01/56e4f8cd-7973-1930-d2cc-c3957afa414e.mp3", 30 | "pic": "/musiccovers/m4.png" 31 | }, 32 | { 33 | "title": "I'll remember you", 34 | "artist": "Megumi Sasaka", 35 | "src": "https://oss.wendemoapi.site/ta-01/1491e002-f300-6c05-28ba-d321c47a86f8.mp3", 36 | "pic": "/musiccovers/m5.png" 37 | }, 38 | { 39 | "title": "Tell Me a Lie That Lasts Forever", 40 | "artist": "Miyuki Nakajima", 41 | "src": "https://oss.wendemoapi.site/ta-01/85403895-bc58-7918-dc75-5f0d4ddd14da.mp3", 42 | "pic": "/musiccovers/m6.png" 43 | }, 44 | { 45 | "title": "Elephant", 46 | "artist": "Yu Takahashi", 47 | "src": "https://oss.wendemoapi.site/ta-01/57754788-cea5-74f8-d7bc-98418c75dbb0.mp3", 48 | "pic": "/musiccovers/m7.png" 49 | }, 50 | { 51 | "title": "Crescent Bay", 52 | "artist": "F.I.R.", 53 | "src": "https://oss.wendemoapi.site/ta-01/0fdc2b9a-15be-7801-87ef-75730fc92f9e.mp3", 54 | "pic": "/musiccovers/m8.png" 55 | }, 56 | { 57 | "title": "Cry Cry", 58 | "artist": "T-ara", 59 | "src": "https://oss.wendemoapi.site/ta-01/e21b27a7-3518-9cbb-d4aa-f96b12a43b24.mp3", 60 | "pic": "/musiccovers/m9.png" 61 | }, 62 | { 63 | "title": "Twinkle Starlight", 64 | "artist": "Sayaka Sasaki", 65 | "src": "https://oss.wendemoapi.site/ta-01/1eb92111-1962-1666-a6f8-ca81cb51cb67.mp3", 66 | "pic": "/musiccovers/m10.png" 67 | }, 68 | { 69 | "title": "Komm, süsser Tod (Come, Sweet Death)", 70 | "artist": "ARIANNE", 71 | "src": "https://oss.wendemoapi.site/ta-01/5b71dd18-505d-07bc-bebf-57e7a0be2d62.mp3", 72 | "pic": "/musiccovers/m11.png" 73 | }, 74 | { 75 | "title": "On the Taihang Mountains", 76 | "artist": "China Symphony Orchestra Choir", 77 | "src": "https://oss.wendemoapi.site/ta-01/d6ab4aac-b458-8413-f3e4-4a8cc4062682.m4a", 78 | "pic": "/musiccovers/m12.png" 79 | }, 80 | { 81 | "title": "Angel Wink", 82 | "artist": "Ai Kayano", 83 | "src": "https://oss.wendemoapi.site/ta-01/48a3a925-4753-e602-fa50-1bfbfc9d0895.mp3", 84 | "pic": "/musiccovers/m13.png" 85 | }, 86 | { 87 | "title": "La Reine De Saba", 88 | "artist": "Paul Mauriat", 89 | "src": "https://oss.wendemoapi.site/ta-01/12da445c-7cf5-8d06-e78e-0deededf090f.mp3", 90 | "pic": "/musiccovers/m14.png" 91 | }, 92 | { 93 | "title": "Silhouette Dancer", 94 | "artist": "Yuko Imai", 95 | "src": "https://oss.wendemoapi.site/ta-01/2d362db6-e6c0-c6ee-866a-74d4f5c69856.mp3", 96 | "pic": "/musiccovers/m15.png" 97 | }, 98 | { 99 | "title": "and I'm home", 100 | "artist": "Eri Kitamura", 101 | "src": "https://oss.wendemoapi.site/ta-01/597a457f-0a2d-8002-d32e-d20080d9accd.mp3", 102 | "pic": "/musiccovers/m16.png" 103 | } 104 | ] 105 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/images/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/avatar.jpg -------------------------------------------------------------------------------- /src/assets/images/deepin_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/deepin_1.png -------------------------------------------------------------------------------- /src/assets/images/deepin_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/deepin_2.png -------------------------------------------------------------------------------- /src/assets/images/deepin_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/deepin_3.png -------------------------------------------------------------------------------- /src/assets/images/deepin_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/deepin_4.png -------------------------------------------------------------------------------- /src/assets/images/deepin_text_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/deepin_text_1.png -------------------------------------------------------------------------------- /src/assets/images/desktop_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/desktop_1.jpg -------------------------------------------------------------------------------- /src/assets/images/goodmanwen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/goodmanwen.png -------------------------------------------------------------------------------- /src/assets/images/holo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/holo.gif -------------------------------------------------------------------------------- /src/assets/images/icons/b1.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 9 | -------------------------------------------------------------------------------- /src/assets/images/icons/b2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/images/icons/b3.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/images/icons/browser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/browser.png -------------------------------------------------------------------------------- /src/assets/images/icons/d1.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 9 | -------------------------------------------------------------------------------- /src/assets/images/icons/d2.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /src/assets/images/icons/d3.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | -------------------------------------------------------------------------------- /src/assets/images/icons/desktop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/desktop.png -------------------------------------------------------------------------------- /src/assets/images/icons/doc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/doc.png -------------------------------------------------------------------------------- /src/assets/images/icons/explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/explorer.png -------------------------------------------------------------------------------- /src/assets/images/icons/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/folder.png -------------------------------------------------------------------------------- /src/assets/images/icons/menu.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/menu.png -------------------------------------------------------------------------------- /src/assets/images/icons/music.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/music.png -------------------------------------------------------------------------------- /src/assets/images/icons/paint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/paint.png -------------------------------------------------------------------------------- /src/assets/images/icons/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/profile.png -------------------------------------------------------------------------------- /src/assets/images/icons/recycle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/recycle.png -------------------------------------------------------------------------------- /src/assets/images/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/settings.png -------------------------------------------------------------------------------- /src/assets/images/icons/shell.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/shell.png -------------------------------------------------------------------------------- /src/assets/images/icons/skills.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/skills.png -------------------------------------------------------------------------------- /src/assets/images/icons/tasks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/tasks.png -------------------------------------------------------------------------------- /src/assets/images/icons/text.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/text.png -------------------------------------------------------------------------------- /src/assets/images/icons/text2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/text2.png -------------------------------------------------------------------------------- /src/assets/images/icons/vscode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/icons/vscode.png -------------------------------------------------------------------------------- /src/assets/images/instagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dawidolko/Linux-Simulaing-System-GUI/a4c38e8e8ebb466dc9ed75b0ea3873dcdd7c72b0/src/assets/images/instagram.png -------------------------------------------------------------------------------- /src/assets/tailwind.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer utilities { 6 | @variants responsive { 7 | .text-shadow { 8 | text-shadow: 0px 0px 4px rgba(132,132,132,.5); 9 | } 10 | .text-shadow-sm { 11 | text-shadow: 0px 0px 6px rgba(132,132,132,.5); 12 | } 13 | .text-shadow-md { 14 | text-shadow: 0px 0px 10px rgba(132,132,132,.5); 15 | } 16 | .text-shadow-lg { 17 | text-shadow: 0px 0px 20px rgba(132,132,132,.5); 18 | } 19 | .text-shadow-xl { 20 | text-shadow: 0px 0px 30px rgba(132,132,132,.5); 21 | } 22 | .text-shadow-none { 23 | text-shadow: none; 24 | } 25 | } 26 | } -------------------------------------------------------------------------------- /src/components/Blank.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 43 | 44 | -------------------------------------------------------------------------------- /src/components/ContextMenu/ContextMenu.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 93 | 94 | -------------------------------------------------------------------------------- /src/components/ContextMenu/ContextMenuBottomBar.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 88 | 89 | -------------------------------------------------------------------------------- /src/components/ContextMenu/ContextMenuButton.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 46 | 47 | -------------------------------------------------------------------------------- /src/components/Desktop/Desktop.vue: -------------------------------------------------------------------------------- 1 | 39 | 40 | 212 | 213 | 216 | -------------------------------------------------------------------------------- /src/components/Desktop/DesktopFileArray.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 83 | 84 | -------------------------------------------------------------------------------- /src/components/Desktop/DesktopFileIcon.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 68 | 69 | -------------------------------------------------------------------------------- /src/components/Desktop/Icon.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 123 | 124 | -------------------------------------------------------------------------------- /src/components/Desktop/Message.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 123 | 124 | -------------------------------------------------------------------------------- /src/components/Desktop/SideBar.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 210 | 211 | 213 | -------------------------------------------------------------------------------- /src/components/Down.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 46 | 47 | 70 | 71 | -------------------------------------------------------------------------------- /src/components/Interlude.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 56 | 57 | -------------------------------------------------------------------------------- /src/components/Keyboard/Key.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 70 | 71 | -------------------------------------------------------------------------------- /src/components/Keyboard/Key2.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 74 | 75 | -------------------------------------------------------------------------------- /src/components/Keyboard/KeyBoard.vue: -------------------------------------------------------------------------------- 1 | 59 | 60 | 152 | 153 | -------------------------------------------------------------------------------- /src/components/Keyboard/KeyBoardMoveIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/LoginPage/LoginPage.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 262 | 263 | 312 | -------------------------------------------------------------------------------- /src/components/LoginPage/RestartButton.vue: -------------------------------------------------------------------------------- 1 | 17 | 18 | 62 | 63 | -------------------------------------------------------------------------------- /src/components/WindowBasic/WindowHeaderButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 41 | 42 | -------------------------------------------------------------------------------- /src/components/WindowBasic/WindowHeaderCursor.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 27 | 28 | -------------------------------------------------------------------------------- /src/components/WindowBasic/WindowSider.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 35 | 36 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowBrowser.vue: -------------------------------------------------------------------------------- 1 | 35 | 36 | 167 | 168 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowBrowserButton.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 58 | 59 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowFolderIcon.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 39 | 40 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowFolderSlider.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowMusic.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 110 | 111 | 113 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowSetting.vue: -------------------------------------------------------------------------------- 1 | 101 | 102 | 155 | 156 | 163 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowSettingIcon.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 48 | 49 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowText.vue: -------------------------------------------------------------------------------- 1 | 60 | 61 | 206 | 207 | 236 | -------------------------------------------------------------------------------- /src/components/WindowChildren/WindowVSCode.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 65 | 66 | 78 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import vuetify from './plugins/vuetify'; 4 | import "@/assets/tailwind.css" 5 | // axios 6 | import VueAxios from 'vue-axios' 7 | import axios from 'axios' 8 | import {request} from "./network/request" 9 | // router 10 | import VueRouter from 'vue-router' 11 | import router from './router' 12 | // vuex 13 | import store from './store' 14 | // title 15 | import VueWechatTitle from 'vue-wechat-title' 16 | // cookies 17 | import cookies from './plugins/cookies' 18 | import utils from './plugins/utils' 19 | 20 | 21 | 22 | // vuetify 23 | Vue.config.productionTip = false 24 | // axios 25 | Vue.use(VueAxios, axios) 26 | Vue.prototype.$axios = request 27 | // router 28 | Vue.use(VueRouter) 29 | // title 30 | Vue.use(VueWechatTitle) 31 | // cookies 32 | Vue.use(cookies) 33 | Vue.use(utils) 34 | 35 | 36 | 37 | new Vue({ 38 | vuetify, 39 | router, 40 | store, 41 | render: h => h(App) 42 | }).$mount('#app') 43 | -------------------------------------------------------------------------------- /src/network/request.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios' 2 | 3 | let baseURL = '/' 4 | if (process.env.NODE_ENV == 'development') { 5 | baseURL = '/dev/' 6 | } else if (process.env.NODE_ENV == 'production') { 7 | baseURL = '/' 8 | } 9 | 10 | let rcall = (req) => { 11 | return req 12 | } 13 | let rerr = (err) => { 14 | console.log('axios network error', err) 15 | return err 16 | } 17 | 18 | let request = { 19 | get: (config) => { 20 | const instance = axios.create({ 21 | baseURL: baseURL, 22 | timeout: 10000 23 | }) 24 | instance.interceptors.request.use(rcall , rerr) 25 | return instance(config) 26 | }, 27 | post: (config) => { 28 | const instance = axios.create({ 29 | baseURL: baseURL, 30 | timeout: 10000, 31 | method: 'post', 32 | }) 33 | instance.interceptors.request.use(rcall , rerr) 34 | return instance(config) 35 | }, 36 | raw: (config) => { 37 | const instance = axios.create({ 38 | timeout: 10000 39 | }) 40 | return instance(config) 41 | }, 42 | } 43 | export {request} -------------------------------------------------------------------------------- /src/plugins/cookies.js: -------------------------------------------------------------------------------- 1 | const cget = (key) => { 2 | if (typeof(key)=='string'){ 3 | let all = document.cookie.split(';') 4 | .map((_)=>{ 5 | return [_.substr(0 , _.indexOf('=')) , _.substr(_.indexOf('=') + 1 , _.length - 1)] 6 | .map(res => res.replace(/^\s\s*/, '').replace(/\s\s*$/, '')) 7 | }) 8 | for (let item of all){ 9 | if (item[0] == key) { 10 | return item[1] 11 | } 12 | } 13 | return undefined 14 | } 15 | } 16 | 17 | const cookies = function (Vue) { 18 | Vue.prototype.$cookies = { 19 | get:cget, 20 | set(key , value , exp , path = '/'){ 21 | /* 22 | `exp` accepts string or number, both float and integer is ok. 23 | string should be end with 'm'/'d'/'h', which means month, day, or hour. 24 | if input string is a pure number without ending, which means seconds. 25 | */ 26 | if (exp == undefined) { 27 | document.cookie = key + '=' + this._strip(value) + ';path='+path+';' 28 | } else { 29 | let datetime = new Date(); 30 | let addon = 0; 31 | let exp_str = exp.toString(); 32 | let exp_flag = exp_str.charAt(exp_str.length - 1); 33 | if (exp_flag == 'm') { 34 | addon = 60 * parseFloat(exp_str.substring(0 , exp_str.length - 1)) * 1000 35 | } else if (exp_flag == 'h') { 36 | addon = 3600 * parseFloat(exp_str.substring(0 , exp_str.length - 1)) * 1000 37 | } else if (exp_flag == 'd') { 38 | addon = 24 * 3600 * parseFloat(exp_str.substring(0 , exp_str.length - 1)) * 1000 39 | } else { 40 | addon = parseFloat(exp_str) * 1000 41 | } 42 | datetime.setTime(datetime.getTime() + addon); 43 | document.cookie = key + '=' + this._strip(value) + ';expires=' + datetime.toGMTString() + ';path='+path+';' 44 | } 45 | }, 46 | remove(key , path = '/'){ 47 | this.set(key , '' , -1 , path) 48 | }, 49 | keys(){ 50 | return document.cookie.split(';') 51 | .map((_)=>{ 52 | return this._strip(_.substr(0 , _.indexOf('='))) 53 | }) 54 | }, 55 | items(){ 56 | return document.cookie.split(';').map((_)=>{ 57 | return [_.substr(0 , _.indexOf('=')) , _.substr(_.indexOf('=') + 1 , _.length - 1)] 58 | .map(this._strip) 59 | }) 60 | }, 61 | _strip(str){ 62 | return str.replace(/^\s\s*/, '').replace(/\s\s*$/, '') 63 | }, 64 | } 65 | }; 66 | 67 | export {cget} 68 | export default cookies -------------------------------------------------------------------------------- /src/plugins/utils.js: -------------------------------------------------------------------------------- 1 | const get_uuid = () => { 2 | let s4 = () => (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); 3 | return (s4() + s4() + "-" + s4() + "-" + s4() + "-" + s4() + "-" + s4() + s4() + s4()); 4 | } 5 | 6 | const utils = function (Vue) { 7 | Vue.prototype.$utils = { 8 | goto:(that , path , query = {})=>{ 9 | if ( path == that.$route.path) { 10 | that.$router.go(0); 11 | } else { 12 | that.$router.push({path:path,query:query}); 13 | } 14 | }, 15 | dynamic_append_script(url, callback = ()=>{}){ 16 | let script = document.createElement('script') 17 | script.type = "text/javascript" 18 | script.src = url 19 | document.body.appendChild(script) 20 | script.onload = script.onreadystatechange = callback() 21 | }, 22 | dynamic_append_link(url, callback = ()=>{}){ 23 | let link = document.createElement('link') 24 | link.rel = "stylesheet" 25 | link.href = url 26 | document.body.appendChild(link) 27 | link.onload = link.onreadystatechange = callback() 28 | }, 29 | 'get_uuid': get_uuid, 30 | } 31 | }; 32 | 33 | export {get_uuid} 34 | export default utils -------------------------------------------------------------------------------- /src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib/framework'; 3 | 4 | Vue.use(Vuetify); 5 | 6 | export default new Vuetify({ 7 | }); 8 | -------------------------------------------------------------------------------- /src/router/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import VueRouter from 'vue-router' 3 | import store from '../store' 4 | import LoginPage from '../components/LoginPage/LoginPage' 5 | import Desktop from '../components/Desktop/Desktop' 6 | import Down from '../components/Down' 7 | 8 | Vue.use(VueRouter) 9 | 10 | const routes = [ 11 | { 12 | path: '/terminated', 13 | name: "Down", 14 | component: Down, 15 | meta : { 16 | title:"No signal" 17 | } 18 | }, 19 | { 20 | path: '/login', 21 | name: "LoginPage", 22 | component: LoginPage, 23 | meta : { 24 | title:"Deepin" 25 | } 26 | }, 27 | { 28 | path: '/desktop/post/:postfilename', 29 | name: "DesktopWithPost", 30 | component: Desktop, 31 | meta : { 32 | title:"Welcom to WEN's blog" 33 | } 34 | }, 35 | { 36 | path: '/desktop', 37 | name: "Desktop", 38 | component: Desktop, 39 | meta : { 40 | title:"Welcom to WEN's blog" 41 | } 42 | }, 43 | { 44 | path:"*", 45 | redirect:'/login', 46 | }, 47 | ] 48 | 49 | 50 | const router = new VueRouter({ 51 | base: process.env.BASE_URL, 52 | routes 53 | }) 54 | 55 | router.beforeEach((to, from, next) => { 56 | store.commit('show_interlude') 57 | next() 58 | }) 59 | 60 | export default router 61 | -------------------------------------------------------------------------------- /src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Vuex from 'vuex' 3 | import {cget} from '../plugins/cookies' 4 | import {get_uuid} from '../plugins/utils' 5 | 6 | Vue.use(Vuex) 7 | 8 | const store = new Vuex.Store({ 9 | state: { 10 | authed:JSON.parse(cget('auth')||'false'), 11 | fullHeight:0, 12 | fullWidth:0, 13 | scrollHeight:0, 14 | scrollWidth:0, 15 | theme:'light', 16 | show_sidebar:true, 17 | clean_messages:false, 18 | n_spx:60, 19 | n_spy:60, 20 | spx_step:40, 21 | spy_step:40, 22 | window_list:[ 23 | ], 24 | current_focus:"", 25 | current_focus_type:"", 26 | desktop_keyboard_show:false, 27 | filemap:[], 28 | show_loading_page:true, 29 | start_load_time:0, 30 | context_menu_show:false, 31 | context_menu_x:0, 32 | context_menu_y:0, 33 | context_menu_bottom_bar_display_mode:false, 34 | context_menu_bottom_bar_show_target:'terminal', 35 | display_article_num:0, 36 | }, 37 | mutations: { 38 | open_new_window(state, payload){ 39 | let new_uuid = get_uuid() 40 | let obj = { 41 | uuid: new_uuid, 42 | spx:state.n_spx, 43 | spy:state.n_spy, 44 | zindex: 999, 45 | minimized: false, 46 | } 47 | if (payload.type === 'explorer') { 48 | obj.type = 'explorer' 49 | obj.openpath = payload.openpath 50 | } else if (payload.type === 'text') { 51 | obj.type='text' 52 | obj.filesrc=payload.filesrc 53 | obj.filename=payload.filename 54 | obj.size=payload.size 55 | } else if (payload.type === 'browser') { 56 | obj.type='browser' 57 | obj.default_width= Math.min(state.fullWidth * 0.8 , 1580) 58 | } else if (payload.type === 'music') { 59 | obj.type="music" 60 | obj.default_width=400 61 | obj.default_width=400 62 | obj.fixedsize=true 63 | } else if (payload.type === 'settings') { 64 | obj.type="settings" 65 | } else if (payload.type === 'terminal') { 66 | obj.type="terminal" 67 | } else if (payload.type === 'vscode') { 68 | obj.type="vscode" 69 | } 70 | state.window_list.push(obj) 71 | this.commit('refresh_window_focus', {uuid:new_uuid}) 72 | 73 | // refresh initialize position 74 | let init_width = Math.min(state.fullWidth * 0.6 , 1000); 75 | let init_height = 600; 76 | let padding_y = 100 77 | if ((state.fullHeight - state.n_spy - padding_y) < init_height) { 78 | state.n_spy = (state.n_spy + state.spy_step + init_height + padding_y) % state.fullHeight 79 | } else { 80 | state.n_spy = state.n_spy + state.spy_step 81 | } 82 | if ((state.fullWidth - state.n_spx) < init_width) { 83 | state.n_spx = (state.n_spx + state.spx_step + init_width) % state.fullWidth 84 | } else { 85 | state.n_spx = state.n_spx + state.spx_step 86 | } 87 | }, 88 | close_window_with_uuid(state, payload){ 89 | for (let i = 0;i < state.window_list.length;i++) { 90 | if (state.window_list[i].uuid === payload.uuid) { 91 | state.window_list.splice(i,1) 92 | break 93 | } 94 | } 95 | }, 96 | minimize_window_with_uuid(state,payload){ 97 | for (let window of state.window_list) { 98 | if (window.uuid === payload.uuid) { 99 | window.minimized = true 100 | break 101 | } 102 | } 103 | }, 104 | refresh_window_focus(state, payload) { 105 | let target_uuid = "" 106 | if (payload.type!=undefined) { 107 | for (let window of state.window_list) { 108 | if (window.type === payload.type) { 109 | target_uuid = window.uuid 110 | } 111 | } 112 | } else { 113 | target_uuid = payload.uuid 114 | } 115 | state.current_focus = target_uuid 116 | let tmp = [] 117 | let count = 0 118 | let finded = false 119 | for (let window of state.window_list) { 120 | if (window.uuid === target_uuid) { 121 | state.current_focus_type = window.type 122 | window.focus = true 123 | tmp.push({id:count, zindex:1000}) 124 | finded = true 125 | } else { 126 | tmp.push({id:count, zindex:window.zindex}) 127 | } 128 | count += 1 129 | } 130 | if (!finded) { 131 | state.current_focus_type = "" 132 | return 133 | } 134 | let sortFunc = (a,b) => { 135 | if (a.zindex===b.zindex) { 136 | return 0 137 | } else if (a.zindex > b.zindex) { 138 | return -1 139 | } else { 140 | return 1 141 | } 142 | } 143 | tmp.sort(sortFunc) 144 | count = 999 145 | for (let t of tmp) { 146 | state.window_list[t.id].zindex = count 147 | count -= 1 148 | } 149 | }, 150 | refresh_sizes(state){ 151 | state.fullHeight = document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight 152 | state.fullWidth = document.documentElement.clientWidth || document.body.clientHeight || window.innerWidth 153 | if (state.n_spx > state.fullWidth) { 154 | state.n_spx = Math.max(state.fullWidth - 600,0) 155 | } 156 | if (state.n_spy > state.fullHeight) { 157 | state.n_spy = Math.max(state.fullHeight - 600,0) 158 | } 159 | }, 160 | refresh_scroll(state){ 161 | state.scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight 162 | state.scrollWidth = document.documentElement.scrollWidth || document.body.scrollWidth 163 | }, 164 | get_auth_status(state){ 165 | if (Vue.prototype.$cookies.get('auth') == 'true'){ 166 | state.authed = true 167 | } else { 168 | state.authed = false 169 | } 170 | }, 171 | set_auth_status(state , data){ 172 | if (data == true) { 173 | Vue.prototype.$cookies.set('auth',"true",'10m') 174 | this.commit('get_login_status') 175 | } 176 | }, 177 | set_darkmode(state) { 178 | state.theme='dark' 179 | Vue.prototype.$cookies.set('theme',state.theme,'720d') 180 | }, 181 | set_lightmode(state) { 182 | state.theme='light' 183 | Vue.prototype.$cookies.set('theme',state.theme,'720d') 184 | }, 185 | change_side_bar_status(state){ 186 | state.show_sidebar = !state.show_sidebar 187 | }, 188 | close_side_bar(state){ 189 | state.show_sidebar = false 190 | }, 191 | clean_all_messages(state){ 192 | if (state.clean_messages === false) { 193 | state.clean_messages = true 194 | window.setTimeout(()=>{ 195 | state.clean_messages = false 196 | },100) 197 | } 198 | 199 | }, 200 | switch_keyboard_status(state) { 201 | state.desktop_keyboard_show = !state.desktop_keyboard_show 202 | }, 203 | commit_filemap(state, data) { 204 | state.filemap = data 205 | }, 206 | show_interlude(state){ 207 | state.start_load_time = (new Date()).getTime() 208 | state.show_loading_page = true 209 | }, 210 | hide_interlude(state){ 211 | state.show_loading_page = false 212 | }, 213 | switch_global_window_show_status(state, payload) { 214 | let target_type = payload.type 215 | let tmp_list = [] 216 | let count = 0 217 | let all_minimized = true 218 | for (let window of state.window_list) { 219 | if (window.type === target_type) { 220 | tmp_list.push(count) 221 | if (window.minimized === false) { 222 | all_minimized = false 223 | } 224 | } 225 | count += 1 226 | } 227 | if (all_minimized) { 228 | for (let index of tmp_list) { 229 | state.window_list[index].minimized = false 230 | } 231 | } else { 232 | for (let index of tmp_list) { 233 | state.window_list[index].minimized = true 234 | } 235 | } 236 | }, 237 | close_global_window_same_type(state, payload) { 238 | let target_type = payload.type 239 | let i = 0 240 | while (i < state.window_list.length) { 241 | if (state.window_list[i].type === target_type) { 242 | state.window_list.splice(i,1) 243 | } else { 244 | i += 1 245 | } 246 | } 247 | }, 248 | show_context_menu(state){ 249 | this.commit('refresh_window_focus', {uuid:"ContextMenu"}) 250 | let e = e || window.event || e.which; 251 | state.context_menu_x = e.clientX; 252 | state.context_menu_y = e.clientY; 253 | state.context_menu_show=true 254 | }, 255 | show_context_menu_bottom_bar(state, payload){ 256 | this.commit('refresh_window_focus', {uuid:"ContextMenuBottomBar"}) 257 | let e = e || window.event || e.which; 258 | state.context_menu_x = e.clientX; 259 | state.context_menu_y = e.clientY; 260 | state.context_menu_show=true 261 | state.context_menu_bottom_bar_display_mode = payload.mode 262 | state.context_menu_bottom_bar_show_target = payload.target 263 | }, 264 | hide_context_menu(state){ 265 | this.commit('refresh_window_focus', {uuid:""}) 266 | state.context_menu_show=false 267 | }, 268 | switch_show_desktop(state){ 269 | if (state.window_list.length === 0) { 270 | return 271 | } 272 | let all_minimized = true 273 | for (let window of state.window_list) { 274 | if (window.minimized === true) { 275 | all_minimized = false 276 | break 277 | } 278 | } 279 | let result = false 280 | if (all_minimized) { 281 | result = true 282 | } else { 283 | result = false 284 | this.commit('refresh_window_focus', {uuid:""}) 285 | } 286 | for (let window of state.window_list) { 287 | window.minimized = result 288 | } 289 | }, 290 | display_article_num_changed(state, num) { 291 | state.display_article_num = num 292 | } 293 | }, 294 | }) 295 | 296 | export default store 297 | -------------------------------------------------------------------------------- /update.cmd: -------------------------------------------------------------------------------- 1 | git add -A 2 | git commit -m "Update" 3 | git push -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transpileDependencies: ["vuetify"], 3 | outputDir: "./docs", 4 | devServer: { 5 | host: "0.0.0.0", 6 | proxy: { 7 | "/dev": { 8 | target: "http://127.0.0.1:8079", 9 | changeOrigin: true, 10 | pathRewrite: { 11 | "^/dev": "", 12 | }, 13 | }, 14 | }, 15 | }, 16 | productionSourceMap: false, 17 | pwa: { 18 | iconPaths: { 19 | favicon32: "favicon.png", 20 | favicon16: "favicon.png", 21 | appleTouchIcon: "favicon.png", 22 | maskIcon: "favicon.png", 23 | msTileImage: "favicon.png", 24 | }, 25 | }, 26 | }; 27 | --------------------------------------------------------------------------------