diff --git a/apps/web-ele/.env b/apps/web-ele/.env
index bb57c8651..5ed0cce0b 100644
--- a/apps/web-ele/.env
+++ b/apps/web-ele/.env
@@ -1,8 +1,26 @@
# 应用标题
-VITE_APP_TITLE=Vben Admin Ele
+VITE_APP_TITLE=芋道管理系统
# 应用命名空间,用于缓存、store等功能的前缀,确保隔离
-VITE_APP_NAMESPACE=vben-web-ele
+VITE_APP_NAMESPACE=yudao-vben-ele
# 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密
VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key
+
+# 是否开启模拟数据
+VITE_NITRO_MOCK=false
+
+# 租户开关
+VITE_APP_TENANT_ENABLE=true
+
+# 验证码的开关
+VITE_APP_CAPTCHA_ENABLE=false
+
+# 文档地址的开关
+VITE_APP_DOCALERT_ENABLE=true
+
+# 百度统计
+VITE_APP_BAIDU_CODE = e98f2eab6ceb8688bc6d8fc5332ff093
+
+# GoView域名
+VITE_GOVIEW_URL='http://127.0.0.1:3000'
diff --git a/apps/web-ele/.env.development b/apps/web-ele/.env.development
index 8bcb432e6..02edf8dd7 100644
--- a/apps/web-ele/.env.development
+++ b/apps/web-ele/.env.development
@@ -3,14 +3,19 @@ VITE_PORT=5777
VITE_BASE=/
+# 请求路径
+VITE_BASE_URL=http://127.0.0.1:48080
# 接口地址
-VITE_GLOB_API_URL=/api
-
-# 是否开启 Nitro Mock服务,true 为开启,false 为关闭
-VITE_NITRO_MOCK=true
-
+VITE_GLOB_API_URL=/admin-api
+# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
+VITE_UPLOAD_TYPE=server
# 是否打开 devtools,true 为打开,false 为关闭
VITE_DEVTOOLS=false
# 是否注入全局loading
VITE_INJECT_APP_LOADING=true
+
+# 默认登录用户名
+VITE_APP_DEFAULT_USERNAME=admin
+# 默认登录密码
+VITE_APP_DEFAULT_PASSWORD=admin123
diff --git a/apps/web-ele/.env.production b/apps/web-ele/.env.production
index 5375847a6..910fd64cc 100644
--- a/apps/web-ele/.env.production
+++ b/apps/web-ele/.env.production
@@ -1,7 +1,11 @@
VITE_BASE=/
+# 请求路径
+VITE_BASE_URL=http://127.0.0.1:48080
# 接口地址
-VITE_GLOB_API_URL=https://mock-napi.vben.pro/api
+VITE_GLOB_API_URL=http://127.0.0.1:48080/admin-api
+# 文件上传类型:server - 后端上传, client - 前端直连上传,仅支持S3服务
+VITE_UPLOAD_TYPE=server
# 是否开启压缩,可以设置为 none, brotli, gzip
VITE_COMPRESS=none
diff --git a/apps/web-ele/index.html b/apps/web-ele/index.html
index 2b59b8d75..34c6f145c 100644
--- a/apps/web-ele/index.html
+++ b/apps/web-ele/index.html
@@ -15,13 +15,12 @@
<%= VITE_APP_TITLE %>
([]); // 租户列表
+async function fetchTenantList() {
+ if (!tenantEnable) {
+ return;
+ }
+ try {
+ // 获取租户列表、域名对应租户
+ const websiteTenantPromise = getTenantByWebsite(window.location.hostname);
+ tenantList.value = await getTenantSimpleList();
+
+ // 选中租户:域名 > store 中的租户 > 首个租户
+ let tenantId: null | number = null;
+ const websiteTenant = await websiteTenantPromise;
+ if (websiteTenant?.id) {
+ tenantId = websiteTenant.id;
+ }
+ // 如果没有从域名获取到租户,尝试从 store 中获取
+ if (!tenantId && accessStore.tenantId) {
+ tenantId = accessStore.tenantId;
+ }
+ // 如果还是没有租户,使用列表中的第一个
+ if (!tenantId && tenantList.value?.[0]?.id) {
+ tenantId = tenantList.value[0].id;
+ }
+
+ // 设置选中的租户编号
+ accessStore.setTenantId(tenantId);
+ forgetPasswordRef.value
+ .getFormApi()
+ .setFieldValue('tenantId', tenantId?.toString());
+ } catch (error) {
+ console.error('获取租户列表失败:', error);
+ }
+}
+
+/** 组件挂载时获取租户信息 */
+onMounted(() => {
+ fetchTenantList();
+});
const formSchema = computed((): VbenFormSchema[] => {
return [
+ {
+ component: 'VbenSelect',
+ componentProps: {
+ options: tenantList.value.map((item) => ({
+ label: item.name,
+ value: item.id.toString(),
+ })),
+ placeholder: $t('authentication.tenantTip'),
+ },
+ fieldName: 'tenantId',
+ label: $t('authentication.tenant'),
+ rules: z.string().min(1, { message: $t('authentication.tenantTip') }),
+ dependencies: {
+ triggerFields: ['tenantId'],
+ if: tenantEnable,
+ trigger(values) {
+ if (values.tenantId) {
+ accessStore.setTenantId(Number(values.tenantId));
+ }
+ },
+ },
+ },
{
component: 'VbenInput',
componentProps: {
- placeholder: 'example@example.com',
+ placeholder: $t('authentication.mobile'),
},
- fieldName: 'email',
- label: $t('authentication.email'),
+ fieldName: 'mobile',
+ label: $t('authentication.mobile'),
rules: z
.string()
- .min(1, { message: $t('authentication.emailTip') })
- .email($t('authentication.emailValidErrorTip')),
+ .min(1, { message: $t('authentication.mobileTip') })
+ .refine((v) => /^\d{11}$/.test(v), {
+ message: $t('authentication.mobileErrortip'),
+ }),
+ },
+ {
+ component: 'VbenPinInput',
+ componentProps: {
+ codeLength: CODE_LENGTH,
+ createText: (countdown: number) => {
+ const text =
+ countdown > 0
+ ? $t('authentication.sendText', [countdown])
+ : $t('authentication.sendCode');
+ return text;
+ },
+ placeholder: $t('authentication.code'),
+ handleSendCode: async () => {
+ loading.value = true;
+ try {
+ const formApi = forgetPasswordRef.value?.getFormApi();
+ if (!formApi) {
+ throw new Error('表单未准备好');
+ }
+ // 验证手机号
+ await formApi.validateField('mobile');
+ const isMobileValid = await formApi.isFieldValid('mobile');
+ if (!isMobileValid) {
+ throw new Error('请输入有效的手机号码');
+ }
+
+ // 发送验证码
+ const { mobile } = await formApi.getValues();
+ const scene = 23; // 场景:重置密码
+ await sendSmsCode({ mobile, scene });
+ ElMessage.success('验证码发送成功');
+ } finally {
+ loading.value = false;
+ }
+ },
+ },
+ fieldName: 'code',
+ label: $t('authentication.code'),
+ rules: z.string().length(CODE_LENGTH, {
+ message: $t('authentication.codeTip', [CODE_LENGTH]),
+ }),
+ },
+ {
+ component: 'VbenInputPassword',
+ componentProps: {
+ passwordStrength: true,
+ placeholder: $t('authentication.password'),
+ },
+ fieldName: 'password',
+ label: $t('authentication.password'),
+ renderComponentContent() {
+ return {
+ strengthText: () => $t('authentication.passwordStrength'),
+ };
+ },
+ rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
+ },
+ {
+ component: 'VbenInputPassword',
+ componentProps: {
+ placeholder: $t('authentication.confirmPassword'),
+ },
+ dependencies: {
+ rules(values) {
+ const { password } = values;
+ return z
+ .string({ required_error: $t('authentication.passwordTip') })
+ .min(1, { message: $t('authentication.passwordTip') })
+ .refine((value) => value === password, {
+ message: $t('authentication.confirmPasswordTip'),
+ });
+ },
+ triggerFields: ['password'],
+ },
+ fieldName: 'confirmPassword',
+ label: $t('authentication.confirmPassword'),
},
];
});
-function handleSubmit(value: Recordable) {
- // eslint-disable-next-line no-console
- console.log('reset email:', value);
+/**
+ * 处理重置密码操作
+ * @param values 表单数据
+ */
+async function handleSubmit(values: Recordable) {
+ loading.value = true;
+ try {
+ const { mobile, code, password } = values;
+ await smsResetPassword({ mobile, code, password });
+ ElMessage.success($t('authentication.resetPasswordSuccess'));
+ // 重置成功后跳转到首页
+ router.push('/');
+ } catch (error) {
+ console.error('重置密码失败:', error);
+ } finally {
+ loading.value = false;
+ }
}
import type { VbenFormSchema } from '@vben/common-ui';
-import type { BasicOption } from '@vben/types';
-import { computed, markRaw } from 'vue';
+import type { AuthApi } from '#/api/core/auth';
-import { AuthenticationLogin, SliderCaptcha, z } from '@vben/common-ui';
+import { computed, onMounted, ref } from 'vue';
+import { useRoute } from 'vue-router';
+
+import { AuthenticationLogin, Verification, z } from '@vben/common-ui';
+import { isCaptchaEnable, isTenantEnable } from '@vben/hooks';
import { $t } from '@vben/locales';
+import { useAccessStore } from '@vben/stores';
+import {
+ checkCaptcha,
+ getCaptcha,
+ getTenantByWebsite,
+ getTenantSimpleList,
+ socialAuthRedirect,
+} from '#/api/core/auth';
import { useAuthStore } from '#/store';
defineOptions({ name: 'Login' });
+const { query } = useRoute();
const authStore = useAuthStore();
+const accessStore = useAccessStore();
+const tenantEnable = isTenantEnable();
+const captchaEnable = isCaptchaEnable();
-const MOCK_USER_OPTIONS: BasicOption[] = [
- {
- label: 'Super',
- value: 'vben',
- },
- {
- label: 'Admin',
- value: 'admin',
- },
- {
- label: 'User',
- value: 'jack',
- },
-];
+const loginRef = ref();
+const verifyRef = ref();
+
+const captchaType = 'blockPuzzle'; // 验证码类型:'blockPuzzle' | 'clickWord'
+
+/** 获取租户列表,并默认选中 */
+const tenantList = ref([]); // 租户列表
+async function fetchTenantList() {
+ if (!tenantEnable) {
+ return;
+ }
+ try {
+ // 获取租户列表、域名对应租户
+ const websiteTenantPromise = getTenantByWebsite(window.location.hostname);
+ tenantList.value = await getTenantSimpleList();
+
+ // 选中租户:域名 > store 中的租户 > 首个租户
+ let tenantId: null | number = null;
+ const websiteTenant = await websiteTenantPromise;
+ if (websiteTenant?.id) {
+ tenantId = websiteTenant.id;
+ }
+ // 如果没有从域名获取到租户,尝试从 store 中获取
+ if (!tenantId && accessStore.tenantId) {
+ tenantId = accessStore.tenantId;
+ }
+ // 如果还是没有租户,使用列表中的第一个
+ if (!tenantId && tenantList.value?.[0]?.id) {
+ tenantId = tenantList.value[0].id;
+ }
+
+ // 设置选中的租户编号
+ accessStore.setTenantId(tenantId);
+ loginRef.value.getFormApi().setFieldValue('tenantId', tenantId?.toString());
+ } catch (error) {
+ console.error('获取租户列表失败:', error);
+ }
+}
+
+/** 处理登录 */
+async function handleLogin(values: any) {
+ // 如果开启验证码,则先验证验证码
+ if (captchaEnable) {
+ verifyRef.value.show();
+ return;
+ }
+ // 无验证码,直接登录
+ await authStore.authLogin('username', values);
+}
+
+/** 验证码通过,执行登录 */
+async function handleVerifySuccess({ captchaVerification }: any) {
+ try {
+ await authStore.authLogin('username', {
+ ...(await loginRef.value.getFormApi().getValues()),
+ captchaVerification,
+ });
+ } catch (error) {
+ console.error('Error in handleLogin:', error);
+ }
+}
+
+/** 处理第三方登录 */
+const redirect = query?.redirect;
+async function handleThirdLogin(type: number) {
+ if (type <= 0) {
+ return;
+ }
+ try {
+ // 计算 redirectUri
+ // tricky: type、redirect 需要先 encode 一次,否则钉钉回调会丢失。配合 social-login.vue#getUrlValue() 使用
+ const redirectUri = `${
+ location.origin
+ }/auth/social-login?${encodeURIComponent(
+ `type=${type}&redirect=${redirect || '/'}`,
+ )}`;
+
+ // 进行跳转
+ window.location.href = await socialAuthRedirect(type, redirectUri);
+ } catch (error) {
+ console.error('第三方登录处理失败:', error);
+ }
+}
+
+/** 组件挂载时获取租户信息 */
+onMounted(() => {
+ fetchTenantList();
+});
const formSchema = computed((): VbenFormSchema[] => {
return [
{
component: 'VbenSelect',
componentProps: {
- options: MOCK_USER_OPTIONS,
- placeholder: $t('authentication.selectAccount'),
+ options: tenantList.value.map((item) => ({
+ label: item.name,
+ value: item.id.toString(),
+ })),
+ placeholder: $t('authentication.tenantTip'),
+ },
+ fieldName: 'tenantId',
+ label: $t('authentication.tenant'),
+ rules: z.string().min(1, { message: $t('authentication.tenantTip') }),
+ dependencies: {
+ triggerFields: ['tenantId'],
+ if: tenantEnable,
+ trigger(values) {
+ if (values.tenantId) {
+ accessStore.setTenantId(Number(values.tenantId));
+ }
+ },
},
- fieldName: 'selectAccount',
- label: $t('authentication.selectAccount'),
- rules: z
- .string()
- .min(1, { message: $t('authentication.selectAccount') })
- .optional()
- .default('vben'),
},
{
component: 'VbenInput',
componentProps: {
placeholder: $t('authentication.usernameTip'),
},
- dependencies: {
- trigger(values, form) {
- if (values.selectAccount) {
- const findUser = MOCK_USER_OPTIONS.find(
- (item) => item.value === values.selectAccount,
- );
- if (findUser) {
- form.setValues({
- password: '123456',
- username: findUser.value,
- });
- }
- }
- },
- triggerFields: ['selectAccount'],
- },
fieldName: 'username',
label: $t('authentication.username'),
- rules: z.string().min(1, { message: $t('authentication.usernameTip') }),
+ rules: z
+ .string()
+ .min(1, { message: $t('authentication.usernameTip') })
+ .default(import.meta.env.VITE_APP_DEFAULT_USERNAME),
},
{
component: 'VbenInputPassword',
componentProps: {
- placeholder: $t('authentication.password'),
+ placeholder: $t('authentication.passwordTip'),
},
fieldName: 'password',
label: $t('authentication.password'),
- rules: z.string().min(1, { message: $t('authentication.passwordTip') }),
- },
- {
- component: markRaw(SliderCaptcha),
- fieldName: 'captcha',
- rules: z.boolean().refine((value) => value, {
- message: $t('authentication.verifyRequiredTip'),
- }),
+ rules: z
+ .string()
+ .min(1, { message: $t('authentication.passwordTip') })
+ .default(import.meta.env.VITE_APP_DEFAULT_PASSWORD),
},
];
});
-
+
diff --git a/apps/web-ele/src/views/_core/authentication/register.vue b/apps/web-ele/src/views/_core/authentication/register.vue
index b1a5de726..734f4c27d 100644
--- a/apps/web-ele/src/views/_core/authentication/register.vue
+++ b/apps/web-ele/src/views/_core/authentication/register.vue
@@ -1,18 +1,126 @@
-
+
diff --git a/apps/web-ele/src/views/_core/authentication/social-login.vue b/apps/web-ele/src/views/_core/authentication/social-login.vue
new file mode 100644
index 000000000..e75a9c0d4
--- /dev/null
+++ b/apps/web-ele/src/views/_core/authentication/social-login.vue
@@ -0,0 +1,215 @@
+
+
+
+
+
diff --git a/apps/web-ele/src/views/_core/authentication/sso-login.vue b/apps/web-ele/src/views/_core/authentication/sso-login.vue
new file mode 100644
index 000000000..1bc7ad9b1
--- /dev/null
+++ b/apps/web-ele/src/views/_core/authentication/sso-login.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+ {{ `${client.name} 👋🏻` }}
+
+
+
+ 此第三方应用请求获得以下权限:
+
+
+
+
+
+
+
+
+ 同意授权
+
+
+ 拒绝
+
+
+
+
diff --git a/apps/web-ele/src/views/_core/profile/index.vue b/apps/web-ele/src/views/_core/profile/index.vue
new file mode 100644
index 000000000..936032a13
--- /dev/null
+++ b/apps/web-ele/src/views/_core/profile/index.vue
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/dashboard/workspace/index.vue b/apps/web-ele/src/views/dashboard/workspace/index.vue
index b95d61381..01a21c6e5 100644
--- a/apps/web-ele/src/views/dashboard/workspace/index.vue
+++ b/apps/web-ele/src/views/dashboard/workspace/index.vue
@@ -30,58 +30,58 @@ const userStore = useUserStore();
// 例如:url: /dashboard/workspace
const projectItems: WorkbenchProjectItem[] = [
{
- color: '',
- content: '不要等待机会,而要创造机会。',
- date: '2021-04-01',
- group: '开源组',
- icon: 'carbon:logo-github',
- title: 'Github',
- url: 'https://github.com',
+ color: '#6DB33F',
+ content: 'github.com/YunaiV/ruoyi-vue-pro',
+ date: '2025-01-02',
+ group: 'Spring Boot 单体架构',
+ icon: 'simple-icons:springboot',
+ title: 'ruoyi-vue-pro',
+ url: 'https://github.com/YunaiV/ruoyi-vue-pro',
},
{
- color: '#3fb27f',
- content: '现在的你决定将来的你。',
- date: '2021-04-01',
- group: '算法组',
- icon: 'ion:logo-vue',
- title: 'Vue',
- url: 'https://vuejs.org',
+ color: '#409EFF',
+ content: 'github.com/yudaocode/yudao-ui-admin-vue3',
+ date: '2025-02-03',
+ group: 'Vue3 + element-plus 管理后台',
+ icon: 'ep:element-plus',
+ title: 'yudao-ui-admin-vue3',
+ url: 'https://github.com/yudaocode/yudao-ui-admin-vue3',
+ },
+ {
+ color: '#ff4d4f',
+ content: 'github.com/yudaocode/yudao-ui-mall-uniapp',
+ date: '2025-03-04',
+ group: 'Vue3 + uniapp 商城手机端',
+ icon: 'icon-park-outline:mall-bag',
+ title: 'yudao-ui-mall-uniapp',
+ url: 'https://github.com/yudaocode/yudao-ui-mall-uniapp',
+ },
+ {
+ color: '#1890ff',
+ content: 'github.com/YunaiV/yudao-cloud',
+ date: '2025-04-05',
+ group: 'Spring Cloud 微服务架构',
+ icon: 'material-symbols:cloud-outline',
+ title: 'yudao-cloud',
+ url: 'https://github.com/YunaiV/yudao-cloud',
},
{
color: '#e18525',
- content: '没有什么才能比努力更重要。',
- date: '2021-04-01',
- group: '上班摸鱼',
- icon: 'ion:logo-html5',
- title: 'Html5',
- url: 'https://developer.mozilla.org/zh-CN/docs/Web/HTML',
+ content: 'github.com/yudaocode/yudao-ui-admin-vben',
+ date: '2025-05-06',
+ group: 'Vue3 + vben5(antd) 管理后台',
+ icon: 'devicon:antdesign',
+ title: 'yudao-ui-admin-vben',
+ url: 'https://github.com/yudaocode/yudao-ui-admin-vben',
},
{
- color: '#bf0c2c',
- content: '热情和欲望可以突破一切难关。',
- date: '2021-04-01',
- group: 'UI',
- icon: 'ion:logo-angular',
- title: 'Angular',
- url: 'https://angular.io',
- },
- {
- color: '#00d8ff',
- content: '健康的身体是实现目标的基石。',
- date: '2021-04-01',
- group: '技术牛',
- icon: 'bx:bxl-react',
- title: 'React',
- url: 'https://reactjs.org',
- },
- {
- color: '#EBD94E',
- content: '路是走出来的,而不是空想出来的。',
- date: '2021-04-01',
- group: '架构组',
- icon: 'ion:logo-javascript',
- title: 'Js',
- url: 'https://developer.mozilla.org/zh-CN/docs/Web/JavaScript',
+ color: '#2979ff',
+ content: 'github.com/yudaocode/yudao-ui-admin-uniapp',
+ date: '2025-06-01',
+ group: 'Vue3 + uniapp 管理手机端',
+ icon: 'ant-design:mobile',
+ title: 'yudao-ui-admin-uniapp',
+ url: 'https://github.com/yudaocode/yudao-ui-admin-uniapp',
},
];
@@ -94,67 +94,61 @@ const quickNavItems: WorkbenchQuickNavItem[] = [
url: '/',
},
{
- color: '#bf0c2c',
- icon: 'ion:grid-outline',
- title: '仪表盘',
- url: '/dashboard',
+ color: '#ff6b6b',
+ icon: 'ep:shop',
+ title: '商城中心',
+ url: '/mall',
},
{
- color: '#e18525',
- icon: 'ion:layers-outline',
- title: '组件',
- url: '/demos/features/icons',
+ color: '#7c3aed',
+ icon: 'tabler:ai',
+ title: 'AI 大模型',
+ url: '/ai',
},
{
color: '#3fb27f',
- icon: 'ion:settings-outline',
- title: '系统管理',
- url: '/demos/features/login-expired', // 这里的 URL 是示例,实际项目中需要根据实际情况进行调整
+ icon: 'simple-icons:erpnext',
+ title: 'ERP 系统',
+ url: '/erp',
},
{
color: '#4daf1bc9',
- icon: 'ion:key-outline',
- title: '权限管理',
- url: '/demos/access/page-control',
+ icon: 'simple-icons:civicrm',
+ title: 'CRM 系统',
+ url: '/crm',
},
{
- color: '#00d8ff',
- icon: 'ion:bar-chart-outline',
- title: '图表',
- url: '/analytics',
+ color: '#1a73e8',
+ icon: 'fa-solid:hdd',
+ title: 'IoT 物联网',
+ url: '/iot',
},
];
const todoItems = ref([
{
completed: false,
- content: `审查最近提交到Git仓库的前端代码,确保代码质量和规范。`,
- date: '2024-07-30 11:00:00',
- title: '审查前端代码提交',
- },
- {
- completed: true,
- content: `检查并优化系统性能,降低CPU使用率。`,
- date: '2024-07-30 11:00:00',
- title: '系统性能优化',
+ content: `系统支持 JDK 8/17/21,Vue 2/3`,
+ date: '2024-07-15 09:30:00',
+ title: '技术兼容性',
},
{
completed: false,
- content: `进行系统安全检查,确保没有安全漏洞或未授权的访问。 `,
- date: '2024-07-30 11:00:00',
- title: '安全检查',
+ content: `后端提供 Spring Boot 2.7/3.2 + Cloud 双架构`,
+ date: '2024-08-30 14:20:00',
+ title: '架构灵活性',
},
{
completed: false,
- content: `更新项目中的所有npm依赖包,确保使用最新版本。`,
- date: '2024-07-30 11:00:00',
- title: '更新项目依赖',
+ content: `全部开源,个人与企业可 100% 直接使用,无需授权`,
+ date: '2024-07-25 16:45:00',
+ title: '开源免授权',
},
{
completed: false,
- content: `修复用户报告的页面UI显示问题,确保在不同浏览器中显示一致。 `,
- date: '2024-07-30 11:00:00',
- title: '修复UI显示问题',
+ content: `国内使用最广泛的快速开发平台,远超 10w+ 企业使用`,
+ date: '2024-07-10 11:15:00',
+ title: '广泛企业认可',
},
]);
const trendItems: WorkbenchTrendItem[] = [
@@ -239,7 +233,7 @@ function navTo(nav: WorkbenchProjectItem | WorkbenchQuickNavItem) {
:avatar="userStore.userInfo?.avatar || preferences.app.defaultAvatar"
>
- 早安, {{ userStore.userInfo?.realName }}, 开始您一天的工作吧!
+ 早安, {{ userStore.userInfo?.nickname }}, 开始您一天的工作吧!
今日晴,20℃ - 32℃!
diff --git a/apps/web-ele/src/views/demos/element/index.vue b/apps/web-ele/src/views/demos/element/index.vue
deleted file mode 100644
index 0a7012d63..000000000
--- a/apps/web-ele/src/views/demos/element/index.vue
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
-
-
-
-
- 按钮
-
- Text
- Default
- Primary
- Info
- Success
- Warning
- Error
-
-
-
- Message
-
- 信息
- 错误
- 警告
- 成功
-
-
-
- Notification
-
- 信息
- 错误
- 警告
- 成功
-
-
-
- Segmented
-
-
-
- V-Loading
-
- 一些演示的内容
-
-
-
-
-
-
-
-
-
-
-
diff --git a/apps/web-ele/src/views/demos/form/basic.vue b/apps/web-ele/src/views/demos/form/basic.vue
deleted file mode 100644
index 0ecab5864..000000000
--- a/apps/web-ele/src/views/demos/form/basic.vue
+++ /dev/null
@@ -1,191 +0,0 @@
-
-
-
-
-
-
-
-
-
- 基础表单演示
- 设置表单值
-
-
- 打开抽屉
-
-
-
diff --git a/apps/web-ele/vite.config.mts b/apps/web-ele/vite.config.mts
index 9f1e72353..8a36bcb78 100644
--- a/apps/web-ele/vite.config.mts
+++ b/apps/web-ele/vite.config.mts
@@ -13,11 +13,11 @@ export default defineConfig(async () => {
],
server: {
proxy: {
- '/api': {
+ '/admin-api': {
changeOrigin: true,
- rewrite: (path) => path.replace(/^\/api/, ''),
+ rewrite: (path) => path.replace(/^\/admin-api/, ''),
// mock代理目标地址
- target: 'http://localhost:5320/api',
+ target: 'http://localhost:48080/admin-api',
ws: true,
},
},