diff --git a/docker-compose.yaml b/docker-compose.yaml index 837cd995..b229db40 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -40,6 +40,7 @@ services: build: context: ./ dockerfile: ./devops/backend/Dockerfile + image: backend:latest # 构建镜像名称 restart: always environment: TZ: "Asia/Shanghai" @@ -56,7 +57,7 @@ services: # 前端nginx服务 frontend: container_name: nginx - image: "nginx:latest" + image: nginx:latest restart: always environment: TZ: "Asia/Shanghai" diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 2a2012f6..05d987d4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -16,8 +16,8 @@ "element-plus": "^2.8.4", "highlight.js": "^11.10.0", "md5": "^2.3.0", - "pinia": "^2.3.0", - "pinia-plugin-persistedstate": "^4.2.0", + "pinia": "^3.0.0", + "pinia-plugin-persistedstate": "^4.3.0", "sass": "1.63.2", "store": "^2.0.12", "vue": "^3.3.11", @@ -648,55 +648,19 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/@nuxt/kit": { - "version": "3.16.2", - "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.16.2.tgz", - "integrity": "sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==", + "version": "3.17.4", + "resolved": "https://registry.npmmirror.com/@nuxt/kit/-/kit-3.17.4.tgz", + "integrity": "sha512-l+hY8sy2XFfg3PigZj+PTu6+KIJzmbACTRimn1ew/gtCz+F38f6KTF4sMRTN5CUxiB8TRENgEonASmkAWfpO9Q==", "license": "MIT", "dependencies": { - "c12": "^3.0.2", + "c12": "^3.0.4", "consola": "^3.4.2", "defu": "^6.1.4", - "destr": "^2.0.3", + "destr": "^2.0.5", "errx": "^0.1.0", - "exsolve": "^1.0.4", - "globby": "^14.1.0", - "ignore": "^7.0.3", + "exsolve": "^1.0.5", + "ignore": "^7.0.4", "jiti": "^2.4.2", "klona": "^2.0.6", "knitwork": "^1.2.0", @@ -705,11 +669,12 @@ "pathe": "^2.0.3", "pkg-types": "^2.1.0", "scule": "^1.3.0", - "semver": "^7.7.1", - "std-env": "^3.8.1", - "ufo": "^1.5.4", + "semver": "^7.7.2", + "std-env": "^3.9.0", + "tinyglobby": "^0.2.13", + "ufo": "^1.6.1", "unctx": "^2.4.1", - "unimport": "^4.1.3", + "unimport": "^5.0.1", "untyped": "^2.0.0" }, "engines": { @@ -989,18 +954,6 @@ "nanopop": "^2.1.0" } }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.6.tgz", @@ -1121,6 +1074,30 @@ "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", "license": "MIT" }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.6.tgz", + "integrity": "sha512-geu7ds7tem2Y7Wz+WgbnbZ6T5eadOvozHZ23Atk/8tksHMFOFylKi1xgGlQlVn0wlkEf4hu+vd5ctj1G4kFtwA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.6", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.6.tgz", + "integrity": "sha512-yFEgJZ/WblEsojQQceuyK6FzpFDx4kqrz2ohInxNj5/DnhoX023upTv4OD6lNPLAA5LLkbwPVb10o/7b+Y4FVA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, "node_modules/@vue/reactivity": { "version": "3.5.13", "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.13.tgz", @@ -1322,6 +1299,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/birpc": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.3.0.tgz", + "integrity": "sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", @@ -1353,16 +1339,16 @@ "peer": true }, "node_modules/c12": { - "version": "3.0.3", - "resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.3.tgz", - "integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==", + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/c12/-/c12-3.0.4.tgz", + "integrity": "sha512-t5FaZTYbbCtvxuZq9xxIruYydrAGsJ+8UdP0pZzMiK2xl/gNiSOy0OxhLzHUEEb0m1QXYqfzfvyIFEmz/g9lqg==", "license": "MIT", "dependencies": { "chokidar": "^4.0.3", "confbox": "^0.2.2", "defu": "^6.1.4", - "dotenv": "^16.4.7", - "exsolve": "^1.0.4", + "dotenv": "^16.5.0", + "exsolve": "^1.0.5", "giget": "^2.0.0", "jiti": "^2.4.2", "ohash": "^2.0.11", @@ -1523,6 +1509,21 @@ "node": "^14.18.0 || >=16.10.0" } }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/core-js": { "version": "3.39.0", "resolved": "https://registry.npmmirror.com/core-js/-/core-js-3.39.0.tgz", @@ -1736,36 +1737,11 @@ "license": "MIT" }, "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.5.tgz", + "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==", "license": "MIT" }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fastq": { - "version": "1.19.1", - "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", @@ -1864,26 +1840,6 @@ "node": ">= 6" } }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmmirror.com/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "license": "MIT", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", @@ -1905,10 +1861,16 @@ "node": ">=12.0.0" } }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, "node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-7.0.4.tgz", + "integrity": "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==", "license": "MIT", "engines": { "node": ">= 4" @@ -1980,6 +1942,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/jiti": { "version": "2.4.2", "resolved": "https://registry.npmmirror.com/jiti/-/jiti-2.4.2.tgz", @@ -2088,28 +2062,6 @@ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", "license": "MIT" }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", @@ -2131,6 +2083,12 @@ "node": ">= 0.6" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, "node_modules/mlly": { "version": "1.7.4", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.7.4.tgz", @@ -2230,18 +2188,6 @@ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==", "license": "MIT" }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", @@ -2273,13 +2219,12 @@ } }, "node_modules/pinia": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz", - "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-3.0.2.tgz", + "integrity": "sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==", "license": "MIT", "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" + "@vue/devtools-api": "^7.7.2" }, "funding": { "url": "https://github.com/sponsors/posva" @@ -2295,19 +2240,19 @@ } }, "node_modules/pinia-plugin-persistedstate": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz", - "integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==", + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.3.0.tgz", + "integrity": "sha512-x9wxpHj6iFDj5ITQJ3rj6+KesEqyRk/vqcE3WE+VGfetleV9Zufqwa9qJ6AkA5wmRSQEp7BTA1us/MDVTRHFFw==", "license": "MIT", "dependencies": { - "@nuxt/kit": "^3.14.1592", + "@nuxt/kit": "^3.17.2", "deep-pick-omit": "^1.2.1", "defu": "^6.1.4", - "destr": "^2.0.3" + "destr": "^2.0.5" }, "peerDependencies": { - "@pinia/nuxt": ">=0.9.0", - "pinia": ">=2.3.0" + "@pinia/nuxt": ">=0.10.0", + "pinia": ">=3.0.0" }, "peerDependenciesMeta": { "@pinia/nuxt": { @@ -2318,6 +2263,15 @@ } } }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.6", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.6.tgz", + "integrity": "sha512-b2Xx0KvXZObePpXPYHvBRRJLDQn5nhKjXh7vUhMEtWxz1AYNFOVIsh5+HLP8xDGL7sy+Q7hXeUxPHB/KgbtsPw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.6" + } + }, "node_modules/pkg-types": { "version": "2.1.0", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.1.0.tgz", @@ -2379,26 +2333,6 @@ ], "license": "MIT" }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmmirror.com/rc9/-/rc9-2.1.2.tgz", @@ -2439,15 +2373,11 @@ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", "license": "MIT" }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" }, "node_modules/rollup": { "version": "4.28.0", @@ -2487,29 +2417,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.1.tgz", @@ -2968,9 +2875,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -2985,18 +2892,6 @@ "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", "license": "MIT" }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmmirror.com/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", @@ -3031,6 +2926,15 @@ "source-map": "^0.6.0" } }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssf": { "version": "0.11.2", "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", @@ -3082,6 +2986,18 @@ "integrity": "sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==", "license": "MIT" }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", @@ -3164,12 +3080,12 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", "license": "MIT", "dependencies": { - "fdir": "^6.4.3", + "fdir": "^6.4.4", "picomatch": "^4.0.2" }, "engines": { @@ -3180,9 +3096,9 @@ } }, "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "version": "6.4.4", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" @@ -3256,22 +3172,10 @@ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmmirror.com/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/unimport": { - "version": "4.2.0", - "resolved": "https://registry.npmmirror.com/unimport/-/unimport-4.2.0.tgz", - "integrity": "sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==", + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/unimport/-/unimport-5.0.1.tgz", + "integrity": "sha512-1YWzPj6wYhtwHE+9LxRlyqP4DiRrhGfJxdtH475im8ktyZXO3jHj/3PZ97zDdvkYoovFdi0K4SKl3a7l92v3sQ==", "license": "MIT", "dependencies": { "acorn": "^8.14.1", @@ -3285,8 +3189,8 @@ "pkg-types": "^2.1.0", "scule": "^1.3.0", "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.12", - "unplugin": "^2.2.2", + "tinyglobby": "^0.2.13", + "unplugin": "^2.3.2", "unplugin-utils": "^0.2.4" }, "engines": { @@ -3315,9 +3219,9 @@ } }, "node_modules/unplugin": { - "version": "2.3.2", - "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.2.tgz", - "integrity": "sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==", + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.4.tgz", + "integrity": "sha512-m4PjxTurwpWfpMomp8AptjD5yj8qEZN5uQjjGM3TAs9MWWD2tXSSNNj6jGR2FoVGod4293ytyV6SwBbertfyJg==", "license": "MIT", "dependencies": { "acorn": "^8.14.1", diff --git a/frontend/package.json b/frontend/package.json index e86c09bc..829ae912 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -17,8 +17,8 @@ "element-plus": "^2.8.4", "highlight.js": "^11.10.0", "md5": "^2.3.0", - "pinia": "^2.3.0", - "pinia-plugin-persistedstate": "^4.2.0", + "pinia": "^3.0.0", + "pinia-plugin-persistedstate": "^4.3.0", "sass": "1.63.2", "store": "^2.0.12", "vue": "^3.3.11", diff --git a/start.sh b/start.sh index 8cd71d03..ab242008 100644 --- a/start.sh +++ b/start.sh @@ -4,67 +4,127 @@ PROJECT_NAME="fastapi_vue3_admin" WORK_DIR="/home" GIT_REPO="https://gitee.com/tao__tao/fastapi_vue3_admin.git" +VERSION_TAG=$(date +%Y%m%d%H%M%S) +IMAGE_NAME="fastapi_vue3_admin:${VERSION_TAG}" +FRONTEND_URL="http://8.137.99.5:80" +BACKEND_DOC_URL="http://8.137.99.5:8001/api/v1/docs" -# 第一步:设置工作目录 -echo "🔍 第一步:设置工作目录" -echo "⏳ 正在切换到工作目录 ${WORK_DIR} ..." -cd "${WORK_DIR}" || { echo "❌ 无法切换到 ${WORK_DIR} 目录"; exit 1; } +# 打印带时间戳的日志 +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" +} -# 第二步:清理旧项目文件夹(如果存在) -echo -e "\n🔍 第二步:清理旧项目文件夹(如存在)" -echo "⏳ 正在检查是否存在旧项目 ${PROJECT_NAME}/ ..." -if [ -d "${PROJECT_NAME}/" ]; then - echo "🗑️ 正在删除旧项目文件夹 ${PROJECT_NAME}/ ..." - rm -rf "${PROJECT_NAME}/" || { echo "❌ 删除旧项目文件夹失败"; exit 1; } - echo "✅ 旧项目文件夹已成功删除。" -else - echo "✨ 未找到旧项目文件夹,跳过删除步骤。" -fi +# 检查权限 +check_permissions() { + log "🔍 第一步:检查权限..." + [ "$(id -u)" = "0" ] || { log "❌ 需要 root 权限"; exit 1; } + log "✅ 权限检查通过" +} -# 第三步:克隆项目仓库 -echo -e "\n🔍 第三步:克隆项目代码库" -echo "📥 正在克隆项目代码库 ..." -git clone "${GIT_REPO}" || { echo "❌ 项目克隆失败"; exit 1; } -echo "✅ 项目克隆成功。" +# 检查依赖 +check_dependencies() { + log "🔍 第二步:检查系统依赖..." + for cmd in git docker node npm; do + command -v $cmd &> /dev/null || { log "❌ $cmd 未安装"; exit 1; } + log "🎉 $cmd 已安装 - $($cmd -v)" + done + log "✅ 所有依赖检查通过" +} -# 第四步:进入项目根目录 -echo -e "\n🔍 第四步:进入项目根目录" -echo "📁 正在进入项目目录 ${PROJECT_NAME} ..." -cd "${PROJECT_NAME}" || { echo "❌ 无法进入项目目录"; exit 1; } +# 更新代码 +update_code() { + log "🔍 第三步:检查项目代码..." + cd "${WORK_DIR}" || { log "❌ 无法进入工作目录:${WORK_DIR}"; exit 1; } + if [ -d "${PROJECT_NAME}/" ]; then + log "🔄 项目已存在,开始更新代码" + cd "${PROJECT_NAME}" || { log "❌ 无法进入项目目录:${PROJECT_NAME}"; exit 1; } + git fetch origin master || { log "❌ 拉取更新失败"; exit 1; } + git reset --hard origin/master || { log "❌ 重置代码失败"; exit 1; } + log "✅ 代码更新成功" + else + log "📥 项目不存在,开始克隆代码" + git clone "${GIT_REPO}" || { log "❌ 项目克隆失败:${GIT_REPO}"; exit 1; } + cd "${PROJECT_NAME}" || { log "❌ 无法进入项目目录:${PROJECT_NAME}"; exit 1; } + log "✅ 代码克隆成功" + fi +} -# 第五步:停止并删除正在运行的容器 -echo -e "\n🔍 第五步:停止并删除现有容器" -echo "🛑 正在停止并删除现有容器 ..." -docker compose kill || { echo "⚠️ 停止容器失败,可能没有运行的容器"; } -docker compose rm -f || { echo "⚠️ 删除容器失败,可能没有容器可删除"; } -echo "✅ 容器已停止并删除。" +# 构建前端 +build_frontend() { + # 如果是首次克隆项目,或者检测到前端代码变更,则构建前端 + if [ ! -d "frontend/dist" ] || [ "$(git diff --name-only HEAD~1 HEAD)" ]; then + log "🚀 检测到前端代码变更或首次克隆,开始构建前端..." + cd frontend || { log "❌ 无法进入前端目录"; exit 1; } + # 清理旧依赖 + if [ -d "node_modules" ] || [ -f "package-lock.json" ]; then + log "🧹 清理旧的node_modules和package-lock.json..." + rm -rf node_modules package-lock.json + fi + npm install || { log "❌ 前端依赖安装失败"; exit 1; } + npm run build || { log "❌ 前端工程打包失败"; exit 1; } + log "✅ 前端工程打包成功" + cd .. || { log "❌ 无法返回项目根目录"; exit 1; } + else + log "⚠️ 未检测到前端代码变更且非首次克隆,跳过前端构建" + fi +} -# 第六步:打包前端项目 -echo -e "\n🔍 第六步: 打包前端工程" -echo "📦 正在检查前端是否需要重新构建..." +# 停止并删除容器 +stop_and_remove_containers() { + log "🗑️ 停止并删除现有容器..." + [ -f "docker-compose.yaml" ] || { log "❌ docker-compose.yaml 文件未找到"; exit 1; } + docker compose kill + docker compose rm -f + log "✅ 容器已停止并删除" +} -# 检查是否需要重新构建 -if [ ! -d "frontend/dist" ] || [ "$(git diff --name-only HEAD~1 HEAD)" ]; then - echo "🔧 检测到代码变更,正在安装前端依赖并构建..." - cd frontend || { echo "❌ 无法进入前端目录"; exit 1; } - npm install || { echo "❌ 前端依赖安装失败"; exit 1; } - npm run build || { echo "❌ 前端工程打包失败"; exit 1; } - echo "✅ 前端工程打包成功。" - cd .. || { echo "❌ 无法返回项目根目录"; exit 1; } - - echo "🏗️ 正在构建镜像..." - docker compose build || { echo "❌ 镜像构建失败"; exit 1; } -else - echo "✨ 代码未变更,跳过构建步骤。" -fi +# 构建镜像 +build_image() { + log "🚀 开始构建Docker镜像..." + docker compose build --build-arg VERSION_TAG=${VERSION_TAG} || { log "❌ 镜像构建失败"; exit 1; } + log "✅ Docker镜像构建成功" +} -# 第七步:启动容器 -echo -e "\n🔍 第七步:启动容器" -echo "🚀 正在启动容器..." -docker compose up -d || { echo "❌ 容器启动失败"; exit 1; } -echo "✅ 服务已成功启动。" +# 启动容器 +start_containers() { + log "🚀 启动容器..." + docker compose up -d || { log "❌ 容器启动失败"; exit 1; } + log "✅ 容器启动成功" +} -# 部署完成提示 -echo -e "\n🎉 部署流程已完成!" -echo "前端访问地址: http://8.137.99.5:80" -echo "后端API文档: http://8.137.99.5:8001/api/v1/docs" \ No newline at end of file +# 健康检查 +health_check() { + log "⏱️ 等待服务启动..." + sleep 10 + log "🔍 进行健康检查..." + curl --output /dev/null --silent --head --fail "${FRONTEND_URL}" || { log "❌ 前端服务健康检查失败"; exit 1; } + curl --output /dev/null --silent --head --fail "${BACKEND_DOC_URL}" || { log "❌ 后端服务健康检查失败"; exit 1; } + log "✅ 服务健康检查通过" +} + +# 清理旧镜像 +cleanup_old_images() { + log "🗑️ 清理24小时前的旧镜像..." + docker image prune -f --filter "until=24h" + log "✅ 旧镜像清理完成" +} + +# 主函数 +main() { + log "🚀 开始部署流程" + check_permissions + check_dependencies + update_code + stop_and_remove_containers + build_frontend + build_image + start_containers + health_check + cleanup_old_images + log "🎉 部署完成" + echo "🌐 前端地址: ${FRONTEND_URL}" + echo "📚 API文档: ${BACKEND_DOC_URL}" +} + +main +trap 'log "⚠️ 脚本中断"; exit 1' INT TERM \ No newline at end of file