diff --git a/.eslintrc.js b/.eslintrc.js index 3b28c11..66f24d5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,57 +1,57 @@ module.exports = { - //root: true 用于指定它是最顶层的配置,即它在任何情况下都会被采用,而不会被继承覆盖 - root: true, - //env 指定代码运行的环境 - env : { - browser: true, - node : true, - es2021 : true, - es6 : true - }, - //extends 指定继承的配置 - extends : ["plugin:vue/essential"], - //plugins 指定使用的插件 - plugins : ["@typescript-eslint"], - // parserOptions 指定解析器选项 - parserOptions: { parser: "babel-eslint" }, - plugins : ["vue"], - // rules 指定自定义的规则 - rules : { - eqeqeq : "off", - curly : "error", - quotes : ["error", "double"], - "arrow-parens" : 0, - "generator-star-spacing" : 0, - "no-unused-vars" : "warn", - "no-debugger" : process.env.NODE_ENV === "production" ? "error" : "off", - indent : [2, 4, { SwitchCase: 1 }], - "space-before-function-paren": ["error", "never"], - "no-constant-condition" : ["warn"], - "no-empty" : ["off"], - "comma-spacing" : ["error", { after: true }], - "key-spacing" : [ - "error", - { - singleLine: {}, - multiLine : { align: "colon" } - } - ], - "object-curly-newline" : ["error", { multiline: true }], - "array-bracket-newline": ["error", { multiline: true }], - curly : ["error", "all"], - quotes : ["error", "double"], - indent : ["error", "tab"], - "brace-style" : ["error", "stroustrup", { allowSingleLine: false }], - "space-infix-ops" : ["error"], - "comma-dangle" : ["warn", "never"] - }, - //overrides 指定某些文件的指定规则 */ - overrides: [ - { - files: ["*.vue"], - rules: { "vue/multi-word-component-names": 0 } - } - ] + //root: true 用于指定它是最顶层的配置,即它在任何情况下都会被采用,而不会被继承覆盖 + root: true, + //env 指定代码运行的环境 + env: { + browser: true, + node: true, + es2021: true, + es6: true, + }, + //extends 指定继承的配置 + extends: ["plugin:vue/essential"], + //plugins 指定使用的插件 + plugins: ["@typescript-eslint"], + // parserOptions 指定解析器选项 + parserOptions: { parser: "babel-eslint" }, + plugins: ["vue"], + // rules 指定自定义的规则 + rules: { + eqeqeq: "off", + curly: "error", + quotes: ["error", "double"], + "arrow-parens": 0, + "generator-star-spacing": 0, + "no-unused-vars": "warn", + "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", + indent: [2, 4, { SwitchCase: 1 }], + "space-before-function-paren": ["error", "never"], + "no-constant-condition": ["warn"], + "no-empty": ["off"], + "comma-spacing": ["error", { after: true }], + "key-spacing": [ + "error", + { + singleLine: {}, + multiLine: { align: "colon" }, + }, + ], + "object-curly-newline": ["error", { multiline: true }], + "array-bracket-newline": ["error", { multiline: true }], + curly: ["error", "all"], + quotes: ["error", "double"], + indent: ["error", "tab"], + "brace-style": ["error", "stroustrup", { allowSingleLine: false }], + "space-infix-ops": ["error"], + "comma-dangle": ["warn", "never"], + }, + //overrides 指定某些文件的指定规则 */ + overrides: [ + { + files: ["*.vue"], + rules: { "vue/multi-word-component-names": 0 }, + }, + ], }; /* diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index fd396c8..e0bcb7b 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -17,23 +17,23 @@ diverse, inclusive, and healthy community. Examples of behavior that contributes to a positive environment for our community include: -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -* Focusing on what is best not just for us as individuals, but for the +- Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: -* The use of sexualized language or imagery, and sexual attention or +- The use of sexualized language or imagery, and sexual attention or advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a +- Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities @@ -106,7 +106,7 @@ Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an +standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within diff --git a/babel.config.js b/babel.config.js index 2dee442..bff6bc7 100644 --- a/babel.config.js +++ b/babel.config.js @@ -1,7 +1,7 @@ const prodPlugins = - process.env.NODE_ENV === "production" ? ["transform-remove-console"] : []; // 判断当前环境是否为生产环境,如果是,则将transform-remove-console加入prodPlugins数组中 + process.env.NODE_ENV === "production" ? ["transform-remove-console"] : []; // 判断当前环境是否为生产环境,如果是,则将transform-remove-console加入prodPlugins数组中 module.exports = { - // 导出配置,使用@vue/cli-plugin-babel/preset作为预设,并将prodPlugins数组中的插件作为插件 - presets: ["@vue/cli-plugin-babel/preset"], - plugins: [...prodPlugins] + // 导出配置,使用@vue/cli-plugin-babel/preset作为预设,并将prodPlugins数组中的插件作为插件 + presets: ["@vue/cli-plugin-babel/preset"], + plugins: [...prodPlugins], }; diff --git a/doc/pull_request_template.md b/doc/pull_request_template.md index 9da6862..391d99e 100644 --- a/doc/pull_request_template.md +++ b/doc/pull_request_template.md @@ -1,10 +1,13 @@ ## 相关问题 + 请在此处链接相关的 issue。(可选) ## 截图 + 如果适用,请添加截图以帮助解释您的更改。(可选) ## 检查清单 + - [x] 我已阅读贡献指南。 - [x] 我已遵循此项目的编码风格规范。 - [x] 我的代码符合必要的文档要求。 @@ -12,4 +15,5 @@ - [x] 我已更新必要的文档内容。 ## 其他信息 + 在此处添加任何其他上下文或信息,以提供有关这个拉取请求的更多详细信息。 diff --git a/public/index.html b/public/index.html index 3e5a139..76b1894 100644 --- a/public/index.html +++ b/public/index.html @@ -1,15 +1,19 @@ - + - - - - + + + + <%= htmlWebpackPlugin.options.title %>
diff --git a/src/App.vue b/src/App.vue index f645798..9444b25 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,10 +1,10 @@ diff --git a/src/api/index.js b/src/api/index.js index 55957b7..910c697 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -4,4 +4,4 @@ import request from "./request"; import mockRequest from "./mockRequest"; export const getData = () => request.get("/getData", { params: { id: 1 } }); -export const postData = () => request.post("/postData", { params: { id: 1 } }); \ No newline at end of file +export const postData = () => request.post("/postData", { params: { id: 1 } }); diff --git a/src/api/localRequest.js b/src/api/localRequest.js index da163ec..8179343 100644 --- a/src/api/localRequest.js +++ b/src/api/localRequest.js @@ -12,30 +12,30 @@ import "/node_modules/nprogress/nprogress.css"; // }); //使用create方法创建axios实例 export const requests = axios.create({ - timeout: 7000, // 请求超时时间 - baseURL: "/ipa", - headers: { "Content-Type": "application/json;charset=UTF-8" } + timeout: 7000, // 请求超时时间 + baseURL: "/ipa", + headers: { "Content-Type": "application/json;charset=UTF-8" }, }); //请求拦截器 requests.interceptors.request.use((config) => { - //进度条开始 - nprogress.start(); - return config; + //进度条开始 + nprogress.start(); + return config; }); //响应拦截器 requests.interceptors.response.use( - (res) => { - //成功的回调函数 - //进度条结束 - nprogress.done(); - return res.data; - }, - (Error) => { - //失败的回调函数 - return Promise.reject(new Error("faile")); - } + (res) => { + //成功的回调函数 + //进度条结束 + nprogress.done(); + return res.data; + }, + (Error) => { + //失败的回调函数 + return Promise.reject(new Error("faile")); + }, ); export default requests; diff --git a/src/api/mockRequest.js b/src/api/mockRequest.js index 1ffd33b..d645ba3 100644 --- a/src/api/mockRequest.js +++ b/src/api/mockRequest.js @@ -12,30 +12,30 @@ import "/node_modules/nprogress/nprogress.css"; // }); //使用create方法创建axios实例 export const requests = axios.create({ - timeout: 7000, // 请求超时时间 - baseURL: "/mock", - headers: { "Content-Type": "application/json;charset=UTF-8" } + timeout: 7000, // 请求超时时间 + baseURL: "/mock", + headers: { "Content-Type": "application/json;charset=UTF-8" }, }); //请求拦截器 requests.interceptors.request.use((config) => { - //进度条开始 - nprogress.start(); - return config; + //进度条开始 + nprogress.start(); + return config; }); //响应拦截器 requests.interceptors.response.use( - (res) => { - //成功的回调函数 - //进度条结束 - nprogress.done(); - return res.data; - }, - (Error) => { - //失败的回调函数 - return Promise.reject(new Error("faile")); - } + (res) => { + //成功的回调函数 + //进度条结束 + nprogress.done(); + return res.data; + }, + (Error) => { + //失败的回调函数 + return Promise.reject(new Error("faile")); + }, ); export default requests; diff --git a/src/api/request.js b/src/api/request.js index 637f3e0..81aad69 100644 --- a/src/api/request.js +++ b/src/api/request.js @@ -5,66 +5,65 @@ import Toast from "@/components/Toast"; // 2.定义 axios 实例 const apiAxios = axios.create({ - timeout : 15000, - headers : { "Content-Type": "application/json;charset=UTF-8" }, - responseType : "json", - // q:为什么这里的baseURL要加上/api?因为在vue.config.js中设置了代理服务器,所以这里的baseURL要加上/api - baseURL : "/api", - transformResponse: [ - function(data) { - try { - data = JSON.parse(data); - } - catch (e) { - console.log(e); - } - return data; - } - ] + timeout: 15000, + headers: { "Content-Type": "application/json;charset=UTF-8" }, + responseType: "json", + // q:为什么这里的baseURL要加上/api?因为在vue.config.js中设置了代理服务器,所以这里的baseURL要加上/api + baseURL: "/api", + transformResponse: [ + function (data) { + try { + data = JSON.parse(data); + } catch (e) { + console.log(e); + } + return data; + }, + ], }); // 3.添加请求拦截器 apiAxios.interceptors.request.use( - (config) => { - NProgress.start(); - return config; - }, - (error) => { - NProgress.done(); - return Promise.reject(error); - } + (config) => { + NProgress.start(); + return config; + }, + (error) => { + NProgress.done(); + return Promise.reject(error); + }, ); // 4.添加响应拦截器 apiAxios.interceptors.response.use( - (response) => { - NProgress.done(); - return response; - }, - (error) => { - // 对响应的常见错误码提示进行封装,使用策略模式优化 - const errorHandle = { - 400: "请求错误", - 401: "未授权,请登录", - 403: "拒绝访问", - 404: `请求地址出错: ${error.response.config.url}`, - 408: "请求超时", - 500: "服务器内部错误", - 501: "服务未实现", - 502: "网关错误", - 503: "服务不可用", - 504: "网关超时", - 505: "HTTP版本不受支持" - }; - error.message = errorHandle[error.response.status] || "未知错误"; + (response) => { + NProgress.done(); + return response; + }, + (error) => { + // 对响应的常见错误码提示进行封装,使用策略模式优化 + const errorHandle = { + 400: "请求错误", + 401: "未授权,请登录", + 403: "拒绝访问", + 404: `请求地址出错: ${error.response.config.url}`, + 408: "请求超时", + 500: "服务器内部错误", + 501: "服务未实现", + 502: "网关错误", + 503: "服务不可用", + 504: "网关超时", + 505: "HTTP版本不受支持", + }; + error.message = errorHandle[error.response.status] || "未知错误"; - NProgress.done(); - // q:在这里使用Toast组件,为什么会报错? - // a:因为Toast组件是在main.js中注册的,而这里是在request.js中使用的,所以会报错 - // 解决办法:将Toast组件封装成一个插件,然后在main.js中注册插件 - Toast.methods.show("error", `${error.message}`); - return Promise.reject(error); - } + NProgress.done(); + // q:在这里使用Toast组件,为什么会报错? + // a:因为Toast组件是在main.js中注册的,而这里是在request.js中使用的,所以会报错 + // 解决办法:将Toast组件封装成一个插件,然后在main.js中注册插件 + Toast.methods.show("error", `${error.message}`); + return Promise.reject(error); + }, ); // 5.导出axios实例 export default apiAxios; diff --git a/src/assets/scss/_reset.scss b/src/assets/scss/_reset.scss index 79f6ba8..e091af7 100644 --- a/src/assets/scss/_reset.scss +++ b/src/assets/scss/_reset.scss @@ -29,8 +29,8 @@ input, button, textarea, menu { - margin: 0; - padding: 0; + margin: 0; + padding: 0; } header, footer, @@ -44,16 +44,16 @@ figure, figcaption, menu, details { - display: block; + display: block; } table { - border-collapse: collapse; - border-spacing: 0; + border-collapse: collapse; + border-spacing: 0; } caption, th { - text-align: left; - font-weight: normal; + text-align: left; + font-weight: normal; } html, body, @@ -61,7 +61,7 @@ fieldset, img, iframe, abbr { - border: 0; + border: 0; } i, cite, @@ -69,36 +69,36 @@ em, var, address, dfn { - font-style: normal; + font-style: normal; } [hidefocus], summary { - outline: 0; + outline: 0; } li { - list-style: none; + list-style: none; } sup, sub { - font-size: 83%; + font-size: 83%; } pre, code, kbd, samp { - font-family: inherit; + font-family: inherit; } textarea { - overflow: auto; - resize: none; + overflow: auto; + resize: none; } label, summary { - cursor: default; + cursor: default; } a, button { - cursor: pointer; + cursor: pointer; } h1, h2, @@ -109,7 +109,7 @@ h6, em, strong, b { - font-weight: bold; + font-weight: bold; } del, ins, @@ -117,7 +117,7 @@ u, s, a, a:hover { - text-decoration: none; + text-decoration: none; } body, textarea, @@ -126,14 +126,18 @@ button, select, keygen, legend { - font: 14px/1.14 arial, "Microsoft Yahei", "WenQuanYi Micro Hei", sans-serif; - color: #666; - outline: 0; + font: + 14px/1.14 arial, + "Microsoft Yahei", + "WenQuanYi Micro Hei", + sans-serif; + color: #666; + outline: 0; } body { - background: #fff; + background: #fff; } a, a:hover { - color: #666; + color: #666; } diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss index 58766fe..7b66c30 100644 --- a/src/assets/scss/_variables.scss +++ b/src/assets/scss/_variables.scss @@ -1,34 +1,33 @@ $content-width: 1226px; $component-height: 32px; -$font-family-medium: 'PingFangSC-Medium', Helvetica, Tahoma, Arial, 'Microsoft YaHei', - 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif; -$font-family-regular: 'PingFangSC-Regular', Helvetica, Tahoma, Arial, 'Microsoft YaHei', - 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif; +$font-family-medium: "PingFangSC-Medium", Helvetica, Tahoma, Arial, + "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif; +$font-family-regular: "PingFangSC-Regular", Helvetica, Tahoma, Arial, + "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif; @mixin font-class($fontFamily, $fontSize, $fontColor, $isBold) { - font-family: $fontFamily; - font-size: $fontSize; - @if $isBold { - font-weight: bold; - } - color: $fontColor; - letter-spacing: 0; + font-family: $fontFamily; + font-size: $fontSize; + @if $isBold { + font-weight: bold; + } + color: $fontColor; + letter-spacing: 0; } @mixin font-large($size: 14px, $color: $white, $isBlod: false) { - @include font-class($font-family-medium, $size, $color, $isBlod); + @include font-class($font-family-medium, $size, $color, $isBlod); } @mixin font-normal($size: 14px, $color: $white, $isBlod: false) { - @include font-class($font-family-regular, $size, $color, $isBlod); + @include font-class($font-family-regular, $size, $color, $isBlod); } /* 居中*/ @mixin center { - position: absolute; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); } - diff --git a/src/assets/scss/global.scss b/src/assets/scss/global.scss index ad26362..4ffda4e 100644 --- a/src/assets/scss/global.scss +++ b/src/assets/scss/global.scss @@ -1,36 +1,36 @@ -@import './_reset.scss'; -@import './_variables.scss'; -@import './color'; +@import "./_reset.scss"; +@import "./_variables.scss"; +@import "./color"; * { - -moz-osx-font-smoothing: grayscale; - -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; } *, *::before, *::after { - box-sizing: content-box; + box-sizing: content-box; } html { - -webkit-tap-highlight-color: transparent; - -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: transparent; + -webkit-text-size-adjust: 100%; } body { - font-family: $font-family-regular; - margin: 0; - padding: 0; - width: 100%; - min-width: $content-width; - height: 100%; - background-color: $white; - color: $black; - font-size: 14px; - line-height: 1.375; + font-family: $font-family-regular; + margin: 0; + padding: 0; + width: 100%; + min-width: $content-width; + height: 100%; + background-color: $white; + color: $black; + font-size: 14px; + line-height: 1.375; } .layout { - width: $content-width; - margin: 0 auto; + width: $content-width; + margin: 0 auto; } diff --git a/src/components/Footer/Footer.vue b/src/components/Footer/Footer.vue index 9d4f517..708ce31 100644 --- a/src/components/Footer/Footer.vue +++ b/src/components/Footer/Footer.vue @@ -1,148 +1,97 @@ + diff --git a/src/components/Toast/index.vue b/src/components/Toast/index.vue index cc94b86..cd8e1ba 100644 --- a/src/components/Toast/index.vue +++ b/src/components/Toast/index.vue @@ -1,91 +1,90 @@ // Toast.vue diff --git a/src/main.js b/src/main.js index 9302d14..922a02b 100644 --- a/src/main.js +++ b/src/main.js @@ -13,11 +13,11 @@ import Toast from "@/components/Toast"; Vue.component("Toast", Toast); new Vue({ - //全局事件总线$bus配置 - beforeCreate() { - Vue.prototype.$bus = this; - }, - store, - router, - render: (h) => h(App) + //全局事件总线$bus配置 + beforeCreate() { + Vue.prototype.$bus = this; + }, + store, + router, + render: (h) => h(App), }).$mount("#app"); diff --git a/src/router/index.js b/src/router/index.js index b758383..50a843a 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -9,42 +9,40 @@ let originPush = VueRouter.prototype.push; let originReplace = VueRouter.prototype.replace; //重写VueRouter.prototype身上的push方法 -VueRouter.prototype.push = function(location, resolve, reject) { - if (reject && resolve) { - originPush.call(this, location, resolve, reject); - } - else { - originPush.call( - this, - location, - () => {}, - () => {} - ); - } +VueRouter.prototype.push = function (location, resolve, reject) { + if (reject && resolve) { + originPush.call(this, location, resolve, reject); + } else { + originPush.call( + this, + location, + () => {}, + () => {}, + ); + } }; //重写VueRouter.prototype身上的replace方法 -VueRouter.prototype.replace = function(location, resolve, reject) { - if (reject && resolve) { - originReplace.call(this, location, resolve, reject); - } - else { - originReplace.call( - this, - location, - () => {}, - () => {} - ); - } +VueRouter.prototype.replace = function (location, resolve, reject) { + if (reject && resolve) { + originReplace.call(this, location, resolve, reject); + } else { + originReplace.call( + this, + location, + () => {}, + () => {}, + ); + } }; const router = new VueRouter({ - routes, - scrollBehavior() { - return { y: 0 }; - }, - base: process.env.BASE_URL, - mode: "hash" + routes, + scrollBehavior() { + return { y: 0 }; + }, + base: process.env.BASE_URL, + mode: "hash", }); export default router; diff --git a/src/router/routes.js b/src/router/routes.js index 57532a0..81f671d 100644 --- a/src/router/routes.js +++ b/src/router/routes.js @@ -1,16 +1,16 @@ export default [ - //重定向 - // { - // path : "/", - // redirect: "/login" - // }, - //导入登录组件 - { - path : "/Header", - component: () => - import( - /* webpackChunkName: "login_home_welcome" */ "@/components/Header/Header.vue" - ), - name: "Header" - } + //重定向 + // { + // path : "/", + // redirect: "/login" + // }, + //导入登录组件 + { + path: "/Header", + component: () => + import( + /* webpackChunkName: "login_home_welcome" */ "@/components/Header/Header.vue" + ), + name: "Header", + }, ]; diff --git a/src/store/index.js b/src/store/index.js index 68bc6f4..059d835 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,4 +4,3 @@ import Vuex from "vuex"; Vue.use(Vuex); export default new Vuex.Store({ modules: {} }); - \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index f1043b9..5303209 100644 --- a/vue.config.js +++ b/vue.config.js @@ -8,33 +8,33 @@ const os = require("os"); const happyThreadPool = HappyPack.ThreadPool({ size: os.cpus().length }); module.exports = defineConfig({ - transpileDependencies: true, // 设置依赖文件是否被转译 - publicPath : "/Vue-project-template/", - lintOnSave : false, - configureWebpack : { - plugins: [ - new MomentLocalesPlugin({ localesToKeep: ["zh-cn"] }), - new CompressionPlugin({ - test : /\.(js|css)(\?.*)?$/i, //需要压缩的文件正则 - threshold : 1024, //文件大小大于这个值时启用压缩 - deleteOriginalAssets: false //压缩后保留原文件 - }), - new HappyPack({ - id : "happybabel", - loaders : ["babel-loader"], - threadPool: happyThreadPool - }) - ] - }, - // 代理服务器 - devServer: { - proxy: { - "/api": { - target : "http://localhost:3000", - changeOrigin: true, - pathRewrite : {"^/api": ""}, - changeOrigin: true - } - } - } + transpileDependencies: true, // 设置依赖文件是否被转译 + publicPath: "/Vue-project-template/", + lintOnSave: false, + configureWebpack: { + plugins: [ + new MomentLocalesPlugin({ localesToKeep: ["zh-cn"] }), + new CompressionPlugin({ + test: /\.(js|css)(\?.*)?$/i, //需要压缩的文件正则 + threshold: 1024, //文件大小大于这个值时启用压缩 + deleteOriginalAssets: false, //压缩后保留原文件 + }), + new HappyPack({ + id: "happybabel", + loaders: ["babel-loader"], + threadPool: happyThreadPool, + }), + ], + }, + // 代理服务器 + devServer: { + proxy: { + "/api": { + target: "http://localhost:3000", + changeOrigin: true, + pathRewrite: { "^/api": "" }, + changeOrigin: true, + }, + }, + }, });