Browse Source

feat: 增加axios

main
谢亚昕 5 months ago
parent
commit
726773bc34
  1. 3
      package.json
  2. 77
      pnpm-lock.yaml
  3. 62
      src/plugins/http/base.ts
  4. 37
      src/plugins/http/index.ts
  5. 0
      src/plugins/http/plugins.ts
  6. 36
      src/plugins/http/utils.ts

3
package.json

@ -4,7 +4,7 @@
"version": "0.0.0",
"type": "module",
"resolutions": {
"styled-components": "^5"
"styled-components": "^6"
},
"scripts": {
"dev": "vite",
@ -18,6 +18,7 @@
"@blueprintjs/table": "^5.2.5",
"@types/lodash": "^4.17.13",
"@types/react-router-dom": "^5.3.3",
"axios": "^1.7.7",
"framer-motion": "^11.11.17",
"lodash": "^4.17.21",
"normalize.css": "^8.0.1",

77
pnpm-lock.yaml

@ -5,7 +5,7 @@ settings:
excludeLinksFromLockfile: false
overrides:
styled-components: ^5
styled-components: ^6
importers:
@ -26,6 +26,9 @@ importers:
'@types/react-router-dom':
specifier: ^5.3.3
version: 5.3.3
axios:
specifier: ^1.7.7
version: 1.7.7
framer-motion:
specifier: ^11.11.17
version: 11.11.17(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@ -48,7 +51,7 @@ importers:
specifier: ^5.3.4
version: 5.3.4(react@18.3.1)
styled-components:
specifier: ^6.1.13
specifier: ^6
version: 6.1.13(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
devDependencies:
'@eslint/js':
@ -661,6 +664,12 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
axios@1.7.7:
resolution: {integrity: sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==}
bail@2.0.2:
resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
@ -722,6 +731,10 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
combined-stream@1.0.8:
resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
engines: {node: '>= 0.8'}
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
@ -760,6 +773,10 @@ packages:
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
delayed-stream@1.0.0:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
dequal@2.0.3:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
@ -876,6 +893,19 @@ packages:
flatted@3.3.1:
resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
follow-redirects@1.15.9:
resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
engines: {node: '>=4.0'}
peerDependencies:
debug: '*'
peerDependenciesMeta:
debug:
optional: true
form-data@4.0.1:
resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
engines: {node: '>= 6'}
framer-motion@11.11.17:
resolution: {integrity: sha512-O8QzvoKiuzI5HSAHbcYuL6xU+ZLXbrH7C8Akaato4JzQbX2ULNeniqC2Vo5eiCtFktX9XsJ+7nUhxcl2E2IjpA==}
peerDependencies:
@ -1123,6 +1153,14 @@ packages:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
engines: {node: '>=8.6'}
mime-db@1.52.0:
resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
engines: {node: '>= 0.6'}
mime-types@2.1.35:
resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
engines: {node: '>= 0.6'}
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@ -1218,6 +1256,9 @@ packages:
property-information@6.5.0:
resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
proxy-from-env@1.1.0:
resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
punycode@2.3.1:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
@ -1973,6 +2014,16 @@ snapshots:
argparse@2.0.1: {}
asynckit@0.4.0: {}
axios@1.7.7:
dependencies:
follow-redirects: 1.15.9
form-data: 4.0.1
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
bail@2.0.2: {}
balanced-match@1.0.2: {}
@ -2043,6 +2094,10 @@ snapshots:
color-name@1.1.4: {}
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
comma-separated-tokens@2.0.3: {}
concat-map@0.0.1: {}
@ -2079,6 +2134,8 @@ snapshots:
deep-is@0.1.4: {}
delayed-stream@1.0.0: {}
dequal@2.0.3: {}
devlop@1.1.0:
@ -2239,6 +2296,14 @@ snapshots:
flatted@3.3.1: {}
follow-redirects@1.15.9: {}
form-data@4.0.1:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
framer-motion@11.11.17(@emotion/is-prop-valid@1.2.2)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
tslib: 2.6.3
@ -2614,6 +2679,12 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.1
mime-db@1.52.0: {}
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@ -2720,6 +2791,8 @@ snapshots:
property-information@6.5.0: {}
proxy-from-env@1.1.0: {}
punycode@2.3.1: {}
queue-microtask@1.2.3: {}

62
src/plugins/http/base.ts

@ -0,0 +1,62 @@
import axios, { AxiosInstance, CreateAxiosDefaults } from "axios";
import { deepAssign } from "./utils";
export const enum IHttpMethod {
GET = "GET",
POST = "POST",
DELETE = "DELETE",
PUT = "PUT",
}
export enum IHttpContentType {
FORM = "application/x-www-form-urlencoded",
JSON = "application/json",
}
class Plugin {
beforeInit() { }
}
export abstract class PluginsManager {
static #plugins: Plugin[] = []
static use(plugin: Plugin) {
this.#plugins.push(plugin)
}
callPlugin(key: keyof Plugin, ...argus: any[]) {
PluginsManager.#plugins.forEach(p => p[key].apply(this, argus as []))
}
}
export abstract class httpBase extends PluginsManager {
static get method() {
return {
GET: "GET",
POST: "POST",
DELETE: "DELETE",
PUT: "PUT",
}
}
static get contentType() {
return {
FORM: "application/x-www-form-urlencoded",
JSON: "application/json",
}
}
initDefaultConfig: CreateAxiosDefaults = {
baseURL: process.env.VUE_APP_BASEURL,
timeout: 10000,
headers: {
'Content-Type': httpBase.contentType.FORM,
}
}
instance: AxiosInstance | null = null
create<T>(config?: CreateAxiosDefaults<T>) {
this.instance = axios.create(deepAssign<CreateAxiosDefaults<T>>(axios.defaults, this.initDefaultConfig, config ?? {}))
return this.instance
}
}

37
src/plugins/http/index.ts

@ -0,0 +1,37 @@
import { httpBase, PluginsManager } from "./base"
export const enum IHttpMethod {
GET = "GET",
POST = "POST",
DELETE = "DELETE",
PUT = "PUT",
}
export enum IHttpContentType {
FORM = "application/x-www-form-urlencoded",
JSON = "application/json",
}
const FlyPoll: Map<string, any> = new Map()
class Fly extends httpBase {
constructor() {
super()
this.Init()
}
static get(name?: string): Fly {
if (!name) name = "$defalt"
if (!FlyPoll.has(name)) {
FlyPoll.set(name, new Fly())
}
return FlyPoll.get(name)
}
Init() {
this.callPlugin("beforeInit")
this.create()
}
}
Fly.get()

0
src/plugins/http/plugins.ts

36
src/plugins/http/utils.ts

@ -0,0 +1,36 @@
/**
* assign
* @param {Object} target
* @param {...Object} sources
* @return {Object}
*/
export function deepAssign<T = Record<string, any>>(target: T, ...sources: T[]) {
if(target === null) return target;
// 如果目标不是对象或数组,则直接返回以避免错误
if (typeof target !== 'object' || Array.isArray(target)) {
return target;
}
// 遍历源对象列表
sources.forEach(source => {
if (source && typeof source === 'object') {
for (let key in source) {
if (source.hasOwnProperty(key)) {
const value = source[key];
// 如果值是对象或数组,则进行递归拷贝
if (typeof value === 'object' && !Array.isArray(value) && value !== null) {
if (!target[key]) {
target[key] = (Array.isArray(value) ? ([] as any) : {});
}
deepAssign(target[key], value);
} else {
// 否则直接赋值
target[key] = value;
}
}
}
}
});
return target;
}
Loading…
Cancel
Save