From c7d10908bd1f41fb0568d8fcf7e4fe641f97a949 Mon Sep 17 00:00:00 2001 From: Rogee Date: Thu, 28 Nov 2024 12:25:36 +0800 Subject: [PATCH] feat: add frontend --- frontend/.gitignore | 30 +++++++ frontend/.vscode/extensions.json | 3 + frontend/README.md | 29 ++++++ frontend/bun.lockb | Bin 0 -> 100452 bytes frontend/index.html | 19 ++++ frontend/jsconfig.json | 8 ++ frontend/package.json | 26 ++++++ frontend/public/favicon.ico | Bin 0 -> 4286 bytes frontend/src/App.vue | 3 + frontend/src/assets/base.css | 86 ++++++++++++++++++ frontend/src/assets/logo.svg | 1 + frontend/src/assets/main.css | 35 ++++++++ frontend/src/components/WelcomeItem.vue | 86 ++++++++++++++++++ frontend/src/main.js | 12 +++ frontend/src/router/index.js | 51 +++++++++++ frontend/src/stores/counter.js | 12 +++ frontend/src/views/PlayView.vue | 3 + frontend/src/views/TabView.vue | 17 ++++ frontend/src/views/tabs/BoughtView.vue | 112 ++++++++++++++++++++++++ frontend/src/views/tabs/HomeView.vue | 65 ++++++++++++++ frontend/src/views/tabs/MeView.vue | 5 ++ frontend/vite.config.js | 27 ++++++ mp.code-workspace | 5 +- 23 files changed, 634 insertions(+), 1 deletion(-) create mode 100644 frontend/.gitignore create mode 100644 frontend/.vscode/extensions.json create mode 100644 frontend/README.md create mode 100755 frontend/bun.lockb create mode 100644 frontend/index.html create mode 100644 frontend/jsconfig.json create mode 100644 frontend/package.json create mode 100644 frontend/public/favicon.ico create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/assets/base.css create mode 100644 frontend/src/assets/logo.svg create mode 100644 frontend/src/assets/main.css create mode 100644 frontend/src/components/WelcomeItem.vue create mode 100644 frontend/src/main.js create mode 100644 frontend/src/router/index.js create mode 100644 frontend/src/stores/counter.js create mode 100644 frontend/src/views/PlayView.vue create mode 100644 frontend/src/views/TabView.vue create mode 100644 frontend/src/views/tabs/BoughtView.vue create mode 100644 frontend/src/views/tabs/HomeView.vue create mode 100644 frontend/src/views/tabs/MeView.vue create mode 100644 frontend/vite.config.js diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/frontend/.vscode/extensions.json b/frontend/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/frontend/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..555c7dc --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,29 @@ +# frontend + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +bun install +``` + +### Compile and Hot-Reload for Development + +```sh +bun dev +``` + +### Compile and Minify for Production + +```sh +bun build +``` diff --git a/frontend/bun.lockb b/frontend/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..13c20ef87d9d21d48cb4925d0df58be40a9935ff GIT binary patch literal 100452 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 literal 0 HcmV?d00001 diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..cb4caa0 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,19 @@ + + + + + + + + 动态曲谱 + + + + +
+ + + + \ No newline at end of file diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..f7141a8 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,26 @@ +{ + "name": "frontend", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "pinia": "^2.2.6", + "vant": "^4.9.9", + "vue": "^3.5.12", + "vue-router": "^4.4.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.1.4", + "vite": "^5.4.10", + "vite-plugin-vue-devtools": "^7.5.4", + "@vant/auto-import-resolver": "^1.1.0", + "less": "^4.1.3", + "unplugin-auto-import": "^0.17.5", + "unplugin-vue-components": "^0.26.0" + } +} \ No newline at end of file diff --git a/frontend/public/favicon.ico b/frontend/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..7c2aa3f --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,3 @@ + diff --git a/frontend/src/assets/base.css b/frontend/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/frontend/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/frontend/src/assets/logo.svg b/frontend/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/frontend/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/frontend/src/assets/main.css b/frontend/src/assets/main.css new file mode 100644 index 0000000..36fb845 --- /dev/null +++ b/frontend/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/frontend/src/components/WelcomeItem.vue b/frontend/src/components/WelcomeItem.vue new file mode 100644 index 0000000..ac366d0 --- /dev/null +++ b/frontend/src/components/WelcomeItem.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..e3c5caf --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,12 @@ +import { createPinia } from 'pinia' +import { createApp } from 'vue' + +import App from './App.vue' +import router from './router' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) + +app.mount('#app') diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js new file mode 100644 index 0000000..e659147 --- /dev/null +++ b/frontend/src/router/index.js @@ -0,0 +1,51 @@ +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/tabs/HomeView.vue' +import TabView from '../views/TabView.vue' + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/tab', + name: 'tab', + component: TabView, + children: [ + { + path: 'home', + name: 'tab.home', + component: HomeView, + }, + { + path: 'bought', + name: 'tab.bought', + component: () => import('../views/tabs/BoughtView.vue'), + }, + { + path: 'me', + name: 'tab.me', + // route level code-splitting + // this generates a separate chunk (About.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import('../views/tabs/MeView.vue'), + }, + ] + }, + { + path: '/play/{:id}', + name: 'play', + component: () => import('../views/PlayView.vue'), + }, + ], +}) + +router.beforeEach((to, from) => { + console.log("from", from, "goto: ", to) + + if (to.path === "/" && from.path === "/") { + console.log("redirecting to tab.home") + return { name: "tab.home" } + } + +}) + +export default router diff --git a/frontend/src/stores/counter.js b/frontend/src/stores/counter.js new file mode 100644 index 0000000..b6757ba --- /dev/null +++ b/frontend/src/stores/counter.js @@ -0,0 +1,12 @@ +import { ref, computed } from 'vue' +import { defineStore } from 'pinia' + +export const useCounterStore = defineStore('counter', () => { + const count = ref(0) + const doubleCount = computed(() => count.value * 2) + function increment() { + count.value++ + } + + return { count, doubleCount, increment } +}) diff --git a/frontend/src/views/PlayView.vue b/frontend/src/views/PlayView.vue new file mode 100644 index 0000000..ac42ff8 --- /dev/null +++ b/frontend/src/views/PlayView.vue @@ -0,0 +1,3 @@ + diff --git a/frontend/src/views/TabView.vue b/frontend/src/views/TabView.vue new file mode 100644 index 0000000..9067720 --- /dev/null +++ b/frontend/src/views/TabView.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/views/tabs/BoughtView.vue b/frontend/src/views/tabs/BoughtView.vue new file mode 100644 index 0000000..52bf2be --- /dev/null +++ b/frontend/src/views/tabs/BoughtView.vue @@ -0,0 +1,112 @@ + + + + + diff --git a/frontend/src/views/tabs/HomeView.vue b/frontend/src/views/tabs/HomeView.vue new file mode 100644 index 0000000..d88d58a --- /dev/null +++ b/frontend/src/views/tabs/HomeView.vue @@ -0,0 +1,65 @@ + + + diff --git a/frontend/src/views/tabs/MeView.vue b/frontend/src/views/tabs/MeView.vue new file mode 100644 index 0000000..3fa2807 --- /dev/null +++ b/frontend/src/views/tabs/MeView.vue @@ -0,0 +1,5 @@ + diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..07f8feb --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,27 @@ +import { VantResolver } from "@vant/auto-import-resolver"; +import vue from "@vitejs/plugin-vue"; +import { fileURLToPath, URL } from 'node:url'; +import AutoImport from "unplugin-auto-import/vite"; +import Components from "unplugin-vue-components/vite"; +import { defineConfig } from "vite"; + +import vueDevTools from 'vite-plugin-vue-devtools'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueDevTools(), + AutoImport({ + resolvers: [VantResolver()], + }), + Components({ + resolvers: [VantResolver()], + }), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/mp.code-workspace b/mp.code-workspace index b6d6553..35261dd 100644 --- a/mp.code-workspace +++ b/mp.code-workspace @@ -6,5 +6,8 @@ { "path": "backend" } - ] + ], + "settings": { + "vue3snippets.enable-compile-vue-file-on-did-save-code": true + } } \ No newline at end of file