Commit 4dfe2bbf authored by 何远江's avatar 何远江

first commit

parents
Pipeline #510 canceled with stages
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
{
"recommendations": ["Vue.volar"]
}
# Vue 3 + Vite
This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
Learn more about IDE Support for Vue in the [Vue Docs Scaling up Guide](https://vuejs.org/guide/scaling-up/tooling.html#ide-support).
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>
{
"name": "record-ui",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"autoprefixer": "^10.4.20",
"axios": "^1.7.9",
"element-plus": "^2.9.3",
"postcss": "^8.5.1",
"tailwindcss": "^3.4.17",
"vue": "^3.5.13",
"vue-router": "^4.5.0",
"vxe-pc-ui": "4.3.71",
"vxe-table": "4.10.5"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.2.1",
"sass-embedded": "^1.83.4",
"vite": "^6.0.5"
}
}
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
};
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
\ No newline at end of file
<template>
<RouterView />
</template>
\ No newline at end of file
import request from "@/utils/http/index";
export const meetingList = (params) => {
return request.get("/md/meeting/find", params);
};
@tailwind base;
@tailwind components;
@tailwind utilities;
\ No newline at end of file
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>
\ No newline at end of file
import { createApp } from 'vue';
import App from './App.vue';
import router, { setupRouter } from '@/router/index';
import { setupElementPlus } from '@/plugins/element-plus';
import {setupVxeTabele} from '@/plugins/vxe-table'
export async function bootstrapInstall() {
const app = createApp(App);
// 挂载element ui 组件
setupElementPlus(app);
setupVxeTabele(app);
// 挂载路由
setupRouter(app);
// 路由准备就绪后挂载 APP 实例
await router.isReady();
app.mount('#app');
}
<template>
<div class="not-container">
<img src="@/assets/images/403.png" class="not-img" alt="403" />
<div class="not-detail">
<h2>403</h2>
<h4>抱歉,您无权访问该页面~🙅‍♂️🙅‍♀️</h4>
<el-button type="primary" @click="router.back"> 返回上一页 </el-button>
</div>
</div>
</template>
<script setup name="403">
import { useRouter } from 'vue-router';
const router = useRouter();
</script>
<style scoped lang="scss">
@use './index.scss';
</style>
<template>
<div class="not-container">
<img src="@/assets/images/404.png" class="not-img" alt="404" />
<div class="not-detail">
<h2>404</h2>
<h4>抱歉,您访问的页面不存在~🤷‍♂️🤷‍♀️</h4>
<el-button type="primary" @click="router.back"> 返回上一页 </el-button>
</div>
</div>
</template>
<script setup name="404">
import { useRouter } from 'vue-router';
const router = useRouter();
</script>
<style scoped lang="scss">
@use './index.scss';
</style>
<template>
<div class="not-container">
<img src="@/assets/images/500.png" class="not-img" alt="500" />
<div class="not-detail">
<h2>500</h2>
<h4>抱歉,您的网络不见了~🤦‍♂️🤦‍♀️</h4>
<el-button type="primary" @click="router.back"> 返回上一页 </el-button>
</div>
</div>
</template>
<script setup name="500">
import { useRouter } from 'vue-router';
const router = useRouter();
</script>
<style scoped lang="scss">
@use './index.scss';
</style>
.not-container {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 100%;
.not-img {
margin-right: 120px;
}
.not-detail {
display: flex;
flex-direction: column;
h2,
h4 {
padding: 0;
margin: 0;
}
h2 {
font-size: 60px;
color: var(--el-text-color-primary);
}
h4 {
margin: 30px 0 20px;
font-size: 19px;
font-weight: normal;
color: var(--el-text-color-regular);
}
.el-button {
width: 100px;
}
}
}
<script setup>
import { ref } from 'vue'
defineProps({
msg: String,
})
const count = ref(0)
</script>
<template>
<h1>{{ msg }}</h1>
<div class="card">
<button type="button" @click="count++">count is {{ count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test HMR
</p>
</div>
<p>
Check out
<a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
>create-vue</a
>, the official Vue + Vite starter
</p>
<p>
Learn more about IDE Support for Vue in the
<a
href="https://vuejs.org/guide/scaling-up/tooling.html#ide-support"
target="_blank"
>Vue Docs Scaling up Guide</a
>.
</p>
<p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
</style>
import { bootstrapInstall } from "./bootstrap";
import '@/assets/style/main.css'
bootstrapInstall();
import 'element-plus/dist/index.css';
import 'element-plus/theme-chalk/dark/css-vars.css';
import ElementPlus from 'element-plus';
import * as Icons from '@element-plus/icons-vue';
import zhCn from 'element-plus/es/locale/lang/zh-cn';
export function setupElementPlus(app) {
// 注册Icons
Object.keys(Icons).forEach((key) => {
app.component(key, Icons[key]);
});
app.use(ElementPlus, {
locale: zhCn,
});
}
import {
VxeUI,
VxeButton,
VxeButtonGroup,
VxeDrawer,
VxeForm,
VxeFormGroup,
VxeFormItem,
VxeIcon,
VxeLoading,
VxeModal,
VxePager,
VxePrint,
VxeTooltip,
VxeUpload,
VxeCheckbox,
VxeNumberInput,
VxeRadioGroup,
} from "vxe-pc-ui";
import {
VxeTable,
VxeColumn,
VxeColgroup,
VxeGrid,
VxeToolbar,
} from "vxe-table";
// 导入主题变量,也可以重写主题变量
import "vxe-table/styles/cssvar.scss";
import "vxe-pc-ui/styles/cssvar.scss";
import "vxe-pc-ui/lib/style.css";
import "vxe-table/lib/style.css";
// 导入默认的语言
import zhCN from "vxe-pc-ui/lib/language/zh-CN";
VxeUI.setI18n("zh-CN", zhCN);
VxeUI.setLanguage("zh-CN");
// 可选组件
function lazyVxeUI(app) {
app.use(VxeButton);
app.use(VxeButtonGroup);
app.use(VxeDrawer);
app.use(VxeForm);
app.use(VxeFormGroup);
app.use(VxeFormItem);
app.use(VxeIcon);
app.use(VxeLoading);
app.use(VxeModal);
app.use(VxePager);
app.use(VxePrint);
app.use(VxeTooltip);
app.use(VxeUpload);
app.use(VxeCheckbox);
app.use(VxeNumberInput);
app.use(VxeRadioGroup);
}
function lazyVxeTable(app) {
app.use(VxeTable);
app.use(VxeColumn);
app.use(VxeColgroup);
app.use(VxeGrid);
app.use(VxeToolbar);
}
export function setupVxeTabele(app) {
VxeUI.setConfig({
table: {
border: true,
stripe: true,
round: true,
size: "small",
resizableConfig: {
dragMode: "auto",
showDragTip: true,
},
customConfig: {
allowFixed: true,
allowSort: true,
allowVisible: true,
mode: "modal",
},
columnConfig: {
maxFixedSize: 0, // 设置最大冻结列,0为无限制
resizable: true, // 列宽调整
},
checkboxConfig: {
reserve: false,
},
rowConfig: {
isCurrent: true,
isHover: true,
keyField: "_ROW_KEY",
},
},
grid: {
size: "small",
},
});
lazyVxeUI(app);
lazyVxeTable(app);
}
import { createRouter, createWebHistory } from 'vue-router';
// import { createRouterGuards } from './guards';
// import { useAuthStore } from '@/stores/modules/auth';
import { staticRoute, errorRouter } from './modules/staticRouter';
/**
* 创建路由
*/
const router = createRouter({
history: createWebHistory(),
routes: [...staticRoute, ...errorRouter],
strict: true,
scrollBehavior: () => ({ left: 0, top: 0 }),
});
export const resetRouter = () => {
// const authStore = useAuthStore();
// authStore.flatMenuListGet.forEach((route) => {
// const { name } = route;
// if (name && router.hasRoute(name)) router.removeRoute(name);
// });
};
/**
* 安装路由
*/
export function setupRouter(app) {
app.use(router);
// 创建路由守卫
// createRouterGuards(router);
}
export default router;
const HOME_URL = "/recording";
const LOGIN_URL = "/login";
/**
* 静态路由
*/
export const staticRoute = [
{
path: "/",
redirect: HOME_URL,
},
{
path: '/recording',
name: "recording",
component: () => import("@/views/recording/index.vue"),
meta: {
title: 'Recording'
}
},
{
path: '/recording-add',
name: "recordingAdd",
component: () => import("@/views/recording/add.vue"),
meta: {
title: 'Recording Add'
}
},
{
path: '/recording-convert',
name: "recordingConvert",
component: () => import("@/views/recording/convert.vue"),
meta: {
title: 'Recording Convert'
}
}
// {
// path: LOGIN_URL,
// name: "login",
// component: () => import("@/views/login/index.vue"),
// meta: {
// title: "Login",
// },
// },
// {
// path: "/layout",
// name: "layout",
// component: () => import("@/layouts/index.vue"),
// redirect: HOME_URL,
// children: [],
// },
];
/**
* errorRouter (错误页面路由)
*/
export const errorRouter = [
{
path: "/403",
name: "403",
component: () => import("@/components/ErrorMessage/403.vue"),
meta: {
title: "403页面",
},
},
{
path: "/404",
name: "404",
component: () => import("@/components/ErrorMessage/404.vue"),
meta: {
title: "404页面",
},
},
{
path: "/500",
name: "500",
component: () => import("@/components/ErrorMessage/500.vue"),
meta: {
title: "500页面",
},
},
// Resolve refresh page, route warnings
{
path: "/:pathMatch(.*)*",
component: () => import("@/components/ErrorMessage/404.vue"),
},
];
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}
import { stringify } from 'qs';
const pendingMap = new Map();
// 序列化参数,确保对象属性顺序一致
const sortedStringify = (obj) => {
return stringify(obj, { arrayFormat: 'repeat', sort: (a, b) => a.localeCompare(b) });
};
export const getPendingUrl = (config) => {
return [
config.method,
config.url,
sortedStringify(config.data),
sortedStringify(config.params),
].join('&');
};
export class AxiosCanceler {
/**
* @description: 添加请求
* @param {Object} config
* @return void
*/
addPending(config) {
// 在请求开始前,对之前的请求做检查取消操作
this.removePending(config);
const url = getPendingUrl(config);
const controller = new AbortController();
config.signal = controller.signal;
pendingMap.set(url, controller);
}
/**
* @description: 移除请求
* @param {Object} config
*/
removePending(config) {
const url = getPendingUrl(config);
// 如果在 pending 中存在当前请求标识,需要取消当前请求并删除条目
const controller = pendingMap.get(url);
if (controller) {
controller.abort();
pendingMap.delete(url);
}
}
/**
* @description: 清空所有pending
*/
removeAllPending() {
pendingMap.forEach((controller) => {
controller && controller.abort();
});
pendingMap.clear();
}
}
import Axios from 'axios';
import { ElMessage, ElLoading } from 'element-plus';
// import { getAppEnvConfig } from '../env';
import { AxiosCanceler } from './axiosCancel';
import { stringify } from 'qs';
import router from '@/router';
// import { LOGIN_URL } from '@/config';
// import { useUserStore } from '@/stores/modules/user';
import { saveAs } from 'file-saver';
// const envs = getAppEnvConfig();
const defaultConfig = {
baseURL: '/api',
timeout: 1000 * 30,
// 数组格式参数序列化(https://github.com/axios/axios/issues/5142)
paramsSerializer: {
serialize: stringify,
},
};
const LOGIN_URL = '/'
const axiosCanceler = new AxiosCanceler();
class RequestClient {
constructor(config = {}) {
this.instance = Axios.create(Object.assign(defaultConfig, config));
this.instance.interceptors.request.use(
(config) => {
if (config.cancel == null) {
config.cancel = true;
}
config.cancel && axiosCanceler.addPending(config);
if (config.method.toLocaleUpperCase() == 'GET') {
config.headers['Content-Type'] = 'application/x-www-form-urlencoded';
}
return config;
},
(error) => {
return Promise.reject(error);
}
);
this.instance.interceptors.response.use(
(response) => {
const { data, config } = response;
axiosCanceler.removePending(config);
// 登录失效
if (data.code === 404) {
router.replace(LOGIN_URL);
ElMessage({
message: '登录失效,请重新登录',
type: 'error',
plain: true,
});
return Promise.reject(data);
}
// 全局拦截请求错误信息
if (data.code && data.code !== 200) {
ElMessage({
message: data.message,
type: 'error',
plain: true,
});
return Promise.reject(data);
}
return data;
},
(error) => {
const { response } = error;
// 请求超时 && 网络错误单独判断,没有 response
if (error.message.indexOf('timeout') !== -1)
ElMessage.error({ message: '请求超时!请您稍后重试', plain: true });
if (error.message.indexOf('Network Error') !== -1)
ElMessage.error({ message: '网络错误!请您稍后重试', plain: true });
// 根据服务器响应的错误状态码,做不同的处理
if (response) checkStatus(response.status);
// 服务器结果都没有返回(可能服务器错误可能客户端断网),断网处理:可以跳转到断网页面
if (!window.navigator.onLine) router.replace('/500');
}
);
}
get(url, params, _object = {}) {
return this.instance.get(url, { params, ..._object });
}
post(url, data, _object = {}) {
return this.instance.post(url, data, _object);
}
put(url, data, _object = {}) {
return this.instance.put(url, data, _object);
}
delete(url, params, _object = {}) {
return this.instance.delete(url, { params, ..._object });
}
download(url, params, _object = {}) {
return this.instance.post(url, params, { ..._object, responseType: 'blob' });
}
}
/**
* @description: 校验网络请求状态码
* @param {Number} status
* @return void
*/
export const checkStatus = (status) => {
switch (status) {
case 400:
ElMessage.error({ message: '请求失败!请您稍后重试', plain: true });
break;
case 401:
ElMessage.error({ message: '登录失效!请您重新登录', plain: true });
break;
case 403:
ElMessage.error({ message: '当前账号无权限访问!', plain: true });
break;
case 404:
ElMessage.error({ message: '你所访问的资源不存在!', plain: true });
break;
case 405:
ElMessage.error({ message: '请求方式错误!请您稍后重试', plain: true });
break;
case 408:
ElMessage.error({ message: '请求超时!请您稍后重试', plain: true });
break;
case 500:
ElMessage.error({ message: '服务异常!', plain: true });
break;
case 502:
ElMessage.error({ message: '网关错误!', plain: true });
break;
case 503:
ElMessage.error({ message: '服务不可用!', plain: true });
break;
case 504:
ElMessage.error({ message: '网关超时!', plain: true });
break;
default:
ElMessage.error({ message: '请求失败!', plain: true });
}
};
// 通用下载方法
export function download(url, params, filename) {
const downloadLoadingInstance = ElLoading.service({
text: '正在下载数据,请稍候',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)',
});
return new RequestClient()
.get(url, params, {
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob',
})
.then(async (data) => {
const blob = new Blob([data]);
saveAs(blob, filename);
downloadLoadingInstance.close();
})
.catch((r) => {
console.error(r);
ElMessage.error('下载文件出现错误,请联系管理员!');
downloadLoadingInstance.close();
});
}
export default new RequestClient();
<template>
<div class="container py-4 m-auto">
<div class="text-xl font-bold mb-2">新增会议</div>
<el-form label-width="120px" label-position="left">
<el-form-item label="会议主题">
<el-input v-model="formState.meetingName"></el-input>
</el-form-item>
<el-form-item label="会议时间">
<el-date-picker type="date" value-format="YYYY-MM-DD" v-model="formState.meetingTime"></el-date-picker>
</el-form-item>
<el-form-item label="主持人">
<el-input v-model="formState.meetingHost"></el-input>
</el-form-item>
</el-form>
<div class="text-lg mb-2">
参会人员
</div>
<vxe-table :data="tableData">
<vxe-column field="name" title="姓名"></vxe-column>
<vxe-column field="role" title="部门/角色"></vxe-column>
<vxe-column field="projectRole" title="项目角色"></vxe-column>
</vxe-table>
</div>
</template>
<script setup>
import { reactive } from 'vue';
import {ref} from 'vue'
const tableData = ref([]);
const formState = reactive({
meetingName: '',
meetingTime: '',
meetingHost: '',
})
</script>
<template>
<div>convert</div>
</template>
\ No newline at end of file
<template>
<div class="container py-4 m-auto">
<div class="text-xl font-bold mb-2">会议列表</div>
<el-form inline>
<el-row :gutter="24">
<el-col :sx="12" :md="8" :lg="6">
<el-form-item class="w-full" label="会议主题">
<el-input v-model="formState.meetingName"></el-input>
</el-form-item>
</el-col>
<el-col :sx="12" :md="8" :lg="6">
<el-form-item class="w-full" label="主持人">
<el-input v-model="formState.meetingHost"></el-input>
</el-form-item>
</el-col>
<el-col :sx="12" :md="8" :lg="6">
<el-form-item class="w-full" label="会议时间">
<el-input v-model="formState.meetingTime"></el-input>
</el-form-item>
</el-col>
<el-col :sx="12" :md="8" :lg="6">
<el-form-item>
<el-button @click="hanldeQuery" type="primary">查询</el-button>
<el-button @click="handleReset">重置</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mb-2">
<el-button type="success" @click="handleAdd">新增</el-button>
</div>
<vxe-table :data="tableData">
<vxe-column field="meetingName" title="会议主题"></vxe-column>
<vxe-column field="meetingHost" title="主持人"></vxe-column>
<vxe-column field="meetingTime" title="会议时间"></vxe-column>
<vxe-column field="name4" title="录音"></vxe-column>
</vxe-table>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import { useRouter } from 'vue-router'
const formState = reactive({
meetingName: "",
meetingHost: "",
meetingTime: "",
});
const tableData = ref([]);
const router = useRouter();
const hanldeQuery = () => {};
const handleAdd = () => {
router.push('/recording-add')
};
const handleReset = () => {};
</script>
/** @type {import('tailwindcss').Config} */
export default {
content: ["./src/**/*.{html,js,vue}"],
theme: {
extend: {},
},
plugins: [],
}
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { resolve } from "path";
function pathResolve(dir) {
return resolve(process.cwd(), ".", dir);
}
// https://vite.dev/config/
export default defineConfig({
plugins: [vue()],
resolve: {
alias: [
{
find: "@",
replacement: pathResolve("src") + "/",
},
],
dedupe: ["vue"],
},
css: {
preprocessorOptions: {
// 消除警告 ⚠️ Deprecation [legacy-js-api]: The legacy JS API is deprecated and will be removed in Dart Sass 2.0.0.
scss: {
api: "modern-compiler", // or "modern"
},
},
},
server: {
host: "0.0.0.0",
port: 8080,
proxy: {
"/api": {
target: "http://8.152.205.9:8080/",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/api/, ""),
},
},
},
});
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment