Browse Source

创建项目

feature/home
LiLongLong 6 months ago
commit
144867a5e6
  1. 3
      .env
  2. 30
      .gitignore
  3. 31
      README.md
  4. 1
      env.d.ts
  5. 13
      index.html
  6. 4875
      package-lock.json
  7. 42
      package.json
  8. 8
      postcss.config.js
  9. BIN
      public/favicon.ico
  10. 18
      src/App.vue
  11. 1
      src/assets/add.svg
  12. 1
      src/assets/avatar.svg
  13. 31
      src/assets/base.css
  14. 1
      src/assets/container.svg
  15. 1
      src/assets/loading.svg
  16. BIN
      src/assets/logo.png
  17. 1
      src/assets/logo.svg
  18. 10
      src/assets/main.css
  19. 1
      src/assets/menuIcon/n_expe.svg
  20. 1
      src/assets/menuIcon/n_home.svg
  21. 1
      src/assets/menuIcon/n_liquid.svg
  22. 1
      src/assets/menuIcon/n_log.svg
  23. 1
      src/assets/menuIcon/s_expe.svg
  24. 1
      src/assets/menuIcon/s_home.svg
  25. 1
      src/assets/menuIcon/s_liquid.svg
  26. 1
      src/assets/menuIcon/s_log.svg
  27. 1
      src/assets/photo_icon.svg
  28. 1
      src/assets/picture.svg
  29. 1
      src/assets/return.svg
  30. BIN
      src/assets/simpleCard/logo.png
  31. BIN
      src/assets/simpleCard/remaining_time.png
  32. 46
      src/components/HelloWorld.vue
  33. 6
      src/eventBus.ts
  34. 20
      src/main.ts
  35. 55
      src/router/index.ts
  36. 58
      src/services/axios.ts
  37. 108
      src/services/socket.ts
  38. 24
      src/stores/counter.ts
  39. 0
      src/stores/index.ts
  40. 3
      src/style.css
  41. 21
      src/utils/index.ts
  42. 9
      src/views/AboutView.vue
  43. 83
      src/views/Test.vue
  44. 98
      src/views/components/Footer.vue
  45. 121
      src/views/components/Header.vue
  46. 163
      src/views/components/Liquid.vue
  47. 103
      src/views/components/Menu.vue
  48. 25
      src/views/components/menu.ts
  49. 6
      src/views/expeRecord/index.vue
  50. 187
      src/views/graphite/components/AddWaste.vue
  51. 205
      src/views/graphite/components/HeatPosition.vue
  52. 46
      src/views/graphite/components/TakePickture.vue
  53. 4
      src/views/graphite/components/index.ts
  54. 143
      src/views/graphite/index.vue
  55. 63
      src/views/home/index.vue
  56. 33
      src/views/liquidConfig/index.vue
  57. 10
      src/views/logRecord/index.vue
  58. 51
      src/views/login/index.vue
  59. 60
      src/views/login/login.css
  60. 54
      src/views/style/simpleCard.css
  61. 81
      src/views/style/simpleCardVertical.css
  62. 12
      tailwind.config.js
  63. 12
      tsconfig.app.json
  64. 11
      tsconfig.json
  65. 18
      tsconfig.node.json
  66. 20
      vite.config.ts

3
.env

@ -0,0 +1,3 @@
VITE_API_HOST=window.location.hostname
VITE_API_PORT=80
VITE_WS_PATH=/api/v1/app/ws/state

30
.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

31
README.md

@ -0,0 +1,31 @@
# A1800
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Type-Check, Compile and Minify for Production
```sh
npm run build
```
## 约定
目录:
views: 主要页面
components: 子组件
services: API接口
assets: 资源(图片)
utils: 实用工具
.env 环境变量(如IP,Port)
.env.local 本地环境变量

1
env.d.ts

@ -0,0 +1 @@
/// <reference types="vite/client" />

13
index.html

@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>石墨消解仪</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

4875
package-lock.json
File diff suppressed because it is too large
View File

42
package.json

@ -0,0 +1,42 @@
{
"name": "a1800",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --build"
},
"dependencies": {
"axios": "^1.7.9",
"dayjs": "^1.11.13",
"mitt": "^3.0.1",
"pinia": "^2.3.0",
"ramda": "^0.30.1",
"rxjs": "^7.8.1",
"vant": "^4.9.16",
"vue": "^3.5.13",
"vue-router": "^4.5.0"
},
"devDependencies": {
"@tsconfig/node22": "^22.0.0",
"@types/node": "^22.10.2",
"@types/ramda": "^0.30.2",
"@types/rx": "^4.1.4",
"@vitejs/plugin-vue": "^5.2.1",
"@vitejs/plugin-vue-jsx": "^4.1.1",
"@vue/tsconfig": "^0.7.0",
"autoprefixer": "^10.4.20",
"npm-run-all2": "^7.0.2",
"postcss": "^8.5.1",
"postcss-import": "^16.1.0",
"tailwindcss": "^3.4.17",
"typescript": "~5.6.3",
"vite": "^6.0.5",
"vite-plugin-vue-devtools": "^7.6.8",
"vue-tsc": "^2.1.10"
}
}

8
postcss.config.js

@ -0,0 +1,8 @@
export default {
plugins: {
'postcss-import': {},
'tailwindcss/nesting': {},
tailwindcss: {},
autoprefixer: {},
},
}

BIN
public/favicon.ico

18
src/App.vue

@ -0,0 +1,18 @@
<script setup lang="ts">
import Header from './views/components/Header.vue'
</script>
<template>
<div>
<router-view></router-view>
</div>
</template>
<style>
html,
body {
margin: 0;
padding: 0;
box-sizing: border-box;
}
</style>

1
src/assets/add.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="28" height="28" viewBox="0 0 28 28"><g><path d="M14.0159,0Q16.9015,0,19.4541,1.09524Q22.0068,2.19048,23.9094,4.09524Q25.812,6,26.906,8.55556Q28,11.1111,28,14Q28,16.9206,26.906,19.4603Q25.812,22,23.9094,23.9048Q22.0068,25.8095,19.4541,26.9048Q16.9015,28,14.0159,28Q11.0985,28,8.54587,26.9048Q5.99321,25.8095,4.0906,23.9048Q2.188,22,1.094,19.4603Q-3.54388e-7,16.9206,0,14Q0,11.1111,1.094,8.55556Q2.188,6,4.0906,4.09524Q5.99321,2.19048,8.54587,1.09524Q11.0985,-8.27842e-7,14.0159,0ZM22.0068,15.9365Q22.8313,15.9365,23.402,15.3492Q23.9728,14.7619,23.9728,13.9365Q23.9728,13.1111,23.402,12.5397Q22.8313,11.9683,22.0068,11.9683L16.0453,11.9683L16.0453,6Q16.0453,5.1746,15.4587,4.5873Q14.872,4,14.0476,4Q13.2231,4,12.6523,4.5873Q12.0815,5.1746,12.0815,6L12.0815,11.9683L6.12005,11.9683Q5.29559,11.9683,4.7248,12.5397Q4.15402,13.1111,4.15402,13.9365Q4.15402,14.7619,4.7248,15.3492Q5.29559,15.9365,6.12005,15.9365L12.0815,15.9365L12.0815,21.873Q12.0815,22.6984,12.6523,23.2857Q13.2231,23.873,14.0476,23.873Q14.872,23.873,15.4587,23.2857Q16.0453,22.6984,16.0453,21.873L16.0453,15.9365L22.0068,15.9365Z" fill="#000000" fill-opacity="1"/></g></svg>

1
src/assets/avatar.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="40" height="40" viewBox="0 0 40 40"><defs><clipPath id="master_svg0_609_03555/609_03497"><rect x="8" y="8" width="24" height="24" rx="0"/></clipPath></defs><g><rect x="0" y="0" width="40" height="40" rx="20" fill="#1989FA" fill-opacity="1"/><g clip-path="url(#master_svg0_609_03555/609_03497)"><g><path d="M28.120604907226564,25.896875C27.67840490722656,24.849575,27.03680490722656,23.898375,26.231504907226565,23.096075C25.428604907226564,22.291475,24.47750490722656,21.649974999999998,23.430704907226563,21.207075C23.421304907226563,21.202375,23.41200490722656,21.199975000000002,23.40260490722656,21.195275000000002C24.862704907226565,20.140625,25.812004907226562,18.422655,25.812004907226562,16.484375C25.812004907226562,13.273435,23.21040490722656,10.671875,19.99946490722656,10.671875C16.788524907226563,10.671875,14.186964907226562,13.273435,14.186964907226562,16.484375C14.186964907226562,18.422655,15.136184907226562,20.140625,16.596334907226563,21.197675C16.586964907226562,21.202375,16.577584907226562,21.204675,16.56821490722656,21.209375C15.518214907226563,21.652375,14.576024907226563,22.287475,13.767434907226562,23.098475C12.962844907226563,23.901375,12.321344907226562,24.852475,11.878369907226563,25.899175C11.443186907226563,26.924075,11.208483707226563,28.022775,11.186963515026562,29.135975C11.186337956226563,29.160975,11.190725517226563,29.185875,11.199867807226562,29.209175C11.209010107226563,29.232375,11.222722007226562,29.253675,11.240195707226562,29.271575C11.257669407226562,29.289475,11.278551207226563,29.303675,11.301610907226562,29.313375C11.324669907226562,29.323175,11.349440907226562,29.328175,11.374463907226563,29.328075C11.374463907226563,29.328075,12.780714907226562,29.328075,12.780714907226562,29.328075C12.883834907226563,29.328075,12.965864907226562,29.246075,12.968214907226562,29.145275C13.015084907226562,27.335975,13.741654907226563,25.641375,15.026024907226562,24.357075000000002C16.354934907226564,23.028174999999997,18.119774907226564,22.296875,19.99946490722656,22.296875C21.879104907226562,22.296875,23.644004907226563,23.028174999999997,24.972904907226564,24.357075000000002C26.257304907226562,25.641375,26.983804907226563,27.335975,27.030704907226564,29.145275C27.033104907226562,29.248475,27.115104907226563,29.328075,27.218204907226564,29.328075C27.218204907226564,29.328075,28.624504907226562,29.328075,28.624504907226562,29.328075C28.64950490722656,29.328175,28.674304907226563,29.323175,28.697304907226563,29.313375C28.720404907226563,29.303675,28.741304907226564,29.289475,28.758704907226562,29.271575C28.776204907226564,29.253675,28.789904907226564,29.232375,28.799104907226564,29.209175C28.808204907226564,29.185875,28.81260490722656,29.160975,28.812004907226562,29.135975C28.788504907226564,28.015675,28.55650490722656,26.925775,28.120604907226564,25.896875C28.120604907226564,25.896875,28.120604907226564,25.896875,28.120604907226564,25.896875ZM19.99946490722656,20.515625C18.923684907226562,20.515625,17.911184907226563,20.096095,17.149464907226562,19.334375C16.387744907226562,18.572655,15.968214907226564,17.560155,15.968214907226564,16.484375C15.968214907226564,15.408595,16.387744907226562,14.396094999999999,17.149464907226562,13.634375C17.911184907226563,12.872655,18.923684907226562,12.453125,19.99946490722656,12.453125C21.075244907226562,12.453125,22.087704907226563,12.872655,22.84950490722656,13.634375C23.611204907226565,14.396094999999999,24.030704907226564,15.408595,24.030704907226564,16.484375C24.030704907226564,17.560155,23.611204907226565,18.572655,22.84950490722656,19.334375C22.087704907226563,20.096095,21.075244907226562,20.515625,19.99946490722656,20.515625Z" fill="#FFFFFF" fill-opacity="1"/></g></g></g></svg>

31
src/assets/base.css

@ -0,0 +1,31 @@
*,
*::before,
*::after {
box-sizing: border-box;
margin: 0;
padding: 0;
font-weight: normal;
}
body {
min-height: 100vh;
font-family:
Inter,
-apple-system,
BlinkMacSystemFont,
'Segoe UI',
Roboto,
Oxygen,
Ubuntu,
Cantarell,
'Fira Sans',
'Droid Sans',
'Helvetica Neue',
sans-serif;
font-size: 16px;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
user-select: none;
}

1
src/assets/container.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="59" height="82.99996948242188" viewBox="0 0 59 82.99996948242188"><g><path d="M0,19.6804L0,23.3883C0,23.7034,0.253993,23.9588,0.567308,23.9588C0.880623,23.9588,1.13462,24.2142,1.13462,24.5292L1.13462,26.811C1.13462,27.126,0.880623,27.3814,0.567308,27.3814C0.253993,27.3814,0,27.6368,0,27.9519L0,33.0859C0,33.4009,0.253993,33.6563,0.567308,33.6563C0.880623,33.6563,1.13462,33.9117,1.13462,34.2268L1.13462,36.5086C1.13462,36.8236,0.880623,37.079,0.567308,37.079C0.253993,37.079,0,37.3344,0,37.6495L0,44.4948C0,44.8099,0.253993,45.0653,0.567308,45.0653C0.880623,45.0653,1.13462,45.3207,1.13462,45.6357L1.13462,47.9175C1.13462,48.2326,0.880623,48.488,0.567308,48.488C0.253993,48.488,0,48.7434,0,49.0584L0,55.9038C0,56.2188,0.253993,56.4742,0.567308,56.4742C0.880623,56.4742,1.13462,56.7296,1.13462,57.0446L1.13462,59.3264C1.13462,59.6415,0.880623,59.8969,0.567308,59.8969C0.253993,59.8969,0,60.1523,0,60.4673L0,66.7422C0,67.0573,0.253993,67.3127,0.567308,67.3127C0.880623,67.3127,1.13462,67.5681,1.13462,67.8831L1.13462,70.4501C1.13462,70.7652,0.880623,71.0206,0.567308,71.0206C0.253993,71.0206,0,71.276,0,71.591L0,75.0137C0,79.4244,3.55589,83,7.94231,83L51.0577,83C55.4441,83,59,79.4244,59,75.0137L59,71.591C59,71.276,58.746,71.0206,58.4327,71.0206C58.1194,71.0206,57.8654,70.7652,57.8654,70.4501L57.8654,67.8831C57.8654,67.5681,58.1194,67.3127,58.4327,67.3127C58.746,67.3127,59,67.0573,59,66.7422L59,60.4673C59,60.1523,58.746,59.8969,58.4327,59.8969C58.1194,59.8969,57.8654,59.6415,57.8654,59.3264L57.8654,57.0446C57.8654,56.7296,58.1194,56.4742,58.4327,56.4742C58.746,56.4742,59,56.2188,59,55.9038L59,49.0584C59,48.7434,58.746,48.488,58.4327,48.488C58.1194,48.488,57.8654,48.2326,57.8654,47.9175L57.8654,45.6357C57.8654,45.3207,58.1194,45.0653,58.4327,45.0653C58.746,45.0653,59,44.8099,59,44.4948L59,37.6495C59,37.3344,58.746,37.079,58.4327,37.079C58.1194,37.079,57.8654,36.8236,57.8654,36.5086L57.8654,34.2268C57.8654,33.9117,58.1194,33.6563,58.4327,33.6563C58.746,33.6563,59,33.4009,59,33.0859L59,27.9519C59,27.6368,58.746,27.3814,58.4327,27.3814C58.1194,27.3814,57.8654,27.126,57.8654,26.811L57.8654,24.5292C57.8654,24.2142,58.1194,23.9588,58.4327,23.9588C58.746,23.9588,59,23.7034,59,23.3883L59,19.6804C59,15.2697,55.4441,11.6942,51.0577,11.6942L49.0186,11.6942C48.2009,11.6942,47.7915,10.7001,48.3696,10.1188C50.0908,8.38809,51.0577,6.04079,51.0577,3.59325L51.0577,1.71134C51.0577,0.766193,50.2957,0,49.3558,0L9.64423,0C8.70429,0,7.94231,0.766193,7.94231,1.71134L7.94231,3.59325C7.94231,6.04079,8.90924,8.38809,10.6304,10.1188C11.2086,10.7001,10.7991,11.6942,9.98143,11.6942L7.94231,11.6942C3.55589,11.6942,0,15.2697,0,19.6804Z" fill="#FFFFFF" fill-opacity="1"/></g></svg>

1
src/assets/loading.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="52.5" height="52.5" viewBox="0 0 52.5 52.5"><g><path d="M7.32987,44.3286C6.88858,44.3286,6.4473,44.2182,6.11633,43.8869C5.4544,43.2244,5.4544,42.2306,6.11633,41.5681L11.6324,36.0469C12.2943,35.3843,13.2872,35.3843,13.9492,36.0469C14.6111,36.7094,14.6111,37.7032,13.9492,38.3658L8.43308,43.8869C8.10212,44.1078,7.77115,44.3286,7.32987,44.3286ZM18.031,51.6166C17.9207,51.6166,17.7001,51.6166,17.5898,51.5062C16.7072,51.2853,16.1556,50.402,16.3762,49.5186L18.362,41.8993C18.5827,41.0159,19.4652,40.4638,20.3478,40.6847C21.2304,40.9055,21.782,41.7889,21.5613,42.6723L19.5756,50.2915C19.4652,51.0645,18.8033,51.6166,18.031,51.6166ZM30.9387,52.5C30.1664,52.5,29.5045,52.0583,29.3942,51.2853L27.4084,43.6661C27.1877,42.7827,27.7393,41.8993,28.6219,41.6785C29.5045,41.4576,30.3871,42.0097,30.6077,42.8931L32.5935,50.5124C32.8141,51.3958,32.2625,52.2792,31.3799,52.5L30.9387,52.5ZM42.6327,46.758C42.1915,46.758,41.7502,46.6475,41.4192,46.3163L35.9031,40.7951C35.2412,40.1325,35.2412,39.1387,35.9031,38.4762C36.5651,37.8136,37.558,37.8136,38.2199,38.4762L43.736,43.9974C44.3979,44.6599,44.3979,45.6537,43.736,46.3163C43.5153,46.6475,43.074,46.758,42.6327,46.758ZM49.914,36.0469C49.8036,36.0469,49.583,36.0469,49.4727,35.9364L41.8605,33.9488C40.9779,33.728,40.4263,32.8446,40.6469,31.9612C40.8676,31.0778,41.7502,30.5257,42.6327,30.7465L50.2449,32.7341C51.1275,32.955,51.6791,33.8384,51.4585,34.7218C51.2378,35.4947,50.5759,36.0469,49.914,36.0469ZM43.1843,25.1149C42.4121,25.1149,41.7502,24.6732,41.6398,23.9002C41.4192,23.0168,41.9708,22.1335,42.8534,21.9126L50.4656,19.925C51.3481,19.7041,52.2307,20.2563,52.4513,21.1396C52.672,22.023,52.1204,22.9064,51.2378,23.1273L43.6256,25.1149L43.1843,25.1149ZM39.5437,16.9435C39.1024,16.9435,38.6612,16.8331,38.3302,16.5018C37.6683,15.8393,37.6683,14.8455,38.3302,14.1829L43.8463,8.66175C44.5082,7.99921,45.5011,7.99921,46.163,8.66175C46.825,9.3243,46.825,10.3181,46.163,10.9807L40.6469,16.5018C40.4263,16.8331,39.985,16.9435,39.5437,16.9435ZM32.2625,11.7536C32.1522,11.7536,31.9316,11.7536,31.8212,11.6432C30.9387,11.4223,30.3871,10.539,30.6077,9.65557L32.5935,2.03633C32.8141,1.15294,33.6967,0.600817,34.5793,0.821664C35.4618,1.04251,36.0134,1.9259,35.7928,2.80929L33.9173,10.539C33.6967,11.3119,33.0348,11.7536,32.2625,11.7536ZM23.4368,10.8702C22.6646,10.8702,22.0026,10.4285,21.8923,9.65557L19.9065,2.03633C19.6859,1.15294,20.2375,0.269545,21.1201,0.0486977C22.0026,-0.17215,22.8852,0.379969,23.1058,1.26336L25.0916,8.8826C25.3123,9.76599,24.7607,10.6494,23.8781,10.8702L23.4368,10.8702ZM15.273,14.5142C14.8317,14.5142,14.3904,14.4038,14.0595,14.0725L8.5434,8.55133C7.88148,7.88879,7.88148,6.89497,8.5434,6.23243C9.20533,5.56989,10.1982,5.56989,10.8602,6.23243L16.3762,11.7536C17.0382,12.4162,17.0382,13.41,16.3762,14.0725C16.1556,14.4038,15.7143,14.5142,15.273,14.5142ZM10.0879,21.8022C9.97758,21.8022,9.75694,21.8022,9.64662,21.6918L2.03444,19.7041C1.15187,19.4833,0.60026,18.5999,0.820903,17.7165C1.04155,16.8331,1.92412,16.281,2.80669,16.5018L10.4189,18.4895C11.3014,18.7103,11.853,19.5937,11.6324,20.4771C11.5221,21.2501,10.8602,21.8022,10.0879,21.8022ZM1.59315,32.6237C0.820903,32.6237,0.158973,32.182,0.0486526,31.4091C-0.17199,30.5257,0.379617,29.6423,1.26219,29.4214L8.87437,27.4338C9.75694,27.213,10.6395,27.7651,10.8602,28.6485C11.0808,29.5319,10.5292,30.4152,9.64662,30.6361L2.03444,32.6237L1.59315,32.6237Z" fill="#3E3A39" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>

BIN
src/assets/logo.png

After

Width: 192  |  Height: 40  |  Size: 2.4 KiB

1
src/assets/logo.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 261.76 226.69"><path d="M161.096.001l-30.225 52.351L100.647.001H-.005l130.877 226.688L261.749.001z" fill="#41b883"/><path d="M161.096.001l-30.225 52.351L100.647.001H52.346l78.526 136.01L209.398.001z" fill="#34495e"/></svg>

10
src/assets/main.css

@ -0,0 +1,10 @@
@import './base.css';
:root {
--globe-proportion: 0.4; /* 定义主色调 */
}
#app {
height: calc(1840px * 0.4);
width: calc(2800px * 0.4);
overflow: hidden;
background: #e9e9e9;
}

1
src/assets/menuIcon/n_expe.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#EEEFF8" fill-opacity="1"/></g><g><path d="M54.037,56.006L28.80688,56.006C27.22599,56.006,25.93399,54.6781,25.93399,53.0441C25.93399,51.6375,26.888939999999998,50.4627,28.16489,50.1565L28.16489,21.0455056C25.82164,21.380591,24,23.46143,24,25.96836L24,53.0523C24,55.7785,26.15066,58,28.79886,58L54.037,58C54.5706,58,55,57.5574,55,57.0072C55.004000000000005,56.457,54.5706,56.006,54.037,56.006ZM42.742000000000004,37.799800000000005L41.847300000000004,37.799800000000005L41.847300000000004,39.1815L40.5031,39.1815L40.5031,40.1081L41.847300000000004,40.1081L41.847300000000004,41.4898L42.742000000000004,41.4898L42.742000000000004,40.1081L44.090199999999996,40.1081L44.090199999999996,39.1815L42.742000000000004,39.1815L42.742000000000004,37.799800000000005ZM44.090199999999996,29.05031L40.5031,29.05031L40.5031,33.3775L39.2994,35.6817C39.817,35.5824,40.334599999999995,35.5617,40.852199999999996,35.6155C42.2605,35.7644,42.569500000000005,36.8814,44.4393,36.8814C44.985,36.8814,45.4384,36.8193,45.807500000000005,36.6952L44.090199999999996,33.3981L44.090199999999996,29.05031ZM53.2425,21L30.09086,21L30.09086,50.1276L30.5563,50.1276C30.612470000000002,50.1358,30.67266,50.1358,30.73284,50.1358L53.2425,50.1358C54.125299999999996,50.1358,54.8475,49.3912,54.8475,48.4811L54.8475,22.65888C54.8515,21.744634,54.125299999999996,21.000000315617,53.2425,21ZM49.3224,42.424800000000005C49.1619,42.6978,48.881,42.8674,48.5721,42.875699999999995L36.0212,42.875699999999995C35.7042,42.875699999999995,35.4113,42.7061,35.2508,42.424800000000005C35.0903,42.1435,35.082300000000004,41.8001,35.2348,41.5105L39.5963,33.2161L39.5963,29.05031L38.5089,29.05031C38.2521,29.05031,38.0475,28.8352,38.0475,28.57457C38.0475,28.309820000000002,38.2561,28.09884,38.5089,28.09884L46.0643,28.09884C46.3211,28.09884,46.5257,28.31395,46.5257,28.57457C46.5257,28.83933,46.317099999999996,29.05031,46.0643,29.05031L44.9769,29.05031L44.9769,33.2203L46.561800000000005,36.231899999999996L49.3425,41.5105C49.490899999999996,41.8001,49.4869,42.1434,49.3224,42.424800000000005Z" fill="#4F85FB" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>

1
src/assets/menuIcon/n_home.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#EEEFF8" fill-opacity="1"/></g><g><path d="M20.0370799,43.6256C20.866486,47.6246,22.91091,51.222300000000004,25.94731,54.0277C26.3526,54.4028,26.9106,54.5752,27.46181,54.4956C28.0134,54.4165,28.49784,54.0943,28.77694,53.6208L31.1482,49.591300000000004C31.5442,48.9178,31.451999999999998,48.070499999999996,30.92,47.4942C29.68039,46.1482,28.77662,44.537800000000004,28.28009,42.7903C28.06083,42.015,27.34183,41.4784,26.52231,41.4784L21.82395,41.4784C21.27636,41.4781,20.757754,41.7198,20.411853,42.1363C20.0647341,42.552,19.9270634,43.0991,20.0370799,43.6256ZM44.1657,51.909C43.7696,51.233000000000004,42.9726,50.8869,42.1963,51.053799999999995C40.231899999999996,51.4761,38.1899,51.3965,36.2658,50.8227C35.453900000000004,50.580600000000004,34.579,50.9191,34.1541,51.6398L31.8262,55.5982C31.5578,56.055,31.5084,56.6046,31.691000000000003,57.1004C31.872999999999998,57.5967,32.2697,57.9884,32.7742,58.1703C34.9795,58.9695,37.3089,59.375,39.695,59.375C41.6678,59.375,43.6156,59.0954,45.482600000000005,58.543C46.0156,58.3847,46.446,57.9968,46.652,57.4891C46.8572,56.9806,46.814099999999996,56.408,46.535,55.9346L44.1657,51.909ZM52.5476,24.57127C52.2201,24.3027,51.806799999999996,24.15552,51.379999999999995,24.15542C51.2742,24.15542,51.1663,24.166330000000002,51.060500000000005,24.18424C50.531,24.2771,50.0703,24.59457,49.8016,25.05176L47.4685,29.01324C47.045100000000005,29.73472,47.183499999999995,30.6473,47.802800000000005,31.2165C49.39,32.6707,50.5347,34.5286,51.1096,36.5833C51.3275,37.3604,52.0476,37.8989,52.8691,37.899100000000004L57.568,37.899100000000004C58.1145,37.8988,58.6321,37.658,58.9784,37.2432C59.3258,36.8281,59.464,36.2815,59.3546,35.7553C58.4579,31.3953,56.0407,27.42316,52.5476,24.57127ZM46.652,21.88784C46.446600000000004,21.37975,46.0159,20.99153,45.482600000000005,20.833661C43.6053,20.279568,41.6553,19.99869145,39.695,20.00000417001C37.3089,20.00000417001,34.9795,20.405219,32.7742,21.20446C31.714199999999998,21.58978,31.262,22.8179,31.8262,23.77903L34.1541,27.73687C34.579,28.457549999999998,35.453900000000004,28.79609,36.2658,28.55402C37.3775,28.22171,38.5332,28.05317,39.6953,28.05394C40.530100000000004,28.05394,41.372299999999996,28.14349,42.1963,28.32119C42.9721,28.48767,43.7685,28.14262,44.1657,27.46794L46.5353,23.44182C46.8143,22.96858,46.857299999999995,22.39608,46.652,21.88784ZM57.568,41.4781L52.8691,41.4781C52.0475,41.477599999999995,51.327,42.0163,51.1096,42.7936C50.5345,44.848299999999995,49.3898,46.7063,47.802800000000005,48.160799999999995C47.1834,48.729,47.0449,49.6411,47.4685,50.3618L49.8016,54.3249C50.07,54.7824,50.5309,55.1001,51.060500000000005,55.1927C51.1663,55.2106,51.2742,55.2196,51.379999999999995,55.2196C51.8066,55.2202,52.2199,55.0737,52.5476,54.8057C56.0407,51.9518,58.4579,47.9814,59.3546,43.622C59.4641,43.0957,59.3259,42.549099999999996,58.9784,42.134C58.6326,41.718599999999995,58.1147,41.4778,57.568,41.4781ZM20.411568,37.241C20.757316,37.6573,21.27588,37.8989,21.82367,37.8989L26.52259,37.8989C27.34233,37.8986,28.06128,37.361999999999995,28.280369999999998,36.587C28.776699999999998,34.8389,29.68048,33.2279,30.920299999999997,31.8814C31.4524,31.3057,31.544600000000003,30.4588,31.1485,29.785890000000002L28.77722,25.75641C28.49772,25.28303,28.01361,24.96039,27.46209,24.87994C27.37433,24.86765,27.28578,24.86166,27.19713,24.86203C26.73679,24.86203,26.28729,25.03413,25.9476,25.349510000000002C22.91091,28.15468,20.866486,31.7521,20.0370799,35.7513C19.9271883,36.2779,20.0647273,36.825,20.411568,37.241Z" fill="#4F85FB" fill-opacity="1"/></g></g></svg>

1
src/assets/menuIcon/n_liquid.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#EEEFF8" fill-opacity="1"/></g><g><path d="M30.42768,34.2143L30.42768,52.673C30.42768,53.4027,31.06121,54.0357,31.77429,54.0357L48.5584,54.0357C49.2714,54.0357,49.794,53.4027,49.794,52.673L49.794,34.2143L30.42768,34.2143ZM47.8574,46.726600000000005C47.8574,47.091499999999996,47.5684,47.387299999999996,47.2118,47.387299999999996C46.8553,47.387299999999996,46.5663,47.091499999999996,46.5663,46.726600000000005L46.5663,42.762299999999996C46.5663,42.397400000000005,46.8553,42.101600000000005,47.2118,42.101600000000005C47.5684,42.101600000000005,47.8574,42.397400000000005,47.8574,42.762299999999996L47.8574,46.726600000000005ZM47.2673,40.780100000000004C46.910799999999995,40.780100000000004,46.6218,40.4844,46.6218,40.1194C46.6218,39.7545,46.910799999999995,39.4587,47.2673,39.4587C47.6239,39.4587,47.9129,39.7545,47.9129,40.1194C47.9129,40.484300000000005,47.6239,40.780100000000004,47.2673,40.780100000000004ZM54.7629,21L29.21229,21C24.827023,21,24,23.26509,24,24.28292C26.44097,24.63393,26.55442,24.67522,26.55442,27.318080000000002L26.55442,52.673C26.55442,55.5922,28.92203,58,31.77429,58L48.5383,58C51.3904,58,53.6673,55.5922,53.6673,52.673L53.6673,24.96429C53.6673,23.28368,54.6596,21.803098,54.7579,21.6456C54.856300000000005,21.488186,55,21.331926,55,21.236123C55,21.139411,54.9664,21,54.7629,21ZM51.0851,24.96429L51.0851,52.673C51.0851,54.153,50.081,55.3571,48.679500000000004,55.3571L31.77429,55.3571C30.352719999999998,55.3571,29.136589999999998,54.128,29.136589999999998,52.673L29.136589999999998,27.318080000000002C29.136589999999998,26.34254,29.22487,24.24163,28.8277,23.6877C28.90202,23.62221,29.07898,23.64286,29.19211,23.64286L51.1939,23.64286C51.1345,23.64286,51.0851,24.53474,51.0851,24.96429Z" fill="#4F85FB" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>

1
src/assets/menuIcon/n_log.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#EEEFF8" fill-opacity="1"/></g><g><path d="M32,30.00793C32.8,30.00793,33.5,29.30731,33.5,28.506610000000002L33.5,22.50132C33.5,21.700617,32.8,21,32,21C31.2,21,30.5,21.700617,30.5,22.50132L30.5,28.506610000000002C30.5,29.30731,31.2,30.00793,32,30.00793ZM45,30.00793C45.8,30.00793,46.5,29.30731,46.5,28.506610000000002L46.5,22.50132C46.5,21.700617,45.8,21,45,21C44.2,21,43.5,21.700617,43.5,22.50132L43.5,28.506610000000002C43.5,29.30731,44.2,30.00793,45,30.00793ZM40,50.0255C40,45.1212,43,40.8174,47.2,39.0159L28.5,39.0159C27.7,39.0159,27,38.315200000000004,27,37.5145C27,36.7138,27.7,36.0132,28.5,36.0132L47.5,36.0132C48.3,36.0132,49,36.7138,49,37.5145C49,37.9149,48.8,38.215199999999996,48.6,38.5154C49.7,38.215199999999996,50.8,38.015,52,38.015C52.3,38.015,52.7,38.015,53,38.1151L53,29.00705C53,26.80511,51.2,25.00352,49,25.00352L49,28.506610000000002C49,31.0088,47,33.0106,44.5,33.0106C42,33.0106,40,31.0088,40,28.506610000000002L40,25.00352L36,25.00352L36,28.506610000000002C36,31.0088,34,33.0106,31.5,33.0106C29,33.0106,27,31.0088,27,28.506610000000002L27,25.00352C24.8,25.00352,23,26.80511,23,29.00705L23,55.03C23,57.2319,24.8,59.0335,27,59.0335L44.1,59.0335C41.6,56.8315,40,53.6287,40,50.0255ZM37.5,51.026399999999995L28.5,51.026399999999995C27.7,51.026399999999995,27,50.3258,27,49.525099999999995C27,48.7244,27.7,48.0238,28.5,48.0238L37.5,48.0238C38.3,48.0238,39,48.7244,39,49.525099999999995C39,50.3258,38.3,51.026399999999995,37.5,51.026399999999995ZM37.5,45.021100000000004L28.5,45.021100000000004C27.7,45.021100000000004,27,44.320499999999996,27,43.519800000000004C27,42.7191,27.7,42.0185,28.5,42.0185L37.5,42.0185C38.3,42.0185,39,42.7191,39,43.519800000000004C39,44.320499999999996,38.3,45.021100000000004,37.5,45.021100000000004ZM52,41.0176C47,41.0176,43,45.1212,43,50.0255C43,54.9299,47.1,59.0335,52,59.0335C56.9,59.0335,61,54.9299,61,50.0255C61,45.1212,57,41.0176,52,41.0176ZM55.5,53.0282L50.5,53.0282C49.7,53.0282,49,52.327600000000004,49,51.5269L49,45.5216C49,44.7209,49.7,44.0203,50.5,44.0203C51.3,44.0203,52,44.7209,52,45.5216L52,50.0255L55.5,50.0255C56.3,50.0255,57,50.7262,57,51.5269C57,52.327600000000004,56.3,53.0282,55.5,53.0282Z" fill="#4F85FB" fill-opacity="1"/></g></g></svg>

1
src/assets/menuIcon/s_expe.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#479CF1" fill-opacity="1"/></g><g><path d="M54.037,56.006L28.80688,56.006C27.22599,56.006,25.93399,54.6781,25.93399,53.0441C25.93399,51.6375,26.888939999999998,50.4627,28.16489,50.1565L28.16489,21.0455056C25.82164,21.380591,24,23.46143,24,25.96836L24,53.0523C24,55.7785,26.15066,58,28.79886,58L54.037,58C54.5706,58,55,57.5574,55,57.0072C55.004000000000005,56.457,54.5706,56.006,54.037,56.006ZM42.742000000000004,37.799800000000005L41.847300000000004,37.799800000000005L41.847300000000004,39.1815L40.5031,39.1815L40.5031,40.1081L41.847300000000004,40.1081L41.847300000000004,41.4898L42.742000000000004,41.4898L42.742000000000004,40.1081L44.090199999999996,40.1081L44.090199999999996,39.1815L42.742000000000004,39.1815L42.742000000000004,37.799800000000005ZM44.090199999999996,29.05031L40.5031,29.05031L40.5031,33.3775L39.2994,35.6817C39.817,35.5824,40.334599999999995,35.5617,40.852199999999996,35.6155C42.2605,35.7644,42.569500000000005,36.8814,44.4393,36.8814C44.985,36.8814,45.4384,36.8193,45.807500000000005,36.6952L44.090199999999996,33.3981L44.090199999999996,29.05031ZM53.2425,21L30.09086,21L30.09086,50.1276L30.5563,50.1276C30.612470000000002,50.1358,30.67266,50.1358,30.73284,50.1358L53.2425,50.1358C54.125299999999996,50.1358,54.8475,49.3912,54.8475,48.4811L54.8475,22.65888C54.8515,21.744634,54.125299999999996,21.000000315617,53.2425,21ZM49.3224,42.424800000000005C49.1619,42.6978,48.881,42.8674,48.5721,42.875699999999995L36.0212,42.875699999999995C35.7042,42.875699999999995,35.4113,42.7061,35.2508,42.424800000000005C35.0903,42.1435,35.082300000000004,41.8001,35.2348,41.5105L39.5963,33.2161L39.5963,29.05031L38.5089,29.05031C38.2521,29.05031,38.0475,28.8352,38.0475,28.57457C38.0475,28.309820000000002,38.2561,28.09884,38.5089,28.09884L46.0643,28.09884C46.3211,28.09884,46.5257,28.31395,46.5257,28.57457C46.5257,28.83933,46.317099999999996,29.05031,46.0643,29.05031L44.9769,29.05031L44.9769,33.2203L46.561800000000005,36.231899999999996L49.3425,41.5105C49.490899999999996,41.8001,49.4869,42.1434,49.3224,42.424800000000005Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>

1
src/assets/menuIcon/s_home.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#479CF1" fill-opacity="1"/></g><g><path d="M20.0370799,43.6256C20.866486,47.6246,22.91091,51.222300000000004,25.94731,54.0277C26.3526,54.4028,26.9106,54.5752,27.46181,54.4956C28.0134,54.4165,28.49784,54.0943,28.77694,53.6208L31.1482,49.591300000000004C31.5442,48.9178,31.451999999999998,48.070499999999996,30.92,47.4942C29.68039,46.1482,28.77662,44.537800000000004,28.28009,42.7903C28.06083,42.015,27.34183,41.4784,26.52231,41.4784L21.82395,41.4784C21.27636,41.4781,20.757754,41.7198,20.411853,42.1363C20.0647341,42.552,19.9270634,43.0991,20.0370799,43.6256ZM44.1657,51.909C43.7696,51.233000000000004,42.9726,50.8869,42.1963,51.053799999999995C40.231899999999996,51.4761,38.1899,51.3965,36.2658,50.8227C35.453900000000004,50.580600000000004,34.579,50.9191,34.1541,51.6398L31.8262,55.5982C31.5578,56.055,31.5084,56.6046,31.691000000000003,57.1004C31.872999999999998,57.5967,32.2697,57.9884,32.7742,58.1703C34.9795,58.9695,37.3089,59.375,39.695,59.375C41.6678,59.375,43.6156,59.0954,45.482600000000005,58.543C46.0156,58.3847,46.446,57.9968,46.652,57.4891C46.8572,56.9806,46.814099999999996,56.408,46.535,55.9346L44.1657,51.909ZM52.5476,24.57127C52.2201,24.3027,51.806799999999996,24.15552,51.379999999999995,24.15542C51.2742,24.15542,51.1663,24.166330000000002,51.060500000000005,24.18424C50.531,24.2771,50.0703,24.59457,49.8016,25.05176L47.4685,29.01324C47.045100000000005,29.73472,47.183499999999995,30.6473,47.802800000000005,31.2165C49.39,32.6707,50.5347,34.5286,51.1096,36.5833C51.3275,37.3604,52.0476,37.8989,52.8691,37.899100000000004L57.568,37.899100000000004C58.1145,37.8988,58.6321,37.658,58.9784,37.2432C59.3258,36.8281,59.464,36.2815,59.3546,35.7553C58.4579,31.3953,56.0407,27.42316,52.5476,24.57127ZM46.652,21.88784C46.446600000000004,21.37975,46.0159,20.99153,45.482600000000005,20.833661C43.6053,20.279568,41.6553,19.99869145,39.695,20.00000417001C37.3089,20.00000417001,34.9795,20.405219,32.7742,21.20446C31.714199999999998,21.58978,31.262,22.8179,31.8262,23.77903L34.1541,27.73687C34.579,28.457549999999998,35.453900000000004,28.79609,36.2658,28.55402C37.3775,28.22171,38.5332,28.05317,39.6953,28.05394C40.530100000000004,28.05394,41.372299999999996,28.14349,42.1963,28.32119C42.9721,28.48767,43.7685,28.14262,44.1657,27.46794L46.5353,23.44182C46.8143,22.96858,46.857299999999995,22.39608,46.652,21.88784ZM57.568,41.4781L52.8691,41.4781C52.0475,41.477599999999995,51.327,42.0163,51.1096,42.7936C50.5345,44.848299999999995,49.3898,46.7063,47.802800000000005,48.160799999999995C47.1834,48.729,47.0449,49.6411,47.4685,50.3618L49.8016,54.3249C50.07,54.7824,50.5309,55.1001,51.060500000000005,55.1927C51.1663,55.2106,51.2742,55.2196,51.379999999999995,55.2196C51.8066,55.2202,52.2199,55.0737,52.5476,54.8057C56.0407,51.9518,58.4579,47.9814,59.3546,43.622C59.4641,43.0957,59.3259,42.549099999999996,58.9784,42.134C58.6326,41.718599999999995,58.1147,41.4778,57.568,41.4781ZM20.411568,37.241C20.757316,37.6573,21.27588,37.8989,21.82367,37.8989L26.52259,37.8989C27.34233,37.8986,28.06128,37.361999999999995,28.280369999999998,36.587C28.776699999999998,34.8389,29.68048,33.2279,30.920299999999997,31.8814C31.4524,31.3057,31.544600000000003,30.4588,31.1485,29.785890000000002L28.77722,25.75641C28.49772,25.28303,28.01361,24.96039,27.46209,24.87994C27.37433,24.86765,27.28578,24.86166,27.19713,24.86203C26.73679,24.86203,26.28729,25.03413,25.9476,25.349510000000002C22.91091,28.15468,20.866486,31.7521,20.0370799,35.7513C19.9271883,36.2779,20.0647273,36.825,20.411568,37.241Z" fill="#FFFFFF" fill-opacity="1"/></g></g></svg>

1
src/assets/menuIcon/s_liquid.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#479CF1" fill-opacity="1"/></g><g><path d="M30.42768,34.2143L30.42768,52.673C30.42768,53.4027,31.06121,54.0357,31.77429,54.0357L48.5584,54.0357C49.2714,54.0357,49.794,53.4027,49.794,52.673L49.794,34.2143L30.42768,34.2143ZM47.8574,46.726600000000005C47.8574,47.091499999999996,47.5684,47.387299999999996,47.2118,47.387299999999996C46.8553,47.387299999999996,46.5663,47.091499999999996,46.5663,46.726600000000005L46.5663,42.762299999999996C46.5663,42.397400000000005,46.8553,42.101600000000005,47.2118,42.101600000000005C47.5684,42.101600000000005,47.8574,42.397400000000005,47.8574,42.762299999999996L47.8574,46.726600000000005ZM47.2673,40.780100000000004C46.910799999999995,40.780100000000004,46.6218,40.4844,46.6218,40.1194C46.6218,39.7545,46.910799999999995,39.4587,47.2673,39.4587C47.6239,39.4587,47.9129,39.7545,47.9129,40.1194C47.9129,40.484300000000005,47.6239,40.780100000000004,47.2673,40.780100000000004ZM54.7629,21L29.21229,21C24.827023,21,24,23.26509,24,24.28292C26.44097,24.63393,26.55442,24.67522,26.55442,27.318080000000002L26.55442,52.673C26.55442,55.5922,28.92203,58,31.77429,58L48.5383,58C51.3904,58,53.6673,55.5922,53.6673,52.673L53.6673,24.96429C53.6673,23.28368,54.6596,21.803098,54.7579,21.6456C54.856300000000005,21.488186,55,21.331926,55,21.236123C55,21.139411,54.9664,21,54.7629,21ZM51.0851,24.96429L51.0851,52.673C51.0851,54.153,50.081,55.3571,48.679500000000004,55.3571L31.77429,55.3571C30.352719999999998,55.3571,29.136589999999998,54.128,29.136589999999998,52.673L29.136589999999998,27.318080000000002C29.136589999999998,26.34254,29.22487,24.24163,28.8277,23.6877C28.90202,23.62221,29.07898,23.64286,29.19211,23.64286L51.1939,23.64286C51.1345,23.64286,51.0851,24.53474,51.0851,24.96429Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></svg>

1
src/assets/menuIcon/s_log.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="80" height="80" viewBox="0 0 80 80"><g><g><ellipse cx="40" cy="40" rx="40" ry="40" fill="#479CF1" fill-opacity="1"/></g><g><path d="M32,30.00793C32.8,30.00793,33.5,29.30731,33.5,28.506610000000002L33.5,22.50132C33.5,21.700617,32.8,21,32,21C31.2,21,30.5,21.700617,30.5,22.50132L30.5,28.506610000000002C30.5,29.30731,31.2,30.00793,32,30.00793ZM45,30.00793C45.8,30.00793,46.5,29.30731,46.5,28.506610000000002L46.5,22.50132C46.5,21.700617,45.8,21,45,21C44.2,21,43.5,21.700617,43.5,22.50132L43.5,28.506610000000002C43.5,29.30731,44.2,30.00793,45,30.00793ZM40,50.0255C40,45.1212,43,40.8174,47.2,39.0159L28.5,39.0159C27.7,39.0159,27,38.315200000000004,27,37.5145C27,36.7138,27.7,36.0132,28.5,36.0132L47.5,36.0132C48.3,36.0132,49,36.7138,49,37.5145C49,37.9149,48.8,38.215199999999996,48.6,38.5154C49.7,38.215199999999996,50.8,38.015,52,38.015C52.3,38.015,52.7,38.015,53,38.1151L53,29.00705C53,26.80511,51.2,25.00352,49,25.00352L49,28.506610000000002C49,31.0088,47,33.0106,44.5,33.0106C42,33.0106,40,31.0088,40,28.506610000000002L40,25.00352L36,25.00352L36,28.506610000000002C36,31.0088,34,33.0106,31.5,33.0106C29,33.0106,27,31.0088,27,28.506610000000002L27,25.00352C24.8,25.00352,23,26.80511,23,29.00705L23,55.03C23,57.2319,24.8,59.0335,27,59.0335L44.1,59.0335C41.6,56.8315,40,53.6287,40,50.0255ZM37.5,51.026399999999995L28.5,51.026399999999995C27.7,51.026399999999995,27,50.3258,27,49.525099999999995C27,48.7244,27.7,48.0238,28.5,48.0238L37.5,48.0238C38.3,48.0238,39,48.7244,39,49.525099999999995C39,50.3258,38.3,51.026399999999995,37.5,51.026399999999995ZM37.5,45.021100000000004L28.5,45.021100000000004C27.7,45.021100000000004,27,44.320499999999996,27,43.519800000000004C27,42.7191,27.7,42.0185,28.5,42.0185L37.5,42.0185C38.3,42.0185,39,42.7191,39,43.519800000000004C39,44.320499999999996,38.3,45.021100000000004,37.5,45.021100000000004ZM52,41.0176C47,41.0176,43,45.1212,43,50.0255C43,54.9299,47.1,59.0335,52,59.0335C56.9,59.0335,61,54.9299,61,50.0255C61,45.1212,57,41.0176,52,41.0176ZM55.5,53.0282L50.5,53.0282C49.7,53.0282,49,52.327600000000004,49,51.5269L49,45.5216C49,44.7209,49.7,44.0203,50.5,44.0203C51.3,44.0203,52,44.7209,52,45.5216L52,50.0255L55.5,50.0255C56.3,50.0255,57,50.7262,57,51.5269C57,52.327600000000004,56.3,53.0282,55.5,53.0282Z" fill="#FFFFFF" fill-opacity="1"/></g></g></svg>

1
src/assets/photo_icon.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="51" height="38" viewBox="0 0 51 38"><g><path d="M34.3172,23.1571Q34.3172,24.7195,33.7294,26.0866Q33.1416,27.4537,32.1339,28.4582Q31.1262,29.4626,29.7827,30.0485Q28.4391,30.6344,26.8716,30.6344Q25.3041,30.6344,23.9605,30.0485Q22.6169,29.4626,21.6092,28.4582Q20.6015,27.4537,20.0137,26.0866Q19.4259,24.7195,19.4259,23.1571Q19.4259,21.6505,20.0137,20.2834Q20.6015,18.9163,21.6092,17.9119Q22.6169,16.9075,23.9605,16.3216Q25.3041,15.7357,26.8716,15.7357Q28.4391,15.7357,29.7827,16.3216Q31.1262,16.9075,32.1339,17.9119Q33.1416,18.9163,33.7294,20.2834Q34.3172,21.6505,34.3172,23.1571ZM6.60593,38Q5.03842,38,3.80681,37.721Q2.57519,37.442,1.73546,36.7724Q0.895719,36.1028,0.44786,34.9589Q0,33.815,0,32.0852L0,13.2247Q0,10.0999,1.48353,8.87225Q2.96707,7.64464,6.15807,7.64464L15.5631,7.64464Q16.4588,7.64464,17.0467,7.30984Q17.6345,6.97504,17.9984,6.41703Q18.3622,5.85903,18.6422,5.10573Q18.9221,4.35242,19.258,3.57122Q19.8178,2.12041,21.2173,1.06021Q22.6169,0,24.4083,0L29.6147,0Q31.6861,0,33.0017,1.14391Q34.3172,2.28781,34.7651,3.57122Q35.3809,5.24523,36.3886,6.44493Q37.3963,7.64464,38.5159,7.64464L45.6257,7.64464Q48.0889,7.58884,49.5445,8.98385Q51,10.3789,51,13.0573L51,32.1968Q51,35.0426,49.4885,36.5213Q47.9769,38,45.4577,38L6.60593,38ZM26.7596,11.4949Q24.2964,11.4949,22.169,12.4156Q20.0417,13.3363,18.4742,14.9266Q16.9067,16.5169,15.983,18.6373Q15.0593,20.7577,15.0593,23.1571Q15.0593,25.6123,15.983,27.7327Q16.9067,29.8532,18.4742,31.4156Q20.0417,32.978,22.169,33.8987Q24.2964,34.8194,26.7596,34.8194Q29.1669,34.8194,31.2942,33.8987Q33.4215,32.978,34.989,31.4156Q36.5565,29.8532,37.4802,27.7327Q38.404,25.6123,38.404,23.1571Q38.404,20.7577,37.4802,18.6373Q36.5565,16.5169,34.989,14.9266Q33.4215,13.3363,31.2942,12.4156Q29.1669,11.4949,26.7596,11.4949ZM30.6784,5.46843Q30.6784,4.57563,30.5944,4.07342Q30.5104,3.57122,29.4468,3.57122L24.8002,3.57122Q23.7366,3.51542,23.6526,4.01762Q23.5686,4.51983,23.5686,5.46843Q23.5126,6.52864,23.6806,6.97504Q23.8485,7.42144,24.8002,7.42144L29.4468,7.42144Q30.5104,7.42144,30.5944,6.91924Q30.6784,6.41704,30.6784,5.46843Z" fill="#FFFFFF" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>

1
src/assets/picture.svg
File diff suppressed because it is too large
View File

1
src/assets/return.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="7.811767578125" height="13.949738502502441" viewBox="0 0 7.811767578125 13.949738502502441"><g><path d="M6.97503,13.9497C6.76072,13.9497,6.54649,13.8682,6.38292,13.7048L0.245222,7.56707C-0.0817409,7.24061,-0.0817409,6.71049,0.245222,6.38352L6.38292,0.245222C6.70997,-0.0817406,7.2395,-0.0817406,7.56655,0.245222C7.89351,0.571688,7.89351,1.10181,7.56655,1.42877L2.02088,6.97506L7.56655,12.5206C7.89351,12.8477,7.89351,13.3772,7.56655,13.7043C7.40358,13.8682,7.18925,13.9497,6.97503,13.9497Z" fill="#34495E" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></svg>

BIN
src/assets/simpleCard/logo.png

After

Width: 192  |  Height: 40  |  Size: 2.4 KiB

BIN
src/assets/simpleCard/remaining_time.png

After

Width: 15  |  Height: 15  |  Size: 435 B

46
src/components/HelloWorld.vue

@ -0,0 +1,46 @@
<script setup lang="ts">
import { ref } from "vue";
import { showToast } from "vant";
defineProps<{
msg: string;
}>();
const value = ref<number>(50);
const onChange = (value: number) => showToast("当前值:" + value);
</script>
<template>
<div class="greetings">
<h1 class="green">{{ msg }}</h1>
<h3>
Youve successfully created a project with
<a href="https://vite.dev/" target="_blank" rel="noopener">Vite</a> +
<a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>. What's next?
</h3>
<span class="text-lg font-medium">{{ value }}</span>
<van-slider class="my-8" :step="0.5" v-model="value" @change="onChange" />
</div>
</template>
<style scoped>
.greetings {
--van-slider-bar-height: 6px;
--van-slider-button-width: 32px;
--van-slider-button-height: 32px;
}
h1 {
font-weight: 500;
font-size: 2.6rem;
position: relative;
top: -10px;
}
h3 {
font-size: 1.2rem;
}
.greetings h1,
.greetings h3 {
text-align: center;
}
</style>

6
src/eventBus.ts

@ -0,0 +1,6 @@
import mitt from 'mitt'
type Events = {
menuId: number,
}
export const eventBus = mitt<Events>()

20
src/main.ts

@ -0,0 +1,20 @@
import "./style.css";
import "./assets/main.css";
import { createApp } from "vue";
import { createPinia } from "pinia";
import Vant from "vant";
import App from "./App.vue";
import router from "./router";
import "vant/lib/index.css";
const app = createApp(App);
app.use(createPinia());
app.use(router);
app.use(Vant);
app.mount("#app");
console.log("API HOST:", import.meta.env.VITE_API_HOST);
console.log("API PORT:", import.meta.env.VITE_API_PORT);

55
src/router/index.ts

@ -0,0 +1,55 @@
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'login',
//@ts-ignore
component: () => import('../views/login/index.vue'),
},
{
path: '/test',
name: 'test',
component: () => import('../views/Test.vue'),
},
{
path: '/home',
name: 'home',
// 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/home/index.vue'),
children:[
{
path: '/graphite',
name: 'graphite',
component: () => import('../views/graphite/index.vue'),
},
{
path: '/logRecords',
name: 'logRecords',
component: () => import('../views/logRecord/index.vue'),
},
{
path: '/expeRecords',
name: 'expeRecords',
component: () => import('../views/expeRecord/index.vue'),
},
{
path: '/liquidConfig',
name: 'liquidConfig',
component: () => import('../views/liquidConfig/index.vue'),
},
]
},
],
})
export default router

58
src/services/axios.ts

@ -0,0 +1,58 @@
import axios from "axios";
const url = `${window.location.protocol}://${import.meta.env.VITE_API_HOST}:${import.meta.env.VITE_API_PORT}`;
const apiClient = axios.create({
baseURL: url, // 设置请求的根路径
timeout: 60000,
headers: {
"Content-Type": "application/json",
},
});
// 请求拦截器
// apiClient.interceptors.request.use(
// (config) => {
// const token = sessionStorage.getItem("token");
// if (!config.headers) {
// config.headers = AxiosHeaders.from({}); // 确保 config.headers 是 AxiosHeaders 类型
// }
// if (token) {
// config.headers.set("Authorization", `Bearer ${encodeURIComponent(token)}`); // 使用 set 方法设置 Authorization
// }
// return config;
// },
// error => {
// return Promise.reject(error);
// }
// );
// 响应拦截器
apiClient.interceptors.response.use(
(response) => {
if (response.data && response.data.dataType === "ZAppPromopt") {
if (response.data.ecode === "USR_NOT_EXIT") {
return Promise.resolve(response.data);
} else if (response.data.ecode === "USR_PASSWORD_ERROR") {
return Promise.resolve(response.data);
} else {
console.log("接口出错", response.data);
// eventBus.emit("show-error-modal", response.data.data);
return Promise.reject(response.data);
}
}
return response;
},
error => {
// eventBus.emit("show-error-modal", {
// messageLevel: "Error",
// title: "网络请求失败",
// info: error.message,
// });
return Promise.reject(error);
}
);
export default apiClient;

108
src/services/socket.ts

@ -0,0 +1,108 @@
import { Subject } from "rxjs";
export type SocketState = 'open' | 'close' | 'error'
class WebSocketClient {
private ws: WebSocket | null = null;
private url: string;
private reconnectAttempts: number = -1;
private maxReconnectAttempts: number = 5;
private reconnectInterval: number = 3000;
readonly dataOb = new Subject()
readonly stateOb = new Subject<SocketState>()
constructor(url: string) {
this.url = url;
}
// 连接 WebSocket
connect(): void {
try {
// WebSocket.CONNECTING (0) WebSocket.OPEN (1)
if (this.ws && this.ws.readyState <= 1) {
// 已连接
console.log(`${this.url} 正在连接或已连接,无需重复连接`);
} else {
this.ws = new WebSocket(this.url);
this.bindEvents();
}
} catch (error) {
console.error("WebSocket 连接失败:", error);
this.reconnect();
}
}
// 绑定事件
private bindEvents(): void {
if (!this.ws) return;
// 连接建立时的处理
this.ws.onopen = () => {
console.log("WebSocket 连接已建立");
this.reconnectAttempts = -1; // 重置重连次数
this.stateOb.next('open')
};
// 接收消息的处理
this.ws.onmessage = (event: MessageEvent) => {
try {
const data = JSON.parse(event.data);
// console.log('🚀 ~ WebSocketClient ~ bindEvents ~ data:', data)
this.dataOb.next(data)
} catch (error) {
console.error("消息解析错误:", error);
}
};
this.ws.onclose = () => {
this.stateOb.next('close')
console.log("WebSocket 连接已关闭");
this.reconnect();
};
this.ws.onerror = error => {
this.stateOb.next('error')
console.error("WebSocket 错误:", error);
};
}
// 重连机制
private reconnect(): void {
if (this.reconnectAttempts === -1) {
this.reconnectAttempts = 0;
}
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
console.log("达到最大重连次数,停止重连");
this.reconnectAttempts = -1;
return;
}
setTimeout(() => {
console.log(`尝试第 ${this.reconnectAttempts + 1} 次重连...`);
this.reconnectAttempts++;
this.connect();
}, this.reconnectInterval);
}
// 关闭连接
disconnect(): void {
if (this.ws) {
this.ws.close();
this.ws = null;
}
}
}
const urlSocketMap = new Map<string, WebSocketClient>();
// 导出 WebSocket 客户端
export const createWebSocket = (url: string): WebSocketClient => {
if (urlSocketMap.has(url)) {
return urlSocketMap.get(url)!;
} else {
const client = new WebSocketClient(url);
urlSocketMap.set(url, client);
return client;
}
};

24
src/stores/counter.ts

@ -0,0 +1,24 @@
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 }
})
export const useMenuStore = defineStore('menu', ()=>{
const menuId = ref(0)
const setMenuId = (id:number)=> {
menuId.value = id
}
return {
menuId,
setMenuId
}
})

0
src/stores/index.ts

3
src/style.css

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

21
src/utils/index.ts

@ -0,0 +1,21 @@
export function isValidIPv4(ip: string) {
const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
return ipv4Regex.test(ip);
}
export function formatRemainTime(seconds: number) {
const min = Math.floor(seconds / 60).toFixed();
const sec = (seconds % 60).toFixed();
return min.padStart(2, "0") + ":" + sec.padStart(2, "0");
}
export function getFormattedDateTime() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

9
src/views/AboutView.vue

@ -0,0 +1,9 @@
<template>
<div class="about">
<h1>This is an about page</h1>
</div>
</template>
<style>
</style>

83
src/views/Test.vue

@ -0,0 +1,83 @@
<template>
<div class="test_return">
<van-nav-bar
title="测试页面"
left-text="返回"
left-arrow
@click-left="onReturn"
/>
<div class="card">
<div v-for="(item, index) in 6" :key="index" class="test_card">
{{ item }}
<div class="test_status">
<div class="test_font">开始加样</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import { useRouter } from 'vue-router'
import {eventBus} from '@/eventBus'
let menuId = ref(1)
const router = useRouter()
const onReturn = () => {
menuId.value = 0
eventBus.emit("menuId", 0)
router.go(-1)
}
const list = [6]
const cardList = ref(list)
const simpleCard = ref(cardList)
</script>
<style scoped>
.test_return{
background: #ECF2FF;
.return{
display: flex;
}
span{
font-size: 12px;
}
.card{
display: flex;
justify-content: flex-start;
flex-wrap: wrap;
flex-direction: row;
}
.test_card{
width: 30%;
height: 110px;
background: #ffffff;
margin-top:10px;
margin-left: 10px;
text-align: center;
padding-top:10px;
border-radius: 5px;
font-weight: bold;
}
.test_status{
height: 50px;
background: #1871F8;
border-radius: 5px;
margin: 17px 6px;
.test_font{
font-size: 15px;
color: #FFFFFF;
padding-top: 14px;
padding-left: 3px;
}
}
}
</style>

98
src/views/components/Footer.vue

@ -0,0 +1,98 @@
<template>
<div class="header_ins">
<van-icon name="discount-o" size="15" style="padding:5px"/>
<span class="ins_text text_size">等待指令</span>
</div>
<div class="footer_waste">
<van-popover v-model:show="showContainerPopover" placement="top">
<template #reference>
<div class="footer_container">
<div class="circle" style="background-color: #F2652D;"></div>
<div class="waste_status text_size" style="color:#F2652D">碱中和容器余量低</div>
<div class="waste_detail"><button class="text_size"><van-icon name="arrow" /></button></div>
</div>
</template>
<div class="liquid">
<Liquid></Liquid>
</div>
</van-popover>
</div>
<div class="footer_normal">
<van-popover v-model:show="showWastePopover" placement="top-end" class="waste_popover">
<template #reference>
<div class="footer_container">
<div class="circle"></div>
<div class="waste_status text_size">溶液正常</div>
<div class="waste_detail"><button class="text_size"><van-icon name="arrow" /></button></div>
</div>
</template>
<div>
<Liquid></Liquid>
</div>
</van-popover>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import Liquid from './Liquid.vue'
const showContainerPopover = ref(false)
const showWastePopover = ref(false)
</script>
<style scoped>
.header_ins{
display: flex;
align-items: center;
border-radius: 5px;
width: calc(1268px* var(--globe-proportion));
height: calc(60px* var(--globe-proportion));
background: #FFFFFF;
}
.footer_waste{
display: flex;
align-items: center;
border-radius: 5px;
width: calc(430px* var(--globe-proportion));
height: calc(60px* var(--globe-proportion));
background: #FFFFFF;
margin-left: 10px;
}
.footer_normal{
margin-left: 70px;
}
.text_size{
font-size:calc(30px * var(--globe-proportion));
padding-right: 5px;
}
.footer_container{
display: flex;
align-items: center;
border-radius: 5px;
width: calc(500px * var(--globe-proportion));
height: calc(60px* var(--globe-proportion));
background: #FFFFFF;
.circle {
width: calc(30px * var(--globe-proportion));
height: calc(30px * var(--globe-proportion));
background-color: green;
border-radius: 50%;
margin-left: 10px;
}
.waste_status{
padding:5px 5px;
}
.waste_detail{
margin-left: auto
}
}
.liquid{
height: 400px;
}
</style>

121
src/views/components/Header.vue

@ -0,0 +1,121 @@
<template>
<div class="header">
<div class="header_logo">
<img :src="logo" style="height:20px"/>
</div>
<div class="header_time">
{{ currentTime }}
</div>
<div class="header_user">
<img :src="AvatarSvg" width="20px" height="20px"/>
<div style="font-size: 15px;">Admin</div>
</div>
</div>
</template>
<script lang="ts" setup>
import logo from '@/assets/logo.png'
import AvatarSvg from '@/assets/avatar.svg'
import { ref, onMounted } from 'vue'
import {eventBus} from '@/eventBus'
import { getFormattedDateTime } from '@/utils'
const menuId = ref(0)
const time = getFormattedDateTime()
const currentTime = ref(time)
onMounted(()=>{
//
eventBus.on('menuId', (value:number)=>{
menuId.value = value
})
})
</script>
<style scoped>
.header{
display: flex;
align-items: center;
background: #e9e9e9;
align-items: center;
height: calc(108px * var(--globe-proportion));
.header_logo{
padding:10px 10px;
}
.header_time{
width: calc(375px * var(--globe-proportion));
height: calc(80px * var(--globe-proportion));
font-size: calc(28px * var(--globe-proportion));
display: flex;
align-items: center;
margin-left: calc(1910px * var(--globe-proportion));
background: white;
justify-content: center;
border-radius: 10px;
}
.header_ins{
display: flex;
align-items: center;
border-radius: 5px;
width: 444px;
height: 80px;
background: #FFFFFF;
}
.header_container{
margin-left: 10px;
display: flex;
align-items: center;
border-radius: 5px;
width: 500px;
height: 80px;
background: #FFFFFF;
.waste_status{
padding:5px 5px;
width: 75%;
}
.waste_detail{
display: flex;
justify-content: flex-end;
width: 40%;
}
}
.header_user{
display: flex;
align-items: center;
justify-content: flex-end;
gap: 5px;
padding-left: 7px;
}
}
.circle {
width: 30px;
height: 30px;
background-color: green;
border-radius: 50%;
margin-left: 10px;
}
:deep(.van-dropdown-menu__bar){
background-color: #1871F8;
border-radius: 5px;
height: 30px;
width: 90px;
.van-ellipsis{
color:white;
}
}
:deep(.van-dropdown-item__content){
width: 150px;
margin-left: 170px;
}
.text_size{
font-size:30px;
padding-right: 5px;
}
</style>

163
src/views/components/Liquid.vue

@ -0,0 +1,163 @@
<template>
<div class="container">
<div>
<div class="waster_status">废液回收状态</div>
<div class="waster_pos">
<div class="contail_percentage"></div>
<div class="liquid" style="height: 50%;"></div>
<div class="percent_num">50%</div>
</div>
<div class="container_water_name">
碱中和容器
</div>
</div>
<br/>
<div>
<div class="waster_status">溶液容器状态</div>
<div class="solu_list">
<div v-for="solu in solutionList" :key="solu.id">
<div class="waster_pos">
<div class="contail_percentage"></div>
<div class="liquid" :style="`height: ${solu.percentage};background-color:${solu.color}`"></div>
<div class="percent_num">{{ solu.percentage }}</div>
</div>
<div class="solu_name">
{{ solu.name }}
</div>
</div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
const solutionList = ref([{
id : 1,
name: '硫酸',
percentage: '10%',
color: 'red'
},{
id : 2,
name: '硫酸',
percentage: '20%',
color:"#07a16e"
},{
id : 3,
name: '硫酸',
percentage: '30%',
color:"#07a16e"
},{
id : 4,
name: '硫酸',
percentage: '40%',
color:"#aa8538"
},{
id : 5,
name: '硫酸',
percentage: '50%',
color:"#cf67e7"
},{
id : 1,
name: '硫酸',
percentage: '10%',
color:"#cf67e7"
},{
id : 2,
name: '硫酸',
percentage: '20%',
color:"#07a16e"
},{
id : 3,
name: '硫酸',
percentage: '30%',
},{
id : 4,
name: '硫酸',
percentage: '40%',
color:"#cf67e7"
},{
id : 5,
name: '硫酸',
percentage: '50%',
color:'#3586c6'
}])
</script>
<style lang="css" scoped>
.container{
background: #EEEFF8;
width: calc(1200px * var(--globe-proportion));
height: calc(1100px * var(--globe-proportion));
.waster_pos{
position: relative;
width: calc(100px * var(--globe-proportion));
height: calc(150px * var(--globe-proportion));
margin: calc(50px * var(--globe-proportion)) calc(60px * var(--globe-proportion));
}
.waster_status{
height: 29px;
font-family: Source Han Sans;
font-size: calc(30px * var(--globe-proportion));
font-weight: 500;
color: #40474E;
padding-left: calc(26px * var(--globe-proportion));
padding-top: calc(19px * var(--globe-proportion));
}
.contail_percentage{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('@/assets/container.svg');
background-size: cover;
background-position: center;
z-index: 1;
border-radius: 10px;
}
.liquid {
position: absolute;
bottom: 0;
left: 0;
width: 100%;
background-color: blue;
opacity: 0.5;
z-index: 2;
border-radius: 0 0 10px 10px;
}
.container_water_name{
font-family: 思源黑体;
font-size: calc(26px * var(--globe-proportion));
font-weight: 500;
color: #9E9E9E;
margin-left: calc(45px * var(--globe-proportion));
margin-top: calc(-35px * var(--globe-proportion));
}
}
.solu_list{
display: flex;
justify-content: center;
flex-wrap: wrap;
}
.solu_name{
font-family: 思源黑体;
font-size: calc(26px * var(--globe-proportion));
font-weight: 500;
color: #9E9E9E;
margin-left: calc(65px * var(--globe-proportion));
margin-top: calc(-35px * var(--globe-proportion));
}
.percent_num{
font-size: calc(30px * var(--globe-proportion));
position: relative;
z-index: 2;
top: calc(60px * var(--globe-proportion));
left: calc(20px * var(--globe-proportion));
}
</style>

103
src/views/components/Menu.vue

@ -0,0 +1,103 @@
<template>
<div class="menu">
<van-sidebar v-model="active" class="sidebar">
<van-sidebar-item v-for="menu in muneList" :key="menu.id" class="menn_text menn_btn" @click="goPage(menu)">
<template #title scoped>
<div class="menn_li">
<div><img :src="active== menu.id ? menu.s_img : menu.n_img" class="menu_icon"/></div>
<div>{{ menu.name }}</div>
</div>
</template>
</van-sidebar-item>
</van-sidebar>
</div>
</template>
<script lang="ts" setup>
import { ref, onMounted } from 'vue'
import { useRouter, useRoute } from 'vue-router'
import { menuIcon } from './menu.ts'
const router = useRouter()
const route = useRoute()
const imageModules:any = import.meta.glob('@/assets/menuIcon/*.svg');
const importedImages:any = {};
const onHeadleIcon = async()=> {
for(const path in imageModules) {
let pst = await imageModules[path]()
importedImages[path] = pst.default
}
}
const active = ref(0);
interface Menu {
id: number
name: string
s_icon: string
n_icon: string
s_img: string
n_img: string
path: string
}
const goPage = (menu:Menu) => {
active.value = menu.id
router.push(`${menu.path}`)
}
const muneList:any = ref([])
onMounted(async ()=>{
await onHeadleIcon()
let path = route.path
muneList.value = menuIcon
//@ts-ignore
muneList.value.forEach(item => {
item.s_img = importedImages[item.s_icon]
item.n_img = importedImages[item.n_icon]
if(item.path === path){
active.value = item.id
}
});
console.log('muneList.value---', muneList.value)
})
</script>
<style lang="css" scoped>
.sidebar{
width:calc(325px * var(--globe-proportion));
font-size: calc(30px * var(--globe-proportion))
}
.menu{
height: calc(1840px * var(--globe-proportion));
background: #e9e9e9;
}
.menn_text{
font-size: calc(30px * var(--globe-proportion));
margin-top:20px;
}
.van-sidebar {
--van-sidebar-active-color: #0088cc; /* 设置激活项颜色为蓝色 */
/* --van-sidebar-background: red; */
--van-sidebar-selected-background: #1989FA
}
.menn_btn{
border-radius: 10px;
height: calc(100px * var(--globe-proportion));
width: calc(320px * var(--globe-proportion));
display: flex;
align-items: center;
}
.menn_li{
display: flex;
align-items: center;
gap: 5px;
}
.menu_icon{
width: calc(80px * var(--globe-proportion));
height: calc(80px * var(--globe-proportion));
}
</style>

25
src/views/components/menu.ts

@ -0,0 +1,25 @@
export const menuIcon = [{
id: 0,
name: '实验操作',
s_icon: '/src/assets/menuIcon/s_home.svg',
n_icon: '/src/assets/menuIcon/n_home.svg',
path: '/graphite',
},{
id: 1,
name: '日志记录',
s_icon: '/src/assets/menuIcon/s_log.svg',
n_icon: '/src/assets/menuIcon/n_log.svg',
path: '/logRecords',
},{
id: 2,
name: '实验记录',
s_icon: '/src/assets/menuIcon/s_expe.svg',
n_icon: '/src/assets/menuIcon/n_expe.svg',
path: '/expeRecords',
},{
id: 3,
name: '加液配置',
s_icon: '/src/assets/menuIcon/s_liquid.svg',
n_icon: '/src/assets/menuIcon/n_liquid.svg',
path: '/liquidConfig',
}]

6
src/views/expeRecord/index.vue

@ -0,0 +1,6 @@
<template>
<div>实验记录</div>
</template>
<script lang="ts" setup>
</script>

187
src/views/graphite/components/AddWaste.vue

@ -0,0 +1,187 @@
<template>
<div>
<div>
<div class="title">添加溶液</div>
</div>
<div class="waste_main">
<div class="waste_area" v-for="el in 8">
<!--左溶液瓶区-->
<div>
<div class="waste_percentage">
<div class="percent_num">300ml</div>
<div class="waste_color" style="background-color:#26D574;"></div>
</div>
<div class="waste_name">硫酸</div>
</div>
<!--右操作区-->
<div>
<div class="waste_edit">
<div >
<van-icon name="edit"/>
<span>请输入添加值</span>
</div>
<br/>
<div class="waste_field">
<img :src="AddSvg" class="add_icon"/>
<van-field type="number" autosize placeholder="请输入" class='waste_input' size="normal"/>ml
</div>
<br/>
<div>
<van-button class="add_btn">加酸</van-button>
</div>
</div>
<div class="add_result">硫酸已添加100ml</div>
</div>
</div>
</div>
<div class="waste_button">
<van-button class="btn" @click="onConfirm" type="primary">确认添加</van-button>
<van-button class="btn" @click="onCancel" style="margin-left: 50px;">取消添加</van-button>
</div>
</div>
</template>
<script setup>
import AddSvg from '@/assets/add.svg'
const emits = defineEmits(['cancel'])
const onConfirm = () => {
}
const onCancel = () => {
emits('cancel')
}
</script>
<style scoped>
.title{
font-size: calc(40px * var(--globe-proportion));
font-weight: 500;
line-height: 11px;
padding-top: calc(80px * var(--globe-proportion));
margin-left: calc(90px * var(--globe-proportion));
color: #323233;
}
.waste_main{
height: calc(900px * var(--globe-proportion));
flex-wrap: wrap;
display: flex;
.waste_area{
height: calc(330px * 0.4);
width: calc(480px * 0.4);
border: 2px solid #275EFB;
margin-top: calc(100px * 0.4);
margin-left: calc(70px * 0.4);
background: rgb(243 251 255);
border-radius: 20px;
display: flex;
.waste_percentage{
position: relative;
width: calc(141px * 0.4);
height: calc(198px * 0.4);
background-image: url('@/assets/container.svg');
background-size: cover;
background-position: center;
z-index: 1;
border-radius: 10px;
margin-top: calc(33px * 0.4);
margin-left: calc(32px * 0.4);
}
.percent_num{
position: relative;
top: 40%;
left: 22%;
font-size: calc(30px * 0.4);
}
.waste_color{
position: absolute;
bottom: 0;
left: 0;
width: calc(141px * 0.4);
height: 50%;
background-color: blue;
opacity: 0.5;
z-index: 2;
border-radius: 0 0 10px 10px;
}
.waste_name{
margin-left: calc(76px * 0.4);
margin-top: calc(27px * 0.4);
font-size: calc(26px * 0.4);
color: #393F46;
}
.waste_edit{
background: #ffffff;
width: calc(256px * 0.4);
height: calc(220px * 0.4);
margin-left: calc(30px * 0.4);
margin-top: calc(20px * 0.4);
padding-top: calc(30px * 0.4);
font-size: calc(20px * 0.4);
padding-left: calc(35px * 0.4);
}
.waste_field{
width: calc(210px * 0.4);
height: calc(54px * 0.4);
display: flex;
border: 1px solid;
border-radius: calc(04px * 0.4);
border: 1px solid #E4E5F1;
align-items: center;
}
}
.add_btn{
background-color: #26D574;
font-size: calc(20px * 0.4);
color: #ffffff;
width: calc(210px * 0.4);
height: calc(54px * 0.4);
border-radius: calc(100px * 0.4);
}
}
.waste_button{
width: 100%;
padding-top: 50px;
margin-left: 35%;
height: 200px;
.btn{
width:calc(438px * 0.4);
height: calc(90px * 0.4);
font-size: calc(40px * 0.4);
}
}
.ml{
padding-top: 5px;
}
.add_result{
font-size: calc(26px * 0.4);
color: #393f46;
margin-top: calc(18px * 0.4);
margin-left: calc(45px * 0.4);
}
.add_icon{
width: calc(28px * 0.4);
height: calc(28px * 0.4);
}
.waste_input{
font-size: calc(18px * 0.4);
}
</style>

205
src/views/graphite/components/HeatPosition.vue

@ -0,0 +1,205 @@
<template>
<div class="heat_main">
<div class="heat_pos_text">
<div class="pos_text">{{ `A-${heatInfo}` }}</div>
<div class="pos_text pos_state">已放置</div>
</div>
<div class="heat_pos">
<div
v-for="(isActive, index) in ballStates"
:key="index"
>
<div class="inner-circle" :style="`background: ${heatInfo == 2 ? '#F2652D': ''}`"></div>
</div>
</div>
<!-- <div class="heat_overlay">
<div class="heat_loading">
<img :src="LoadingSvg"/>
</div>
</div> -->
<div class="heat_footer">
<div class="heat_temperature">
<div class="target_temp">目标温度: 120</div>
<div class="heating">加热中</div>
</div>
<div>
<div class="temp_text">120</div>
<div class="heat_choose">
<van-button type="primary" class="btn" @click="()=>{onChooseFormula()}"> </van-button>
</div>
</div>
</div>
<van-overlay :show="formulaVisible" @click="formulaVisible = false" style="z-index: 999;">
<div class="formula_picker">
<van-picker
title="选择配方"
:columns="formulaList"
@confirm="onConfirmFormula"
@cancel="onCancelFormula"
/>
</div>
</van-overlay>
</div>
</template>
<script lang="ts" setup>
import { computed, ref, watch, onMounted, onBeforeUnmount } from 'vue'
import LoadingSvg from '@/assets/loading.svg'
const ballStates = ref([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16])
const props = defineProps({
heatInfo:Number,
})
//
const formulaVisible = ref(false)
const formulaList:any = ref([])
const onChooseFormula = () => {
formulaVisible.value = true;
formulaList.value = [{ text: '硫酸', value: '1' }]
formulaList.value.push({ text: '硫酸', value: '1' })
console.log('----------选择配方-----------')
}
const onConfirmFormula = (value:any) => {
console.log('value---', value)
formulaVisible.value = false;
}
const onCancelFormula = () => {
formulaVisible.value = false;
}
</script>
<style scoped>
.heat_main{
border: 1px solid #E9F3FF;
width: calc(366px * var(--globe-proportion));
height: calc(580px * var(--globe-proportion));
border-radius: 20px;
background: #E9F3FF;
margin-top: calc(159px * var(--globe-proportion));
}
.heat_pos_text{
display: flex;
height: calc(53px * var(--globe-proportion));
padding-left: 20px;
.pos_text{
font-size: calc(26px * var(--globe-proportion));
font-weight: 500;
line-height: normal;
display: flex;
align-items: center;
color: #4D6882;
}
.pos_state{
margin-left:50%
}
}
.heat_pos{
width: calc(330px * var(--globe-proportion));
height: calc(330px * var(--globe-proportion));
display: flex;
justify-content: center;
flex-wrap: wrap;
margin-left: 5px;
gap: 10px;
flex-direction: row;
background: #384D5D;
border: 2px solid #7592A8;
border-radius: 16px;
}
.inner-circle {
border-radius: 50%;
width: calc(50px * var(--globe-proportion));
height: calc(50px * var(--globe-proportion));
background-color: rgb(209, 33, 33);
}
.heat_footer{
height: calc(180px * var(--globe-proportion));
width: calc(330px * var(--globe-proportion));
margin-top: 10px;
margin-left: 5px;
.heat_temperature{
height: calc(46px * var(--globe-proportion));
width: calc(330px * var(--globe-proportion));
background: #FFFFFF;
border-radius: 5px;
display: flex;
align-items: center;
.target_temp{
color: #384D5D;
font-size: calc(22px * var(--globe-proportion));
}
.heating{
color: #FE0A0A;
font-size: calc(28px * var(--globe-proportion));
margin-left: calc(70px * var(--globe-proportion));
}
}
.temp_text{
width: calc(109px * var(--globe-proportion));
height: calc(52px * var(--globe-proportion));
opacity: 1;
font-family: Source Han Sans;
font-size: calc(36px * var(--globe-proportion));
font-weight: bold;
line-height: normal;
display: flex;
align-items: center;
color: #4D6882;
padding-top: calc(70px * var(--globe-proportion));
margin-left: calc(25px * var(--globe-proportion));
}
}
.heat_overlay{
border: 1px solid #E9F3FF;
width: 300px;
height: 492px;
border-radius: 20px;
margin-top: 100px;
position: absolute;
background: #d3d3d3;
margin-top: -335px;
opacity: 0.8;
.heat_loading{
margin: 123px;
}
}
.heat_choose{
position: absolute;
margin-left: calc(215px * var(--globe-proportion));
z-index: 99;
margin-top: -15px;
.btn{
width: calc(126px * var(--globe-proportion));
height: calc(38px * var(--globe-proportion));
font-size: calc(20px * var(--globe-proportion));
background:#1989FA;
color: white;
}
}
.formula_picker{
width: calc(800px * var(--globe-proportion));
margin: 20% 30%;
}
</style>

46
src/views/graphite/components/TakePickture.vue

@ -0,0 +1,46 @@
<template>
<div class="picture">
<!-- <van-button class="area">拍照</van-button> -->
<div class="area">
<div class="area_btn">
<img :src="PhotoSvg" class="photo_icon"/>
拍照
</div>
</div>
</div>
</template>
<script lang="ts" setup>
import PhotoSvg from '@/assets/photo_icon.svg'
</script>
<style scoped>
.picture{
height: calc(726px * var(--globe-proportion));
width: calc(911px * var(--globe-proportion));
background-image: url('@/assets/picture.svg');
background-repeat: no-repeat;
background-size: contain;
margin-left:10px
}
.area{
background: rgba(255, 255, 255, 0.5);
font-size: calc(26px * var(--globe-proportion));
width: calc(911px * var(--globe-proportion));
height: calc(126px * var(--globe-proportion));
position: absolute;
margin-top: calc(600px * var(--globe-proportion));
.area_btn{
display: flex;
justify-content: center;
align-items: center;
height: calc(126px * var(--globe-proportion));
font-size: calc(42px * var(--globe-proportion));
font-weight: bold;
color: #FFFFFF;
gap:10px;
.photo_icon{
width: calc(51px * var(--globe-proportion));
height: calc(38px * var(--globe-proportion));
}
}
}
</style>

4
src/views/graphite/components/index.ts

@ -0,0 +1,4 @@
export {default as HeatPosition} from './HeatPosition.vue'
export {default as TakePickture} from './TakePickture.vue'
export { default as AddWaste} from './AddWaste.vue'

143
src/views/graphite/index.vue

@ -0,0 +1,143 @@
<template>
<div class="graphite_home" id="home">
<div class="heat_area">
<div v-for="(item, index) in heatList" :key="item">
<div :style="`margin-top:${index>2?'-40px':''}`"><HeatPosition :heatInfo="item"></HeatPosition></div>
</div>
</div>
<!--拍照区-->
<div class="pickture_area">
<div class="pickture">
<TakePickture></TakePickture>
</div>
<div class="graphite_btn">
<div><van-button size="large" class="btn_size" style="width: calc(930px * var(--globe-proportion));">开门</van-button></div>
<van-row class="graphite_operate">
<van-col span="11">
<van-button size="large" class="btn_size">开始任务</van-button>
</van-col>
<van-col span="11">
<van-button size="large" class="btn_size">结束任务</van-button>
</van-col>
</van-row>
<van-row class="graphite_operate">
<van-col span="11">
<van-button size="large" class="btn_size">选择配方</van-button>
</van-col>
<van-col span="11">
<van-button size="large" class="btn_size">执行配方</van-button>
</van-col>
</van-row>
<van-row class="graphite_operate">
<van-col span="11">
<van-button size="large" class="btn_size" @click="onAddWaste">添加溶液</van-button>
</van-col>
<van-col span="11">
<van-button size="large" class="btn_size">摇匀</van-button>
</van-col>
</van-row>
<van-row class="graphite_operate">
<van-col span="7">
<van-button size="large" class="btn_size">移至加热</van-button>
</van-col>
<van-col span="7">
<van-button size="large" class="btn_size">移至加液</van-button>
</van-col>
<van-col span="7">
<van-button size="large" class="btn_size">移至特殊</van-button>
</van-col>
</van-row>
<van-row class="graphite_operate">
<van-col span="11">
<van-button size="large" class="btn_size">开始加热</van-button>
</van-col>
<van-col span="11">
<van-button size="large" class="btn_size">抬起托盘</van-button>
</van-col>
</van-row>
</div>
</div>
<van-overlay :show="wasteVisible" style="z-index: 999;">
<div class="waste">
<div class="addWaste">
<AddWaste @cancel="wasteVisible=false"></AddWaste>
</div>
</div>
</van-overlay>
</div>
</template>
<script lang="ts" setup>
import { ref } from 'vue';
import {HeatPosition, TakePickture, AddWaste} from './components'
const heatList:any = ref([1,2,3,4,5,6])
//
const wasteVisible = ref(false)
const onAddWaste = () => {
wasteVisible.value = true;
}
</script>
<style>
.graphite_home{
display: flex;
background: #F6F6F6;
width: calc(2418px * var(--globe-proportion));
}
.heat_area{
width: calc(1268px * var(--globe-proportion));
height: calc(1620px * var(--globe-proportion));
display: flex;
justify-content: center;
flex-wrap: wrap;
margin: 5px;
gap: calc(20px * var(--globe-proportion));
padding-top:10px;
padding-bottom: 100px;
background: #FFFFFF;
border-radius: 20px;
}
.pickture_area{
width: calc(1100px * var(--globe-proportion));
height: calc(1620px * var(--globe-proportion));
margin: 5px;
background: #FFFFFF;
padding: calc(50px * var(--globe-proportion));
border-radius: 20px;
}
.graphite_btn{
padding-top: calc(50px * var(--globe-proportion));
margin-left: calc(30px * var(--globe-proportion));
}
.btn_size{
font-size: calc(30px * var(--globe-proportion));
height: calc(80px * var(--globe-proportion));
color: #1989FA;
border: 3px solid #1989FA;
}
.graphite_operate{
gap: calc(40px * var(--globe-proportion));
line-height: 3.5;
}
.waste{
display: flex;
justify-content: center;
width: 100%;
height: 100%;
align-items: center;
.addWaste{
width: calc(2250px * 0.4);
height: calc(1235px * 0.4);
background: #FFFFFF;
}
}
</style>

63
src/views/home/index.vue

@ -0,0 +1,63 @@
<template>
<div>
<div><Header></Header></div>
<div class="container" style="display: flex;">
<div class="home_menu">
<Menu></Menu>
</div>
<main>
<div class="main">
<router-view v-slot="{ Component }">
<keep-alive :exclude="['Home']">
<component :is="Component" />
</keep-alive>
</router-view>
</div>
</main>
</div>
<div class="footer">
<Footer></Footer>
</div>
</div>
</template>
<script setup lang="ts">
import Header from '../components/Header.vue';
import Footer from '../components/Footer.vue';
import { onMounted, watch } from 'vue';
import { useRouter, useRoute } from 'vue-router'
import Menu from '@/views/components/Menu.vue'
defineOptions({
name: "Home"
})
const router = useRouter();
const route = useRoute();
watch(route,(newVal)=>{
if(newVal.path == '/home'){
router.push('/graphite')
}
},{ immediate: true, deep: true })
</script>
<style>
.main{
display: flex;
width: calc(2418px * var(--globe-proportion));
background: rgb(255, 255, 255);
height: calc(1640px * var(--globe-proportion));
}
.home_menu{
background: rgb(255, 255, 255);
height: calc(1724px * var(--globe-proportion));
width: calc(450px * var(--globe-proportion));
}
.footer{
position: relative;
margin-top: -25px;
width: calc(2425px * var(--globe-proportion));
margin-left: calc(325px * var(--globe-proportion));
background: #e9e9e9;
display: flex;
gap: 5px;
}
</style>

33
src/views/liquidConfig/index.vue

@ -0,0 +1,33 @@
<template>
<div>
<div class="waster_config">
<div class="config_title">
<div class="config_name"></div>
</div>
</div>
</div>
</template>
<script lang="ts" setup>
</script>
<style scoped>
.waster_config{
width: calc(410px * 0.4);
height: calc(430px * 0.4);
border:1px solid #275EFB;
margin-left: calc(134px * 0.4);
margin-top: calc(160px * 0.4);
.config_title{
width: calc(410px * 0.4);
height: calc(80px * 0.4);
background: rgba(25, 137, 250, 0.1216);
padding-top:calc(15px * 0.4);
.config_name{
width: calc(248px * 0.4);
height: calc(50px * 0.4);
background: #FFFFFF;
margin-left: calc(81px * 0.4);
}
}
}
</style>

10
src/views/logRecord/index.vue

@ -0,0 +1,10 @@
<template>
<div class="log">日志记录</div>
</template>
<script lang="ts" setup>
</script>
<style lang="css" scoped>
.log{
}
</style>

51
src/views/login/index.vue

@ -0,0 +1,51 @@
<template>
<div class="login-container">
<!-- 背景图 -->
<div class="background-image"></div>
<!-- 登录表单 -->
<div class="login-form">
<h2>登录</h2>
<!-- 用户名输入框 -->
<div class="login-user-input">
<input
type="text"
v-model="username"
placeholder="用户名"
class="input-field"
/>
</div>
<!-- 密码输入框 -->
<div style="margin-top: 5%;">
<input
type="password"
v-model="password"
placeholder="密码"
class="input-field"
/>
</div>
<!-- 登录按钮 -->
<button @click="handleLogin" class="login-button">登录</button>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
import { useRouter } from 'vue-router'
const router = useRouter()
//
const username = ref('');
const password = ref('');
//
const handleLogin = () => {
console.log('用户名:', username.value);
console.log('密码:', password.value);
router.push('/home')
//
};
</script>
<style scoped>
@import './login.css'
</style>

60
src/views/login/login.css

@ -0,0 +1,60 @@
.login-container {
position: relative;
width: 100vw;
height: 100vh;
overflow: hidden;
}
.background-image {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-image: url('https://via.placeholder.com/1920x1080'); /* 替换为你自己的背景图 URL */
background-size: cover;
background-position: center;
filter: blur(5px);
z-index: -1;
}
.login-form {
position: absolute;
top: 50%;
left: 50%;
height: 600px;
transform: translate(-50%, -50%);
background-color: rgba(255, 255, 255, 0.8);
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
text-align: center;
}
.input-field {
width: 100%;
padding: 10px;
margin: 10px 0;
border: 1px solid #ccc;
border-radius: 5px;
}
.login-button {
width: 100%;
padding: 10px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
margin-top: 35%;
}
.login-button:hover {
background-color: #0056b3;
}
.login-user-input{
width: 400px;
margin-top: 15%;
}

54
src/views/style/simpleCard.css

@ -0,0 +1,54 @@
.simple_card{
width: 100px;
height: 137px;
background: #FFFFFF;
border-radius: 8px;
opacity: 1;
.simple_pos{
text-align: center;
font-family: HarmonyOS Sans SC;
font-size: 22px;
font-weight: bold;
line-height: normal;
color: #1871F8;
}
.simple_time{
width: 90px;
height: 70px;
border-radius: 6px;
opacity: 1;
background: #1871F8;
padding-top:2px;
margin-left: 5px;
.simple_remaining_time{
display: flex;
color: #FFFFFF;
text-align: center;
font-size: 12px;
font-weight: bold;
padding-top: 10px;
padding-left: 10px;
}
.simple_countdown{
width: 84px;
height: 32px;
border-radius: 6px;
opacity: 1;
background: #195DC4;
color: #FFFFFF;
padding-top: 5px;
text-align: center;
margin-left:3px;
margin-top:2px;
}
}
.simple_btn{
border-radius: 6px;
width: 90px;
margin-left:5px;
}
}

81
src/views/style/simpleCardVertical.css

@ -0,0 +1,81 @@
.simple_card{
width: 310px;
height: 42px;
background: #FFFFFF;
border-radius: 8px;
opacity: 1;
display: flex;
gap: 5px;
.simple_content{
width: 198px;
height: 37px;
border-radius: 8px;
background: #5BE881;
margin: auto;
margin-left: 2px;
display:flex;
.simple_seq{
color: #ffffff;
padding-left: 15px;
padding-top: 5px;
width: 35px;
}
.simple_time_icon{
display: flex;
img{
width: 15px;
height: 15px;
margin: auto;
}
.simple_remaining_time{
display: flex;
color: #FFFFFF;
text-align: center;
font-size: 13px;
font-weight: bold;
padding-top: 10px;
padding-left: 5px;
}
}
.simple_pos{
height: 25px;
font-size: 22px;
font-weight: bold;
}
.simple_countdown{
width: 84px;
height: 32px;
border-radius: 6px;
opacity: 1;
background: #52D375;
color: #FFFFFF;
padding-top: 5px;
text-align: center;
margin-left:3px;
margin-top:2px;
}
}
.simple_btn{
border-radius: 6px;
width: 107px;
height: 37px;
margin-top:3px;
background: #5BE881;
font-weight: bold;
display: flex;
justify-content: center;
align-items: center;
.simple_clear{
color:#FFFFFF;
}
}
}

12
tailwind.config.js

@ -0,0 +1,12 @@
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

12
tsconfig.app.json

@ -0,0 +1,12 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
"paths": {
"@/*": ["./src/*"]
}
}
}

11
tsconfig.json

@ -0,0 +1,11 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
}
]
}

18
tsconfig.node.json

@ -0,0 +1,18 @@
{
"extends": "@tsconfig/node22/tsconfig.json",
"include": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
"playwright.config.*",
],
"compilerOptions": {
"noEmit": true,
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
"module": "ESNext",
"moduleResolution": "Bundler",
"types": ["node"]
}
}

20
vite.config.ts

@ -0,0 +1,20 @@
import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueJsx from "@vitejs/plugin-vue-jsx";
import vueDevTools from "vite-plugin-vue-devtools";
// https://vite.dev/config/
export default defineConfig({
plugins: [vue(), vueJsx(), vueDevTools()],
resolve: {
alias: {
"@": fileURLToPath(new URL("./src", import.meta.url)),
},
},
server: {
host: "0.0.0.0",
port: 5174,
},
});
Loading…
Cancel
Save