diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..eaf8550 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,4 @@ +## 开发页面时必须加载 + +- nuxt-ui +- nuxt \ No newline at end of file diff --git a/build-files/migrate/sqlite3.js b/build-files/migrate/sqlite3.js index fe336c7..12c68b2 100644 --- a/build-files/migrate/sqlite3.js +++ b/build-files/migrate/sqlite3.js @@ -1,6 +1,6 @@ -import { drizzle } from 'drizzle-orm/better-sqlite3' -import { migrate } from 'drizzle-orm/better-sqlite3/migrator' -import Database from 'better-sqlite3' +import { drizzle } from 'drizzle-orm/libsql' +import { migrate } from 'drizzle-orm/libsql/migrator' +import { createClient } from '@libsql/client' import path from 'node:path' import { fileURLToPath } from 'node:url' @@ -19,8 +19,8 @@ export async function runMigrations() { throw new Error('DATABASE_URL 未设置,且未提供有效的 SQLite 文件路径') } - const sqlite = new Database(sqlitePath) - const db = drizzle(sqlite) + const client = createClient({ url: `file:${sqlitePath}` }) + const db = drizzle(client) try { console.log(`🚀 开始执行 SQLite 迁移... (${sqlitePath})`) @@ -34,8 +34,6 @@ export async function runMigrations() { } catch (err) { console.log('❌ 迁移失败:', err) throw err - } finally { - sqlite.close() } } diff --git a/build-files/seed/sqlite3.js b/build-files/seed/sqlite3.js index 51d2714..12c4a25 100644 --- a/build-files/seed/sqlite3.js +++ b/build-files/seed/sqlite3.js @@ -6,7 +6,7 @@ * - DATABASE_URL:SQLite 路径,可为 `file:/path/to/db.sqlite` 或裸路径 * - BOOTSTRAP_ADMIN_USERNAME / BOOTSTRAP_ADMIN_PASSWORD:可选;未设置或校验失败则跳过 */ -import Database from 'better-sqlite3' +import { createClient } from '@libsql/client' import { hash } from 'bcryptjs' import { mkdirSync } from 'node:fs' import path from 'node:path' @@ -39,20 +39,21 @@ function resolveSqliteFilePath(dbUrl) { return path.resolve(process.cwd(), stripped) } -function openSqlite() { +function openClient() { const dbUrl = process.env.DATABASE_URL || '' const sqlitePath = resolveSqliteFilePath(dbUrl) mkdirSync(path.dirname(sqlitePath), { recursive: true }) - return new Database(sqlitePath) + return createClient({ url: `file:${sqlitePath}` }) } async function main() { - const db = openSqlite() + const db = openClient() try { - const existingAdmin = db - .prepare(`SELECT id FROM users WHERE role = ? LIMIT 1`) - .get('admin') - if (existingAdmin) { + const rs = await db.execute({ + sql: `SELECT id FROM users WHERE role = ? LIMIT 1`, + args: ['admin'], + }) + if (rs.rows.length > 0) { console.log('Bootstrap skipped: admin exists') return } @@ -75,23 +76,25 @@ async function main() { } const passwordHash = await hash(password, 10) - const { maxId } = db.prepare(`SELECT COALESCE(MAX(id), 0) AS maxId FROM users`).get() + const maxRs = await db.execute(`SELECT COALESCE(MAX(id), 0) AS maxId FROM users`) + const { maxId } = maxRs.rows[0] const userId = (maxId ?? 0) + 1 const publicSlug = derivePublicSlug(username) try { - db.prepare( - ` + await db.execute({ + sql: ` INSERT INTO users (id, username, password, role, status, public_slug) VALUES (@id, @username, @password, @role, @status, @public_slug) `, - ).run({ - id: userId, - username, - password: passwordHash, - role: 'admin', - status: 'active', - public_slug: publicSlug, + args: { + id: userId, + username, + password: passwordHash, + role: 'admin', + status: 'active', + public_slug: publicSlug, + }, }) console.log('Bootstrap complete: admin user created') } catch (err) { @@ -101,7 +104,7 @@ async function main() { ) } } finally { - db.close() + // @libsql/client 无需手动 close } } diff --git a/bun.lock b/bun.lock index e7dec4e..8baf012 100644 --- a/bun.lock +++ b/bun.lock @@ -5,8 +5,9 @@ "": { "name": "person-panel", "dependencies": { + "@libsql/client": "0.17.3", "@nuxt/ui": "4.6.1", - "better-sqlite3": "12.9.0", + "bcryptjs": "^3.0.3", "dotenv": "17.4.1", "drizzle-orm": "0.45.2", "drizzle-pkg": "workspace:*", @@ -25,7 +26,6 @@ "zod": "4.3.6", }, "devDependencies": { - "@types/better-sqlite3": "7.6.13", "@types/multer": "2.1.0", "@types/pg": "8.20.0", "drizzle-kit": "0.31.10", @@ -219,15 +219,15 @@ "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], - "@libsql/client": ["@libsql/client@0.17.2", "", { "dependencies": { "@libsql/core": "^0.17.2", "@libsql/hrana-client": "^0.9.0", "js-base64": "^3.7.5", "libsql": "^0.5.28", "promise-limit": "^2.7.0" } }, "sha512-0aw0S3iQMHvOxfRt5j1atoCCPMT3gjsB2PS8/uxSM1DcDn39xqz6RlgSMxtP8I3JsxIXAFuw7S41baLEw0Zi+Q=="], + "@libsql/client": ["@libsql/client@0.17.3", "", { "dependencies": { "@libsql/core": "^0.17.3", "@libsql/hrana-client": "^0.10.0", "js-base64": "^3.7.5", "libsql": "^0.5.28", "promise-limit": "^2.7.0" } }, "sha512-HXk9wiAoJbKFbyBH4O+aEhN6ir5ERXuXvwE5OD2eR4/5RUa3Pw/8L9zrnVdU+iNJitRvisPWaIwmhkO3bH7giA=="], - "@libsql/core": ["@libsql/core@0.17.2", "", { "dependencies": { "js-base64": "^3.7.5" } }, "sha512-L8qv12HZ/jRBcETVR3rscP0uHNxh+K3EABSde6scCw7zfOdiLqO3MAkJaeE1WovPsjXzsN/JBoZED4+7EZVT3g=="], + "@libsql/core": ["@libsql/core@0.17.3", "", { "dependencies": { "js-base64": "^3.7.5" } }, "sha512-2UjK1i7JBkMduJo4WdvvBxMMvVJ31pArBZNONyz/GCJJAH+1UHat2X6vn10S/WpY5fKzIT98WqYFl2vzWRLOfg=="], "@libsql/darwin-arm64": ["@libsql/darwin-arm64@0.5.29", "", { "os": "darwin", "cpu": "arm64" }, "sha512-K+2RIB1OGFPYQbfay48GakLhqf3ArcbHqPFu7EZiaUcRgFcdw8RoltsMyvbj5ix2fY0HV3Q3Ioa/ByvQdaSM0A=="], "@libsql/darwin-x64": ["@libsql/darwin-x64@0.5.29", "", { "os": "darwin", "cpu": "x64" }, "sha512-OtT+KFHsKFy1R5FVadr8FJ2Bb1mghtXTyJkxv0trocq7NuHntSki1eUbxpO5ezJesDvBlqFjnWaYYY516QNLhQ=="], - "@libsql/hrana-client": ["@libsql/hrana-client@0.9.0", "", { "dependencies": { "@libsql/isomorphic-ws": "^0.1.5", "cross-fetch": "^4.0.0", "js-base64": "^3.7.5", "node-fetch": "^3.3.2" } }, "sha512-pxQ1986AuWfPX4oXzBvLwBnfgKDE5OMhAdR/5cZmRaB4Ygz5MecQybvwZupnRz341r2CtFmbk/BhSu7k2Lm+Jw=="], + "@libsql/hrana-client": ["@libsql/hrana-client@0.10.0", "", { "dependencies": { "@libsql/isomorphic-ws": "^0.1.5", "js-base64": "^3.7.5" } }, "sha512-OoA4EMqRAC7kn7V2P6EQqRcpZf2W+AjsNIyCizBg339Tq/aMC7sRnzs3SklderhmQWAqEzvv8A2vhxVmWpkVvw=="], "@libsql/isomorphic-ws": ["@libsql/isomorphic-ws@0.1.5", "", { "dependencies": { "@types/ws": "^8.5.4", "ws": "^8.13.0" } }, "sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg=="], @@ -799,6 +799,8 @@ "baseline-browser-mapping": ["baseline-browser-mapping@2.10.17", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-HdrkN8eVG2CXxeifv/VdJ4A4RSra1DTW8dc/hdxzhGHN8QePs6gKaWM9pHPcpCoxYZJuOZ8drHmbdpLHjCYjLA=="], + "bcryptjs": ["bcryptjs@3.0.3", "", { "bin": { "bcrypt": "bin/bcrypt" } }, "sha512-GlF5wPWnSa/X5LKM1o0wz0suXIINz1iHRLvTS+sLyi7XPbe5ycmYI3DlZqVGZZtDgl4DmasFg7gOB3JYbphV5g=="], + "better-sqlite3": ["better-sqlite3@12.9.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-wqUv4Gm3toFpHDQmaKD4QhZm3g1DjUBI0yzS4UBl6lElUmXFYdTQmmEDpAFa5o8FiFiymURypEnfVHzILKaxqQ=="], "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], @@ -815,7 +817,7 @@ "browserslist": ["browserslist@4.28.2", "", { "dependencies": { "baseline-browser-mapping": "^2.10.12", "caniuse-lite": "^1.0.30001782", "electron-to-chromium": "^1.5.328", "node-releases": "^2.0.36", "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg=="], - "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], "buffer-crc32": ["buffer-crc32@1.0.0", "", {}, "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w=="], @@ -877,8 +879,6 @@ "croner": ["croner@10.0.1", "", {}, "sha512-ixNtAJndqh173VQ4KodSdJEI6nuioBWI0V1ITNKhZZsO0pEMoDxz539T4FTTbSZ/xIOSuDnzxLVRqBVSvPNE2g=="], - "cross-fetch": ["cross-fetch@4.1.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-uKm5PU+MHTootlWEY+mZ4vvXoCn4fLQxT9dSc1sXVMSFkINTJVN8cAQROpwcKm8bJ/c7rgZVIBWzH5T78sNZZw=="], - "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], "crossws": ["crossws@0.3.5", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-ojKiDvcmByhwa8YYqbQI/hg7MEU0NC03+pSdEq4ZUnZR9xXpwk7E43SMNGkn+JxJGPFtNvQ48+vV2p+P1ml5PA=="], @@ -903,8 +903,6 @@ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="], - "date-format": ["date-format@4.0.14", "", {}, "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg=="], "db0": ["db0@0.3.4", "", { "peerDependencies": { "@electric-sql/pglite": "*", "@libsql/client": "*", "better-sqlite3": "*", "drizzle-orm": "*", "mysql2": "*", "sqlite3": "*" }, "optionalPeers": ["@electric-sql/pglite", "@libsql/client", "better-sqlite3", "drizzle-orm", "mysql2", "sqlite3"] }, "sha512-RiXXi4WaNzPTHEOu8UPQKMooIbqOEyqA1t7Z6MsdxSCeb8iUC9ko3LcmsLmeUt2SM5bctfArZKkRQggKZz7JNw=="], @@ -931,7 +929,7 @@ "destr": ["destr@2.0.5", "", {}, "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA=="], - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="], "devalue": ["devalue@5.7.1", "", {}, "sha512-MUbZ586EgQqdRnC4yDrlod3BEdyvE4TapGYHMW2CiaW+KkkFmWEFqBUaLltEZCGi0iFXCEjRF0OjF0DV2QHjOA=="], @@ -1041,8 +1039,6 @@ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], - "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "^1.0.0", "web-streams-polyfill": "^3.0.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="], - "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], @@ -1057,8 +1053,6 @@ "foreground-child": ["foreground-child@3.3.1", "", { "dependencies": { "cross-spawn": "^7.0.6", "signal-exit": "^4.0.1" } }, "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw=="], - "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "^3.1.2" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="], - "fraction.js": ["fraction.js@5.3.4", "", {}, "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ=="], "framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="], @@ -1339,9 +1333,7 @@ "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="], - - "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "^4.0.0", "fetch-blob": "^3.1.4", "formdata-polyfill": "^4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="], + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], "node-fetch-native": ["node-fetch-native@1.6.7", "", {}, "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q=="], @@ -1829,8 +1821,6 @@ "w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="], - "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="], - "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], @@ -1891,7 +1881,7 @@ "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "@mapbox/node-pre-gyp/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + "@mapbox/node-pre-gyp/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "@nuxt/cli/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], @@ -1905,6 +1895,8 @@ "@nuxtjs/color-mode/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + "@parcel/watcher/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "@parcel/watcher-wasm/napi-wasm": ["napi-wasm@1.1.3", "", { "bundled": true }, "sha512-h/4nMGsHjZDCYmQVNODIrYACVJ+I9KItbG+0si6W/jSjdA9JbWDoU4LLeMXVcEQGHjttI2tuXqDrbGF7qkUHHg=="], "@rollup/plugin-commonjs/estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], @@ -1951,14 +1943,14 @@ "archiver-utils/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], + "bl/buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], + "compress-commons/is-stream": ["is-stream@2.0.1", "", {}, "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="], "compress-commons/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], "crc32-stream/readable-stream": ["readable-stream@4.7.0", "", { "dependencies": { "abort-controller": "^3.0.0", "buffer": "^6.0.3", "events": "^3.3.0", "process": "^0.11.10", "string_decoder": "^1.3.0" } }, "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg=="], - "cross-fetch/node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], "csso/css-tree": ["css-tree@2.2.1", "", { "dependencies": { "mdn-data": "2.0.28", "source-map-js": "^1.0.1" } }, "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA=="], @@ -1975,7 +1967,7 @@ "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], - "libsql/detect-libc": ["detect-libc@2.0.2", "", {}, "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw=="], + "lightningcss/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], "magic-regexp/unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="], @@ -1991,6 +1983,8 @@ "npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], + "prebuild-install/detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "prosemirror-trailing-node/escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], "readdir-glob/minimatch": ["minimatch@5.1.9", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw=="], @@ -2107,14 +2101,6 @@ "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "archiver-utils/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "archiver/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "compress-commons/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - - "crc32-stream/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], "csso/css-tree/mdn-data": ["mdn-data@2.0.28", "", {}, "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g=="], @@ -2357,8 +2343,6 @@ "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "zip-stream/readable-stream/buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], - "archiver-utils/glob/minimatch/brace-expansion": ["brace-expansion@2.0.3", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA=="], "archiver-utils/glob/path-scurry/lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], diff --git a/package.json b/package.json index 85b200f..4ce7a81 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,7 @@ "scripts": { "build": "nuxt build && bun run cp:db && bun --elide-lines=0 --filter drizzle-pkg build", "dev": "nuxt dev", - "deploy": "bash scripts/deploy-gitea.sh", "cp:db": "bash scripts/mv.sh", - "migrate:test": "sh scripts/migrate-test.sh", "db:migrate": "bun --elide-lines=0 --filter drizzle-pkg migrate", "db:generate": "bun --elide-lines=0 --filter drizzle-pkg generate", "db:seed": "bun --elide-lines=0 --filter drizzle-pkg seed", @@ -20,8 +18,9 @@ "postinstall": "nuxt prepare" }, "dependencies": { + "@libsql/client": "0.17.3", "@nuxt/ui": "4.6.1", - "better-sqlite3": "12.9.0", + "bcryptjs": "3.0.3", "dotenv": "17.4.1", "drizzle-orm": "0.45.2", "drizzle-pkg": "workspace:*", @@ -32,7 +31,6 @@ "mime": "4.1.0", "multer": "2.1.1", "nuxt": "4.4.2", - "pg": "8.20.0", "tailwindcss": "4.2.2", "ufo": "1.6.3", "vue": "3.5.32", @@ -40,9 +38,7 @@ "zod": "4.3.6" }, "devDependencies": { - "@types/better-sqlite3": "7.6.13", "@types/multer": "2.1.0", - "@types/pg": "8.20.0", "drizzle-kit": "0.31.10", "tsx": "4.21.0", "typescript": "6.0.2" diff --git a/packages/drizzle-pkg/db.sqlite b/packages/drizzle-pkg/db.sqlite new file mode 100644 index 0000000..fff6c52 Binary files /dev/null and b/packages/drizzle-pkg/db.sqlite differ diff --git a/packages/drizzle-pkg/drizzle.config.ts b/packages/drizzle-pkg/drizzle.config.ts index b7b9a4f..79cd1cd 100644 --- a/packages/drizzle-pkg/drizzle.config.ts +++ b/packages/drizzle-pkg/drizzle.config.ts @@ -3,8 +3,8 @@ import { defineConfig } from 'drizzle-kit'; export default defineConfig({ out: './migrations', - schema: './database/pg/schema/*', - dialect: 'postgresql', + schema: './lib/schema/*', + dialect: 'sqlite', dbCredentials: { url: process.env.DATABASE_URL! }, diff --git a/packages/drizzle-pkg/env.ts b/packages/drizzle-pkg/env.ts index fcbc531..92a311f 100644 --- a/packages/drizzle-pkg/env.ts +++ b/packages/drizzle-pkg/env.ts @@ -2,4 +2,3 @@ import { config } from 'dotenv'; config({ path: '../../.env' }); -console.log(process.env); diff --git a/packages/drizzle-pkg/lib/db.ts b/packages/drizzle-pkg/lib/db.ts index 5456678..2144ddc 100644 --- a/packages/drizzle-pkg/lib/db.ts +++ b/packages/drizzle-pkg/lib/db.ts @@ -1,9 +1,10 @@ -import { drizzle } from "drizzle-orm/better-sqlite3"; +import { drizzle } from "drizzle-orm/libsql"; +import { createClient } from "@libsql/client"; import { resolveSqliteDatabaseUrl } from "./resolve-sqlite-url"; if (process.env.NODE_ENV === "production") { // 打包时需要保证migrator被引入 - import("drizzle-orm/better-sqlite3/migrator"); + import("drizzle-orm/libsql/migrator"); } const rawUrl = process.env.DATABASE_URL; @@ -13,11 +14,8 @@ if (!rawUrl) { const resolvedUrl = resolveSqliteDatabaseUrl(rawUrl); process.env.DATABASE_URL = resolvedUrl; -// better-sqlite3 需要裸文件路径;`file:` 前缀仍保留在 DATABASE_URL 供 drizzle-kit 等使用 -const sqlitePath = resolvedUrl.startsWith("file:") - ? resolvedUrl.slice("file:".length) - : resolvedUrl; +const client = createClient({ url: resolvedUrl }); -const _db = drizzle(sqlitePath); +const _db = drizzle(client); export { _db as dbGlobal }; diff --git a/packages/drizzle-pkg/lib/schema/auth.ts b/packages/drizzle-pkg/lib/schema/auth.ts index b031189..4eb2bb2 100644 --- a/packages/drizzle-pkg/lib/schema/auth.ts +++ b/packages/drizzle-pkg/lib/schema/auth.ts @@ -9,14 +9,6 @@ export const users = sqliteTable("users", { avatar: text(), role: text().notNull().default("user"), status: text().notNull().default("active"), - publicSlug: text("public_slug").unique(), - bioMarkdown: text("bio_markdown"), - bioVisibility: text("bio_visibility").notNull().default("private"), - socialLinksJson: text("social_links_json").notNull().default("[]"), - avatarVisibility: text("avatar_visibility").notNull().default("private"), - discoverVisible: integer("discover_visible", { mode: "boolean" }).notNull().default(true), - discoverLocation: text("discover_location"), - discoverShowLocation: integer("discover_show_location", { mode: "boolean" }).notNull().default(false), createdAt: integer("created_at", { mode: "timestamp_ms" }).defaultNow().notNull(), updatedAt: integer("updated_at", { mode: "timestamp_ms" }) .defaultNow() diff --git a/packages/drizzle-pkg/migrations/0000_huge_sage.sql b/packages/drizzle-pkg/migrations/0000_huge_sage.sql new file mode 100644 index 0000000..7afe7ca --- /dev/null +++ b/packages/drizzle-pkg/migrations/0000_huge_sage.sql @@ -0,0 +1,23 @@ +CREATE TABLE `users` ( + `id` integer PRIMARY KEY NOT NULL, + `username` text NOT NULL, + `email` text, + `nickname` text, + `password` text NOT NULL, + `avatar` text, + `role` text DEFAULT 'user' NOT NULL, + `status` text DEFAULT 'active' NOT NULL, + `public_slug` text, + `bio_markdown` text, + `bio_visibility` text DEFAULT 'private' NOT NULL, + `social_links_json` text DEFAULT '[]' NOT NULL, + `avatar_visibility` text DEFAULT 'private' NOT NULL, + `discover_visible` integer DEFAULT true NOT NULL, + `discover_location` text, + `discover_show_location` integer DEFAULT false NOT NULL, + `created_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL, + `updated_at` integer DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer)) NOT NULL +); +--> statement-breakpoint +CREATE UNIQUE INDEX `users_username_unique` ON `users` (`username`);--> statement-breakpoint +CREATE UNIQUE INDEX `users_public_slug_unique` ON `users` (`public_slug`); \ No newline at end of file diff --git a/packages/drizzle-pkg/migrations/0000_init.sql b/packages/drizzle-pkg/migrations/0000_init.sql deleted file mode 100644 index 74bd058..0000000 --- a/packages/drizzle-pkg/migrations/0000_init.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE "users" ( - "id" integer PRIMARY KEY NOT NULL, - "username" varchar NOT NULL, - "email" varchar, - "nickname" varchar, - "password" varchar NOT NULL, - "avatar" varchar, - "created_at" timestamp DEFAULT now() NOT NULL, - "updated_at" timestamp DEFAULT now() NOT NULL, - CONSTRAINT "users_username_unique" UNIQUE("username") -); diff --git a/packages/drizzle-pkg/migrations/meta/0000_snapshot.json b/packages/drizzle-pkg/migrations/meta/0000_snapshot.json index ac0b164..922fa9d 100644 --- a/packages/drizzle-pkg/migrations/meta/0000_snapshot.json +++ b/packages/drizzle-pkg/migrations/meta/0000_snapshot.json @@ -1,90 +1,178 @@ { - "id": "25840823-aa2a-4e32-a6b6-70bb1e27348e", + "version": "6", + "dialect": "sqlite", + "id": "b0a44e8d-8950-4409-8ca7-97ef171c2ec8", "prevId": "00000000-0000-0000-0000-000000000000", - "version": "7", - "dialect": "postgresql", "tables": { - "public.users": { + "users": { "name": "users", - "schema": "", "columns": { "id": { "name": "id", "type": "integer", "primaryKey": true, - "notNull": true + "notNull": true, + "autoincrement": false }, "username": { "name": "username", - "type": "varchar", + "type": "text", "primaryKey": false, - "notNull": true + "notNull": true, + "autoincrement": false }, "email": { "name": "email", - "type": "varchar", + "type": "text", "primaryKey": false, - "notNull": false + "notNull": false, + "autoincrement": false }, "nickname": { "name": "nickname", - "type": "varchar", + "type": "text", "primaryKey": false, - "notNull": false + "notNull": false, + "autoincrement": false }, "password": { "name": "password", - "type": "varchar", + "type": "text", "primaryKey": false, - "notNull": true + "notNull": true, + "autoincrement": false }, "avatar": { "name": "avatar", - "type": "varchar", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "role": { + "name": "role", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'user'" + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'active'" + }, + "public_slug": { + "name": "public_slug", + "type": "text", "primaryKey": false, - "notNull": false + "notNull": false, + "autoincrement": false + }, + "bio_markdown": { + "name": "bio_markdown", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "bio_visibility": { + "name": "bio_visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'private'" + }, + "social_links_json": { + "name": "social_links_json", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'[]'" + }, + "avatar_visibility": { + "name": "avatar_visibility", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'private'" + }, + "discover_visible": { + "name": "discover_visible", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": true + }, + "discover_location": { + "name": "discover_location", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "discover_show_location": { + "name": "discover_show_location", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false }, "created_at": { "name": "created_at", - "type": "timestamp", + "type": "integer", "primaryKey": false, "notNull": true, - "default": "now()" + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" }, "updated_at": { "name": "updated_at", - "type": "timestamp", + "type": "integer", "primaryKey": false, "notNull": true, - "default": "now()" + "autoincrement": false, + "default": "(cast((julianday('now') - 2440587.5)*86400000 as integer))" } }, - "indexes": {}, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": { + "indexes": { "users_username_unique": { "name": "users_username_unique", - "nullsNotDistinct": false, "columns": [ "username" - ] + ], + "isUnique": true + }, + "users_public_slug_unique": { + "name": "users_public_slug_unique", + "columns": [ + "public_slug" + ], + "isUnique": true } }, - "policies": {}, - "checkConstraints": {}, - "isRLSEnabled": false + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} } }, - "enums": {}, - "schemas": {}, - "sequences": {}, - "roles": {}, - "policies": {}, "views": {}, + "enums": {}, "_meta": { - "columns": {}, "schemas": {}, - "tables": {} + "tables": {}, + "columns": {} + }, + "internal": { + "indexes": {} } } \ No newline at end of file diff --git a/packages/drizzle-pkg/migrations/meta/_journal.json b/packages/drizzle-pkg/migrations/meta/_journal.json index b60f9b1..6719e86 100644 --- a/packages/drizzle-pkg/migrations/meta/_journal.json +++ b/packages/drizzle-pkg/migrations/meta/_journal.json @@ -1,12 +1,12 @@ { "version": "7", - "dialect": "postgresql", + "dialect": "sqlite", "entries": [ { "idx": 0, - "version": "7", - "when": 1776329125490, - "tag": "0000_init", + "version": "6", + "when": 1778727736262, + "tag": "0000_huge_sage", "breakpoints": true } ] diff --git a/scripts/deploy-gitea.sh b/scripts/deploy-gitea.sh deleted file mode 100644 index 65dd28d..0000000 --- a/scripts/deploy-gitea.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env sh - -# 配置区(只改这里) -GIT_REPO_URL="ssh://root@git.xieyaxin.top:8892/topuser/nuxt4-demo.git" -PROD_BRANCH="deploy" # 你要存放产物的分支名(会自动创建) -BUILD_FOLDER=".output" # 打包产物目录 -ARCHIVE_NAME="build-output.tar.gz" -ARCHIVE_PATH=".tmp_${ARCHIVE_NAME}" -COMMIT_MSG="deploy: build at $(date +'%Y-%m-%d %H:%M:%S')" - -# 1. 先打包 -echo "📦 构建项目..." -bun run build - -# 2. 克隆远程产物分支到临时目录 -echo "⬇️ 拉取产物分支..." -git clone --single-branch --branch $PROD_BRANCH $GIT_REPO_URL .tmp_dist || { - echo "🆕 分支不存在,创建新分支..." - mkdir .tmp_dist - cd .tmp_dist - git init - git checkout -b $PROD_BRANCH - git remote add origin $GIT_REPO_URL - cd .. -} - -# 3. 压缩构建产物 -echo "🗜️ 压缩构建目录..." -tar -czf "$ARCHIVE_PATH" -C "$BUILD_FOLDER" . - -# 4. 删除旧产物,复制新产物 -echo "♻️ 更新产物文件..." -rm -rf .tmp_dist/* -cp -r $BUILD_FOLDER/.drone.yml .tmp_dist/.drone.yml -cp "$ARCHIVE_PATH" ".tmp_dist/$ARCHIVE_NAME" - -# 5. 提交并推送 -cd .tmp_dist -git add -A -git commit -m "$COMMIT_MSG" - -echo "🚀 推送到远程分支 $PROD_BRANCH..." -git push origin $PROD_BRANCH - -# 6. 清理临时文件 -cd .. -rm -rf .tmp_dist -rm -f "$ARCHIVE_PATH" - -echo "✅ 发布完成!" \ No newline at end of file diff --git a/scripts/deploy-gitee.sh b/scripts/deploy-gitee.sh deleted file mode 100644 index a5f0055..0000000 --- a/scripts/deploy-gitee.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env sh - -# 配置区(只改这里) -GIT_REPO_URL="git@gitee.com:xieyaxin/nuxt4-demo.git" -PROD_BRANCH="deploy" # 你要存放产物的分支名(会自动创建) -BUILD_FOLDER=".output" # 打包产物目录 -ARCHIVE_NAME="build-output.tar.gz" -ARCHIVE_PATH=".tmp_${ARCHIVE_NAME}" -COMMIT_MSG="deploy: build at $(date +'%Y-%m-%d %H:%M:%S')" - -# 1. 先打包 -echo "📦 构建项目..." -bun run build - -# 2. 克隆远程产物分支到临时目录 -echo "⬇️ 拉取产物分支..." -git clone --single-branch --branch $PROD_BRANCH $GIT_REPO_URL .tmp_dist || { - echo "🆕 分支不存在,创建新分支..." - mkdir .tmp_dist - cd .tmp_dist - git init - git checkout -b $PROD_BRANCH - git remote add origin $GIT_REPO_URL - cd .. -} - -# 3. 压缩构建产物 -echo "🗜️ 压缩构建目录..." -tar -czf "$ARCHIVE_PATH" -C "$BUILD_FOLDER" . - -# 4. 删除旧产物,复制新产物 -echo "♻️ 更新产物文件..." -rm -rf .tmp_dist/* -cp -r $BUILD_FOLDER/.drone.yml .tmp_dist/.drone.yml -cp "$ARCHIVE_PATH" ".tmp_dist/$ARCHIVE_NAME" - -# 5. 提交并推送 -cd .tmp_dist -git add -A -git commit -m "$COMMIT_MSG" - -echo "🚀 推送到远程分支 $PROD_BRANCH..." -git push origin $PROD_BRANCH - -# 6. 清理临时文件 -cd .. -rm -rf .tmp_dist -rm -f "$ARCHIVE_PATH" - -echo "✅ 发布完成!" \ No newline at end of file diff --git a/scripts/migrate-test.sh b/scripts/migrate-test.sh deleted file mode 100644 index 079adc4..0000000 --- a/scripts/migrate-test.sh +++ /dev/null @@ -1,7 +0,0 @@ -if [ -f .env ]; then - export $(grep -v '^#' .env | xargs) -fi - -echo "DATABASE_URL: $DATABASE_URL" - -node build-files/migrate/sqlite3.js packages/drizzle-pkg/migrations diff --git a/scripts/mv.sh b/scripts/mv.sh index 3d499c4..2852910 100644 --- a/scripts/mv.sh +++ b/scripts/mv.sh @@ -8,4 +8,4 @@ cp build-files/run.sh .output/run.sh mkdir .output/server/migrate cp -r build-files/migrate/* .output/server/migrate/ mkdir .output/server/seed -cp -r build-files/* .output/server/seed/ \ No newline at end of file +cp -r build-files/seed/* .output/server/seed/ \ No newline at end of file diff --git a/server/api/hello.get.ts b/server/api/hello.get.ts index 298e111..df2bb4a 100644 --- a/server/api/hello.get.ts +++ b/server/api/hello.get.ts @@ -1,14 +1,11 @@ +import { getUsers } from "../service/auth" +import { compare, hash } from "bcryptjs"; export default defineWrappedResponseHandler(async (event) => { + compare + const users = await getUsers() return R.success({ hello: "aa", - users: [ - { - id: 1, - name: "aaa", - email: "aaa", - age: 23, - } - ] + users: users }) }) \ No newline at end of file diff --git a/server/service/auth/index.ts b/server/service/auth/index.ts index c5ad8f6..7751318 100644 --- a/server/service/auth/index.ts +++ b/server/service/auth/index.ts @@ -1,11 +1,11 @@ import { dbGlobal } from "drizzle-pkg/lib/db"; -import { usersTable } from "drizzle-pkg/lib/schema/schema"; +import { users as usersTable } from "drizzle-pkg/lib/schema/auth"; import { eq } from "drizzle-orm"; import log4js from "logger"; const logger = log4js.getLogger("AUTH") -export async function getUsers(id: number) { +export async function getUsers() { const users = await dbGlobal.select().from(usersTable) logger.info("users (formatted): %s \n", JSON.stringify(users, null, 2)); return users;