diff --git a/README.md b/README.md index 74872fd..95b8b9b 100644 --- a/README.md +++ b/README.md @@ -1,50 +1,7 @@ -# React + TypeScript + Vite +# Nezha Admin Frontend -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. +## Bootstrap -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: - -- Configure the top-level `parserOptions` property like this: - -```js -export default tseslint.config({ - languageOptions: { - // other options... - parserOptions: { - project: ['./tsconfig.node.json', './tsconfig.app.json'], - tsconfigRootDir: import.meta.dirname, - }, - }, -}) -``` - -- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` -- Optionally add `...tseslint.configs.stylisticTypeChecked` -- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: - -```js -// eslint.config.js -import react from 'eslint-plugin-react' - -export default tseslint.config({ - // Set the react version - settings: { react: { version: '18.3' } }, - plugins: { - // Add the react plugin - react, - }, - rules: { - // other rules... - // Enable its recommended rules - ...react.configs.recommended.rules, - ...react.configs['jsx-runtime'].rules, - }, -}) +```bash +npx swagger-typescript-api -p http://localhost:8008/swagger/doc.json -o ./src/types -n api.ts --no-client --union-enums ``` diff --git a/package-lock.json b/package-lock.json index 0ebb9d5..82203c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,6 +44,7 @@ "eslint-plugin-react-refresh": "^0.4.14", "globals": "^15.11.0", "postcss": "^8.4.47", + "swagger-typescript-api": "^13.0.22", "tailwindcss": "^3.4.14", "typescript": "~5.6.2", "typescript-eslint": "^8.11.0", @@ -886,6 +887,13 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@exodus/schemasafe": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz", + "integrity": "sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==", + "dev": true, + "license": "MIT" + }, "node_modules/@floating-ui/core": { "version": "1.6.8", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz", @@ -2198,6 +2206,13 @@ "@types/react": "*" } }, + "node_modules/@types/swagger-schema-official": { + "version": "2.0.25", + "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.25.tgz", + "integrity": "sha512-T92Xav+Gf/Ik1uPW581nA+JftmjWPgskw/WBf4TJzxRG/SJ+DfNnNE+WuZ4mrXuzflQMqMkm1LSYjzYW7MB1Cg==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.12.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.12.2.tgz", @@ -2683,6 +2698,13 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/call-me-maybe": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", + "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", + "dev": true, + "license": "MIT" + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2803,6 +2825,84 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -2846,6 +2946,16 @@ "dev": true, "license": "MIT" }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -2853,6 +2963,33 @@ "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2948,6 +3085,33 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "license": "MIT" }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true, + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -3188,6 +3352,19 @@ "node": ">=0.10.0" } }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3237,6 +3414,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "dev": true, + "license": "MIT" + }, "node_modules/fastq": { "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", @@ -3372,6 +3556,16 @@ "node": ">=6.9.0" } }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-nonce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", @@ -3479,6 +3673,13 @@ "node": ">= 0.4" } }, + "node_modules/http2-client": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz", + "integrity": "sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==", + "dev": true, + "license": "MIT" + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3525,6 +3726,13 @@ "loose-envify": "^1.0.0" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3691,6 +3899,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -3773,6 +3988,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -3908,6 +4130,50 @@ "react-dom": "^16.8 || ^17 || ^18" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch-h2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz", + "integrity": "sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "http2-client": "^1.2.5" + }, + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-readfiles": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz", + "integrity": "sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es6-promise": "^3.2.1" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -3934,6 +4200,111 @@ "node": ">=0.10.0" } }, + "node_modules/oas-kit-common": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz", + "integrity": "sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "fast-safe-stringify": "^2.0.7" + } + }, + "node_modules/oas-linter": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz", + "integrity": "sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@exodus/schemasafe": "^1.0.0-rc.2", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-resolver": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz", + "integrity": "sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "node-fetch-h2": "^2.3.0", + "oas-kit-common": "^1.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "resolve": "resolve.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/oas-schema-walker": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz", + "integrity": "sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz", + "integrity": "sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "oas-kit-common": "^1.0.8", + "oas-linter": "^3.2.2", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "reftools": "^1.1.9", + "should": "^13.2.1", + "yaml": "^1.10.0" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -4021,6 +4392,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -4269,6 +4659,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -4473,6 +4879,26 @@ "node": ">=8.10.0" } }, + "node_modules/reftools": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz", + "integrity": "sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==", + "dev": true, + "license": "BSD-3-Clause", + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -4611,6 +5037,66 @@ "node": ">=8" } }, + "node_modules/should": { + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", + "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-equal": "^2.0.0", + "should-format": "^3.0.3", + "should-type": "^1.4.0", + "should-type-adaptors": "^1.0.1", + "should-util": "^1.0.0" + } + }, + "node_modules/should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.4.0" + } + }, + "node_modules/should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-type-adaptors": "^1.0.1" + } + }, + "node_modules/should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/should-type-adaptors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", + "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "should-type": "^1.3.0", + "should-util": "^1.0.0" + } + }, + "node_modules/should-util": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", + "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", + "dev": true, + "license": "MIT" + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -4798,6 +5284,93 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swagger-schema-official": { + "version": "2.0.0-bab6bed", + "resolved": "https://registry.npmjs.org/swagger-schema-official/-/swagger-schema-official-2.0.0-bab6bed.tgz", + "integrity": "sha512-rCC0NWGKr/IJhtRuPq/t37qvZHI/mH4I4sxflVM+qgVe5Z2uOCivzWaVbuioJaB61kvm5UvB7b49E+oBY0M8jA==", + "dev": true, + "license": "ISC" + }, + "node_modules/swagger-typescript-api": { + "version": "13.0.22", + "resolved": "https://registry.npmjs.org/swagger-typescript-api/-/swagger-typescript-api-13.0.22.tgz", + "integrity": "sha512-LVLOWvozOE3izesDrfmhOpwr6XsCRGsrfJuAXsaHkzQxYPAcpSRIAzodmz1hcGJ8BOPiBCKocH1LQ96F0lmmAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/swagger-schema-official": "^2.0.25", + "consola": "^3.2.3", + "cosmiconfig": "^9.0.0", + "didyoumean": "^1.2.2", + "eta": "^2.2.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "nanoid": "^3.3.7", + "prettier": "~3.3.3", + "swagger-schema-official": "2.0.0-bab6bed", + "swagger2openapi": "^7.0.8", + "typescript": "~5.5.4" + }, + "bin": { + "sta": "dist/cli.js", + "swagger-typescript-api": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/swagger-typescript-api/node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/swagger2openapi": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz", + "integrity": "sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "call-me-maybe": "^1.0.1", + "node-fetch": "^2.6.1", + "node-fetch-h2": "^2.3.0", + "node-readfiles": "^0.2.0", + "oas-kit-common": "^1.0.8", + "oas-resolver": "^2.5.6", + "oas-schema-walker": "^1.1.5", + "oas-validator": "^5.0.8", + "reftools": "^1.1.9", + "yaml": "^1.10.0", + "yargs": "^17.0.1" + }, + "bin": { + "boast": "boast.js", + "oas-validate": "oas-validate.js", + "swagger2openapi": "swagger2openapi.js" + }, + "funding": { + "url": "https://github.com/Mermade/oas-kit?sponsor=1" + } + }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/swr": { "version": "2.2.5", "resolved": "https://registry.npmjs.org/swr/-/swr-2.2.5.tgz", @@ -4907,6 +5480,13 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, "node_modules/ts-api-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", @@ -5149,6 +5729,24 @@ } } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -5262,6 +5860,16 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", @@ -5281,6 +5889,80 @@ "node": ">= 14" } }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 9867592..03f2228 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,7 @@ "eslint-plugin-react-refresh": "^0.4.14", "globals": "^15.11.0", "postcss": "^8.4.47", + "swagger-typescript-api": "^13.0.22", "tailwindcss": "^3.4.14", "typescript": "~5.6.2", "typescript-eslint": "^8.11.0", diff --git a/src/api/api.ts b/src/api/api.ts index 1788028..592ec00 100644 --- a/src/api/api.ts +++ b/src/api/api.ts @@ -22,6 +22,8 @@ export enum FetcherMethod { DELETE = "DELETE", } +let lastestRefreshTokenAt = 0; + export async function fetcher(method: FetcherMethod, path: string, data?: any): Promise { let response; if (method === FetcherMethod.GET || method === FetcherMethod.DELETE) { @@ -44,6 +46,13 @@ export async function fetcher(method: FetcherMethod, path: string, data?: any if (!responseData.success) { throw new Error(responseData.error); } + + // auto refresh token + if (!lastestRefreshTokenAt || Date.now() - lastestRefreshTokenAt > 1000 * 60 * 60) { + lastestRefreshTokenAt = Date.now(); + fetch("/api/v1/refresh-token") + } + return responseData.data; } diff --git a/src/api/user.ts b/src/api/user.ts index 946ecef..e6c0409 100644 --- a/src/api/user.ts +++ b/src/api/user.ts @@ -1,12 +1,8 @@ -import { User } from "@/types" +import { ModelUser } from "@/types" import { fetcher, FetcherMethod } from "./api" -export const getProfile = async (): Promise => { - return fetcher(FetcherMethod.GET, '/api/v1/profile', null) -} - -export const refreshToken = async (): Promise => { - return fetcher(FetcherMethod.GET, '/api/v1/refresh_token', null) +export const getProfile = async (): Promise => { + return fetcher(FetcherMethod.GET, '/api/v1/profile', null) } export const login = async (username: string, password: string): Promise => { diff --git a/src/components/header.tsx b/src/components/header.tsx index eddf3ed..6a276d3 100644 --- a/src/components/header.tsx +++ b/src/components/header.tsx @@ -13,6 +13,7 @@ import { NzNavigationMenuLink } from "./xui/navigation-menu"; import { DropdownMenu, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger } from "./ui/dropdown-menu"; import { User, LogOut } from "lucide-react"; import { useAuth } from "@/hooks/useAuth"; +import { Link } from "react-router-dom"; export default function Header() { @@ -22,21 +23,21 @@ export default function Header() { - - 哪吒监控 + + 哪吒监控 { profile && <> - - Server + + Server - - Service + + Service diff --git a/src/hooks/useAuth.tsx b/src/hooks/useAuth.tsx index 5d48676..1653b51 100644 --- a/src/hooks/useAuth.tsx +++ b/src/hooks/useAuth.tsx @@ -1,8 +1,8 @@ -import { createContext, useContext, useEffect, useMemo, useRef } from "react"; +import { createContext, useContext, useEffect, useMemo } from "react"; import { useNavigate } from "react-router-dom"; import { useMainStore } from "./useMainStore"; import { AuthContextProps } from "@/types"; -import { getProfile, login as loginRequest, refreshToken } from "@/api/user"; +import { getProfile, login as loginRequest } from "@/api/user"; import { toast } from "sonner"; const AuthContext = createContext({ @@ -16,35 +16,17 @@ export const AuthProvider = ({ children }: { }) => { const profile = useMainStore(store => store.profile) const setProfile = useMainStore(store => store.setProfile) - const initialized = useRef(false) - const lastRefreshedAt = useRef(0) useEffect(() => { - if (initialized.current) { - return - } - initialized.current = true; (async () => { - while (true) { - if (!profile) { - await new Promise((resolve) => setTimeout(resolve, 1000)) - continue - } - if (lastRefreshedAt.current + 1000 * 60 * 10 > Date.now()) { - await new Promise((resolve) => setTimeout(resolve, 1000)) - continue - } - try { - await refreshToken(); - const user = await getProfile(); - setProfile(user); - lastRefreshedAt.current = Date.now(); - } catch (error) { - setProfile(undefined); - } + try { + const user = await getProfile(); + setProfile(user); + } catch (error) { + setProfile(undefined); } })(); - }, [profile]) + }, []) const navigate = useNavigate(); diff --git a/src/types/api.ts b/src/types/api.ts new file mode 100644 index 0000000..b20aa27 --- /dev/null +++ b/src/types/api.ts @@ -0,0 +1,593 @@ +/* eslint-disable */ +/* tslint:disable */ +/* + * --------------------------------------------------------------- + * ## THIS FILE WAS GENERATED VIA SWAGGER-TYPESCRIPT-API ## + * ## ## + * ## AUTHOR: acacode ## + * ## SOURCE: https://github.com/acacode/swagger-typescript-api ## + * --------------------------------------------------------------- + */ + +export interface GithubComNaibaNezhaModelCommonResponseAny { + data?: any; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelAlertRule { + data?: ModelAlertRule[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelCron { + data?: ModelCron[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelDDNSProfile { + data?: ModelDDNSProfile[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelNAT { + data?: ModelNAT[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelNotification { + data?: ModelNotification[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelNotificationGroupResponseItem { + data?: ModelNotificationGroupResponseItem[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelServer { + data?: ModelServer[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelServerGroupResponseItem { + data?: ModelServerGroupResponseItem[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelServiceInfos { + data?: ModelServiceInfos[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayModelUser { + data?: ModelUser[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayString { + data?: string[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseArrayUint64 { + data?: number[]; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseModelConfig { + data?: ModelConfig; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseModelLoginResponse { + data?: ModelLoginResponse; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseModelServiceResponse { + data?: ModelServiceResponse; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseModelUser { + data?: ModelUser; + error?: string; + success?: boolean; +} + +export interface GithubComNaibaNezhaModelCommonResponseUint64 { + data?: number; + error?: string; + success?: boolean; +} + +export interface GormDeletedAt { + time?: string; + /** Valid is true if Time is not NULL */ + valid?: boolean; +} + +export interface ModelAlertRule { + created_at?: string; + deleted_at?: GormDeletedAt; + enable?: boolean; + /** 失败时执行的触发任务id */ + fail_trigger_tasks?: number[]; + id?: number; + name?: string; + /** 该报警规则所在的通知组 */ + notification_group_id?: number; + /** 恢复时执行的触发任务id */ + recover_trigger_tasks?: number[]; + rules?: ModelRule[]; + /** 触发模式: 0-始终触发(默认) 1-单次触发 */ + trigger_mode?: number; + updated_at?: string; +} + +export interface ModelAlertRuleForm { + enable?: boolean; + /** 失败时触发的任务id */ + fail_trigger_tasks?: number[]; + name?: string; + notification_group_id?: number; + /** 恢复时触发的任务id */ + recover_trigger_tasks?: number[]; + rules?: ModelRule[]; + trigger_mode?: number; +} + +export interface ModelConfig { + agent_secret_key?: string; + avg_ping_count?: number; + /** 覆盖范围(0:提醒未被 IgnoredIPNotification 包含的所有服务器; 1:仅提醒被 IgnoredIPNotification 包含的服务器;) */ + cover?: number; + custom_code?: string; + custom_code_dashboard?: string; + /** debug模式开关 */ + debug?: boolean; + dns_servers?: string; + /** IP变更提醒 */ + enable_ip_change_notification?: boolean; + /** 通知信息IP不打码 */ + enable_plain_ip_in_notification?: boolean; + /** 特定服务器IP(多个服务器用逗号分隔) */ + ignored_ip_notification?: string; + /** [ServerID] -> bool(值为true代表当前ServerID在特定服务器列表内) */ + ignored_ip_notification_server_ids?: Record; + install_host?: string; + ip_change_notification_group_id?: number; + jwt_secret_key?: string; + /** 系统语言,默认 zh_CN */ + language?: string; + listen_port?: number; + /** 时区,默认为 Asia/Shanghai */ + location?: string; + site_name?: string; + tls?: boolean; +} + +export interface ModelCreateFMResponse { + session_id?: string; +} + +export interface ModelCreateTerminalResponse { + server_id?: number; + server_name?: string; + session_id?: string; +} + +export interface ModelCron { + command?: string; + /** 计划任务覆盖范围 (0:仅覆盖特定服务器 1:仅忽略特定服务器 2:由触发该计划任务的服务器执行) */ + cover?: number; + created_at?: string; + cron_job_id?: number; + deleted_at?: GormDeletedAt; + id?: number; + /** 最后一次执行时间 */ + last_executed_at?: string; + /** 最后一次执行结果 */ + last_result?: boolean; + name?: string; + /** 指定通知方式的分组 */ + notification_group_id?: number; + /** 推送成功的通知 */ + push_successful?: boolean; + /** 分钟 小时 天 月 星期 */ + scheduler?: string; + servers?: number[]; + /** 0:计划任务 1:触发任务 */ + task_type?: number; + updated_at?: string; +} + +export interface ModelCronForm { + command?: string; + cover?: number; + id?: number; + name?: string; + notification_group_id?: number; + push_successful?: boolean; + scheduler?: string; + servers?: number[]; + /** 0:计划任务 1:触发任务 */ + task_type?: number; +} + +export interface ModelCycleTransferStats { + from?: string; + max?: number; + min?: number; + name?: string; + nextUpdate?: Record; + serverName?: Record; + to?: string; + transfer?: Record; +} + +export interface ModelDDNSForm { + access_id?: string; + access_secret?: string; + domains?: string[]; + enable_ipv4?: boolean; + enable_ipv6?: boolean; + max_retries?: number; + name?: string; + provider?: string; + webhook_headers?: string; + webhook_method?: number; + webhook_request_body?: string; + webhook_request_type?: number; + webhook_url?: string; +} + +export interface ModelDDNSProfile { + access_id?: string; + access_secret?: string; + created_at?: string; + deleted_at?: GormDeletedAt; + domains?: string[]; + enable_ipv4?: boolean; + enable_ipv6?: boolean; + id?: number; + max_retries?: number; + name?: string; + provider?: string; + updated_at?: string; + webhook_headers?: string; + webhook_method?: number; + webhook_request_body?: string; + webhook_request_type?: number; + webhook_url?: string; +} + +export interface ModelHost { + arch?: string; + boot_time?: number; + country_code?: string; + cpu?: string[]; + disk_total?: number; + gpu?: string[]; + ip?: string; + mem_total?: number; + platform?: string; + platform_version?: string; + swap_total?: number; + version?: string; + virtualization?: string; +} + +export interface ModelHostState { + cpu?: number; + disk_used?: number; + gpu?: number[]; + load_1?: number; + load_15?: number; + load_5?: number; + mem_used?: number; + net_in_speed?: number; + net_in_transfer?: number; + net_out_speed?: number; + net_out_transfer?: number; + process_count?: number; + swap_used?: number; + tcp_conn_count?: number; + temperatures?: ModelSensorTemperature[]; + udp_conn_count?: number; + uptime?: number; +} + +export interface ModelLoginRequest { + password?: string; + username?: string; +} + +export interface ModelLoginResponse { + expire?: string; + token?: string; +} + +export interface ModelNAT { + created_at?: string; + deleted_at?: GormDeletedAt; + domain?: string; + host?: string; + id?: number; + name?: string; + serverID?: number; + updated_at?: string; +} + +export interface ModelNATForm { + domain?: string; + host?: string; + name?: string; + server_id?: number; +} + +export interface ModelNotification { + created_at?: string; + deleted_at?: GormDeletedAt; + id?: number; + name?: string; + request_body?: string; + request_header?: string; + request_method?: number; + request_type?: number; + updated_at?: string; + url?: string; + verify_tls?: boolean; +} + +export interface ModelNotificationForm { + name?: string; + request_body?: string; + request_header?: string; + request_method?: number; + request_type?: number; + skip_check?: boolean; + url?: string; + verify_tls?: boolean; +} + +export interface ModelNotificationGroup { + created_at?: string; + deleted_at?: GormDeletedAt; + id?: number; + name?: string; + updated_at?: string; +} + +export interface ModelNotificationGroupForm { + name?: string; + notifications?: number[]; +} + +export interface ModelNotificationGroupResponseItem { + group?: ModelNotificationGroup; + notifications?: number[]; +} + +export interface ModelRule { + /** 覆盖范围 RuleCoverAll/IgnoreAll */ + cover?: number; + /** 流量统计周期 */ + cycle_interval?: number; + /** 流量统计的开始时间 */ + cycle_start?: string; + /** 流量统计周期单位,默认hour,可选(hour, day, week, month, year) */ + cycle_unit?: string; + /** 持续时间 (秒) */ + duration?: number; + /** 覆盖范围的排除 */ + ignore?: Record; + /** 最大阈值 (百分比、字节 kb ÷ 1024) */ + max?: number; + /** 最小阈值 (百分比、字节 kb ÷ 1024) */ + min?: number; + /** + * 指标类型,cpu、memory、swap、disk、net_in_speed、net_out_speed + * net_all_speed、transfer_in、transfer_out、transfer_all、offline + * transfer_in_cycle、transfer_out_cycle、transfer_all_cycle + */ + type?: string; +} + +export interface ModelSensorTemperature { + name?: string; + temperature?: number; +} + +export interface ModelServer { + created_at?: string; + /** DDNS配置 */ + ddns_profiles?: number[]; + deleted_at?: GormDeletedAt; + /** 展示排序,越大越靠前 */ + display_index?: number; + /** 启用DDNS */ + enable_ddns?: boolean; + /** 对游客隐藏 */ + hide_for_guest?: boolean; + host?: ModelHost; + id?: number; + last_active?: string; + name?: string; + /** 管理员可见备注 */ + note?: string; + /** 公开备注 */ + public_note?: string; + state?: ModelHostState; + updated_at?: string; + uuid?: string; +} + +export interface ModelServerForm { + /** DDNS配置 */ + ddns_profiles?: number[]; + /** 展示排序,越大越靠前 */ + display_index?: number; + /** 启用DDNS */ + enable_ddns?: boolean; + /** 对游客隐藏 */ + hide_for_guest?: boolean; + name?: string; + /** 管理员可见备注 */ + note?: string; + /** 公开备注 */ + public_note?: string; +} + +export interface ModelServerGroup { + created_at?: string; + deleted_at?: GormDeletedAt; + id?: number; + name?: string; + updated_at?: string; +} + +export interface ModelServerGroupForm { + name?: string; + servers?: number[]; +} + +export interface ModelServerGroupResponseItem { + group?: ModelServerGroup; + servers?: number[]; +} + +export interface ModelService { + cover?: number; + created_at?: string; + deleted_at?: GormDeletedAt; + duration?: number; + enable_show_in_service?: boolean; + enable_trigger_task?: boolean; + /** 失败时执行的触发任务id */ + fail_trigger_tasks?: number[]; + id?: number; + latency_notify?: boolean; + max_latency?: number; + min_latency?: number; + name?: string; + /** 当前服务监控所属的通知组 ID */ + notification_group_id?: number; + notify?: boolean; + /** 恢复时执行的触发任务id */ + recover_trigger_tasks?: number[]; + skip_servers?: Record; + target?: string; + type?: number; + updated_at?: string; +} + +export interface ModelServiceForm { + cover?: number; + duration?: number; + enable_show_in_service?: boolean; + enable_trigger_task?: boolean; + fail_trigger_tasks?: number[]; + latency_notify?: boolean; + max_latency?: number; + min_latency?: number; + name?: string; + notification_group_id?: number; + notify?: boolean; + recover_trigger_tasks?: number[]; + skip_servers?: Record; + target?: string; + type?: number; +} + +export interface ModelServiceInfos { + avg_delay?: number[]; + created_at?: number[]; + monitor_id?: number; + monitor_name?: string; + server_id?: number; + server_name?: string; +} + +export interface ModelServiceResponse { + cycleTransferStats?: Record; + services?: Record; +} + +export interface ModelServiceResponseItem { + currentDown?: number; + currentUp?: number; + delay?: number[]; + down?: number[]; + service?: ModelService; + totalDown?: number; + totalUp?: number; + up?: number[]; +} + +export interface ModelSettingForm { + cover?: number; + custom_code?: string; + custom_code_dashboard?: string; + custom_nameservers?: string; + enable_ip_change_notification?: boolean; + enable_plain_ip_in_notification?: boolean; + ignored_ip_notification?: string; + install_host?: string; + /** IP变更提醒的通知组 */ + ip_change_notification_group_id?: number; + language?: string; + site_name?: string; +} + +export interface ModelStreamServer { + /** 展示排序,越大越靠前 */ + display_index?: number; + host?: ModelHost; + id?: number; + last_active?: string; + name?: string; + /** 公开备注,只第一个数据包有值 */ + public_note?: string; + state?: ModelHostState; +} + +export interface ModelStreamServerData { + now?: number; + servers?: ModelStreamServer[]; +} + +export interface ModelTerminalForm { + protocol?: string; + server_id?: number; +} + +export interface ModelUser { + created_at?: string; + deleted_at?: GormDeletedAt; + id?: number; + password?: string; + updated_at?: string; + username?: string; +} + +export interface ModelUserForm { + password?: string; + username?: string; +} diff --git a/src/types/authContext.tsx b/src/types/authContext.tsx index 2d1c6da..6d94d85 100644 --- a/src/types/authContext.tsx +++ b/src/types/authContext.tsx @@ -1,7 +1,7 @@ -import { User } from "./user"; +import { ModelUser } from "@/types"; export interface AuthContextProps { - profile: User | undefined; + profile: ModelUser | undefined; login: (username: string, password: string) => void; logout: () => void; } \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts index e967cc0..ae27896 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,4 +1,3 @@ -export * from './server'; -export * from './user'; export * from './mainStore'; -export * from './authContext'; \ No newline at end of file +export * from './authContext'; +export * from './api'; \ No newline at end of file diff --git a/src/types/mainStore.tsx b/src/types/mainStore.tsx index 1b6f99f..1af4c70 100644 --- a/src/types/mainStore.tsx +++ b/src/types/mainStore.tsx @@ -1,6 +1,6 @@ -import { User } from "./user"; +import { ModelUser } from "@/types"; export interface MainStore { - profile: User | undefined; - setProfile: (profile: User | undefined) => void; -} \ No newline at end of file + profile: ModelUser | undefined; + setProfile: (profile: ModelUser | undefined) => void; +} diff --git a/src/types/server.tsx b/src/types/server.tsx deleted file mode 100644 index 8fd78e4..0000000 --- a/src/types/server.tsx +++ /dev/null @@ -1,57 +0,0 @@ -export interface ServerHost { - arch: string; - bootTime: number; - countryCode: string; - cpu: string[]; - diskTotal: number; - gpu: string[]; - memTotal: number; - platform: string; - platformVersion: string; - swapTotal: number; - version: string; - virtualization: string; - ip: string; -} - -export interface ServerTemperature { - name: string; - temperature: number; -} - -export interface ServerState { - cpu: number; - diskUsed: number; - gpu: number[]; - load1: number; - load15: number; - load5: number; - memUsed: number; - netInSpeed: number; - netInTransfer: number; - netOutSpeed: number; - netOutTransfer: number; - processCount: number; - swapUsed: number; - tcpConnCount: number; - temperatures: ServerTemperature[]; - udpConnCount: number; - uptime: number; - updated_at: string; - uuid: string; -} - -export interface Server { - id: number; - name: string; - ddns_profiles: number[]; - created_at: string; - display_index: number; - enable_ddns: boolean; - hide_for_guest: boolean; - host: ServerHost; - last_active: string; - note: string; - public_note: string; - state: ServerState; -} \ No newline at end of file diff --git a/src/types/user.ts b/src/types/user.ts deleted file mode 100644 index da1fa59..0000000 --- a/src/types/user.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface User { - username: string; -} \ No newline at end of file