From 13a104a133da267de3ae4702c5adea1ca2976f84 Mon Sep 17 00:00:00 2001 From: zhanghao <774378400@qq.com> Date: Wed, 3 Sep 2025 09:16:13 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=B0=83=E7=94=A8=E5=A4=A7=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/permission.js | 146 ++-- src/plugins/tab.js | 138 ++-- src/views/flow/config.js | 550 +++++++-------- src/views/flow/index.vue | 1384 +++++++++++++++++++------------------- vite.config.js | 136 ++-- 5 files changed, 1178 insertions(+), 1176 deletions(-) diff --git a/src/permission.js b/src/permission.js index 6063a3b..9114f1a 100644 --- a/src/permission.js +++ b/src/permission.js @@ -1,73 +1,73 @@ -import router from './router' -import { ElMessage } from 'element-plus' -import NProgress from 'nprogress' -import 'nprogress/nprogress.css' -import { getToken } from '@/utils/auth' -import { isHttp, isPathMatch } from '@/utils/validate' -import { isRelogin } from '@/utils/request' -import useUserStore from '@/store/modules/user' -import useSettingsStore from '@/store/modules/settings' -import usePermissionStore from '@/store/modules/permission' - -NProgress.configure({ showSpinner: false }) - -const whiteList = ['/login', '/register'] - -const isWhiteList = (path) => { - return whiteList.some(pattern => isPathMatch(pattern, path)) -} - -router.beforeEach((to, from, next) => { - if (to.meta?.noLogin) { - next() - return - } - NProgress.start() - if (getToken()) { - to.meta.title && useSettingsStore().setTitle(to.meta.title) - /* has token*/ - if (to.path === '/login') { - next({ path: '/' }) - NProgress.done() - } else if (isWhiteList(to.path)) { - next() - } else { - if (useUserStore().roles.length === 0) { - isRelogin.show = true - // 判断当前用户是否已拉取完user_info信息 - useUserStore().getInfo().then(() => { - isRelogin.show = false - usePermissionStore().generateRoutes().then(accessRoutes => { - // 根据roles权限生成可访问的路由表 - accessRoutes.forEach(route => { - if (!isHttp(route.path)) { - router.addRoute(route) // 动态添加可访问路由表 - } - }) - next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 - }) - }).catch(err => { - useUserStore().logOut().then(() => { - ElMessage.error(err) - next({ path: '/' }) - }) - }) - } else { - next() - } - } - } else { - // 没有token - if (isWhiteList(to.path)) { - // 在免登录白名单,直接进入 - next() - } else { - next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 - NProgress.done() - } - } -}) - -router.afterEach(() => { - NProgress.done() -}) +import router from './router' +import { ElMessage } from 'element-plus' +import NProgress from 'nprogress' +import 'nprogress/nprogress.css' +import { getToken } from '@/utils/auth' +import { isHttp, isPathMatch } from '@/utils/validate' +import { isRelogin } from '@/utils/request' +import useUserStore from '@/store/modules/user' +import useSettingsStore from '@/store/modules/settings' +import usePermissionStore from '@/store/modules/permission' + +NProgress.configure({ showSpinner: false }) + +const whiteList = ['/login', '/register'] + +const isWhiteList = (path) => { + return whiteList.some(pattern => isPathMatch(pattern, path)) +} + +router.beforeEach((to, from, next) => { + if (to.meta?.noLogin) { + next() + return + } + NProgress.start() + if (getToken()) { + to.meta.title && useSettingsStore().setTitle(to.meta.title) + /* has token*/ + if (to.path === '/login') { + next({ path: '/' }) + NProgress.done() + } else if (isWhiteList(to.path)) { + next() + } else { + if (useUserStore().roles.length === 0) { + isRelogin.show = true + // 判断当前用户是否已拉取完user_info信息 + useUserStore().getInfo().then(() => { + isRelogin.show = false + usePermissionStore().generateRoutes().then(accessRoutes => { + // 根据roles权限生成可访问的路由表 + accessRoutes.forEach(route => { + if (!isHttp(route.path)) { + router.addRoute(route) // 动态添加可访问路由表 + } + }) + next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 + }) + }).catch(err => { + useUserStore().logOut().then(() => { + ElMessage.error(err) + next({ path: '/' }) + }) + }) + } else { + next() + } + } + } else { + // 没有token + if (isWhiteList(to.path)) { + // 在免登录白名单,直接进入 + next() + } else { + next(`/login?redirect=${to.fullPath}`) // 否则全部重定向到登录页 + NProgress.done() + } + } +}) + +router.afterEach(() => { + NProgress.done() +}) diff --git a/src/plugins/tab.js b/src/plugins/tab.js index 7b51cf5..004aa86 100644 --- a/src/plugins/tab.js +++ b/src/plugins/tab.js @@ -1,69 +1,69 @@ -import useTagsViewStore from '@/store/modules/tagsView' -import router from '@/router' - -export default { - // 刷新当前tab页签 - refreshPage(obj) { - const { path, query, matched } = router.currentRoute.value; - if (obj === undefined) { - matched.forEach((m) => { - if (m.components && m.components.default && m.components.default.name) { - if (!['Layout', 'ParentView'].includes(m.components.default.name)) { - obj = { name: m.components.default.name, path: path, query: query }; - } - } - }); - } - return useTagsViewStore().delCachedView(obj).then(() => { - const { path, query } = obj - router.replace({ - path: '/redirect' + path, - query: query - }) - }) - }, - // 关闭当前tab页签,打开新页签 - closeOpenPage(obj) { - useTagsViewStore().delView(router.currentRoute.value); - if (obj !== undefined) { - return router.push(obj); - } - }, - // 关闭指定tab页签 - closePage(obj) { - if (obj === undefined) { - return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => { - const latestView = visitedViews.slice(-1)[0] - if (latestView) { - return router.push(latestView.fullPath) - } - return router.push('/'); - }); - } - return useTagsViewStore().delView(obj); - }, - // 关闭所有tab页签 - closeAllPage() { - return useTagsViewStore().delAllViews(); - }, - // 关闭左侧tab页签 - closeLeftPage(obj) { - return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); - }, - // 关闭右侧tab页签 - closeRightPage(obj) { - return useTagsViewStore().delRightTags(obj || router.currentRoute.value); - }, - // 关闭其他tab页签 - closeOtherPage(obj) { - return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); - }, - // 打开tab页签 - openPage(url) { - return router.push(url); - }, - // 修改tab页签 - updatePage(obj) { - return useTagsViewStore().updateVisitedView(obj); - } -} +import useTagsViewStore from '@/store/modules/tagsView' +import router from '@/router' + +export default { + // 刷新当前tab页签 + refreshPage(obj) { + const { path, query, matched } = router.currentRoute.value; + if (obj === undefined) { + matched.forEach((m) => { + if (m.components && m.components.default && m.components.default.name) { + if (!['Layout', 'ParentView'].includes(m.components.default.name)) { + obj = { name: m.components.default.name, path: path, query: query }; + } + } + }); + } + return useTagsViewStore().delCachedView(obj).then(() => { + const { path, query } = obj + router.replace({ + path: '/redirect' + path, + query: query + }) + }) + }, + // 关闭当前tab页签,打开新页签 + closeOpenPage(obj) { + useTagsViewStore().delView(router.currentRoute.value); + if (obj !== undefined) { + return router.push(obj); + } + }, + // 关闭指定tab页签 + closePage(obj) { + if (obj === undefined) { + return useTagsViewStore().delView(router.currentRoute.value).then(({ visitedViews }) => { + const latestView = visitedViews.slice(-1)[0] + if (latestView) { + return router.push(latestView.fullPath) + } + return router.push('/'); + }); + } + return useTagsViewStore().delView(obj); + }, + // 关闭所有tab页签 + closeAllPage() { + return useTagsViewStore().delAllViews(); + }, + // 关闭左侧tab页签 + closeLeftPage(obj) { + return useTagsViewStore().delLeftTags(obj || router.currentRoute.value); + }, + // 关闭右侧tab页签 + closeRightPage(obj) { + return useTagsViewStore().delRightTags(obj || router.currentRoute.value); + }, + // 关闭其他tab页签 + closeOtherPage(obj) { + return useTagsViewStore().delOthersViews(obj || router.currentRoute.value); + }, + // 打开tab页签 + openPage(url) { + return router.push(url); + }, + // 修改tab页签 + updatePage(obj) { + return useTagsViewStore().updateVisitedView(obj); + } +} diff --git a/src/views/flow/config.js b/src/views/flow/config.js index 6b55502..3026dad 100644 --- a/src/views/flow/config.js +++ b/src/views/flow/config.js @@ -1,274 +1,276 @@ -import { Group, SelectionSelect } from "@logicflow/extension"; -import { registerCommon } from "./nodes/common/index"; - -import { registerFunction } from './nodes/function' - -import cameraSvg from './icon/camera.svg' -import videoSvg from './icon/video.svg' -import loopSvg from './icon/loop.svg' -import stopLoopSvg from './icon/stopLoop.svg' -import switchSvg from './icon/switch.svg' -import startSvg from './icon/start.svg' -import endSvg from './icon/end.svg' -import microphoneSvg from './icon/microphone.svg' -import sleepSvg from './icon/sleep.svg' - -import { v4 as randomUUID } from 'uuid' - -import { useFlowStore } from "@/store/modules/flow"; - -const flowStore = useFlowStore(); - - -export const lfConfig = { - idGenerator: () => { - // 生成标准UUID并移除连字符 - // return crypto.randomUUID().replace(/-/g, ''); - return randomUUID().replace(/-/g, '') - }, - background: { - backgroundColor: "#f6f8fa", - }, - grid: false, - plugins: [Group, SelectionSelect], - animation: true, - adjustEdgeStartAndEnd: false, - // multipleSelectKey: "ctrl", - // disabledTools: ["multipleSelect"], - partial: true, - // group: { - // foldable: true, // 启用折叠功能 - // foldSize: 30, // 折叠后显示的图标尺寸 - // }, - edgeType: "bezier", - style: { - anchor: { - show: true, // 强制全局锚点显示 - hoverOn: false, - visibility: "visible", - fill: "#FF5722", // 实心绿色 - stroke: "#FF5722", // 边框同色 - strokeWidth: 0, // 消除边框 - r: 7, // 锚点半径 - hover: { fill: "#FF5722" }, // 禁用悬停变色 - }, - anchorLine: { - stroke: "#FF5722", - strokeWidth: 2, - strokeDasharray: "3,2", - }, - bezier: { - stroke: "#FF5722", - strokeWidth: 2, - arrow: false, // 关闭箭头显示 - animation: true, // 开启动画效果 - animationSpeed: 3, - }, - }, -}; - -// 注册自定义节点 -export const registerCustomizeNode = (lf) => { - registerCommon(lf) - registerFunction(lf) -}; - -const deviceOptions = () => { - return ['cam1', 'cam2', 'cam3', 'cam4'] -} - -const audioOptions = () => { - return ['spk1'] -} - -export const collapseList = [ - { - collapseTitle: "相机", - nodeList: [ - { - icon: cameraSvg, - name: "开启相机", - type: "serviceNode", - desc: "在获取相机照片时,需要先启动相机", - action: 'CAMERA_START', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'json' - }, - { - icon: cameraSvg, - name: "获取图片", - type: "serviceNode", - desc: "获取相机拍摄的照片", - action: 'CAMERA_GETRGBIMAGE', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'img', - outputParams: [{ name: 'imageUrl', type: 'Array', desc: '图片地址数组'}] - }, - { - icon: cameraSvg, - name: "关闭相机", - type: "serviceNode", - desc: "获取相机照片后,关闭该相机", - action: 'CAMERA_STOP', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'json' - }, - ], - }, - { - collapseTitle: "录像", - nodeList: [ - { - icon: videoSvg, - name: "开启录像", - type: "serviceNode", - desc: "开启摄像头,并开始录像", - action: 'CAMERA_RECORDING_START', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'json' - }, - { - icon: videoSvg, - name: "结束录像", - type: "serviceNode", - desc: "停止录像,并关闭摄像头", - action: 'CAMERA_RECORDING_STOP', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'video', - outputParams: [{ name: 'videoUrl', type: 'Array', desc: '视频播放地址数组'}] - } - ], - }, - { - collapseTitle: "功能", - nodeList: [ - { - icon: loopSvg, - name: "循环", - type: "loop", - action: 'START_LOOP', - desc: "实现对列表对象循环执行一系列任务", - }, - { - icon: stopLoopSvg, - name: "结束循环", - type: "stopLoop", - action: 'STOP_LOOP', - desc: "用于立即终止当前所在的循环,跳出循环体", - }, - { - icon: startSvg, - name: "单次循环开始", - type: "subStart", - action: 'SUB_START', - desc: "循环体内部工作流的开始节点,开始循环体内部的单次流程", - }, - { - icon: endSvg, - name: "单次循环结束", - type: "subEnd", - action: 'SUB_END', - desc: "循环体内部工作流的终止节点,结束循环体内部的单次流程", - }, - { - icon: switchSvg, - name: "分支", - type: "branch", - action: 'BRANCH', - desc: "连接多个下游分支,根据设定的条件按照顺序查找的方式来匹配运行的分支,如果匹配到某条件则只运行该条件对应的分支,否则继续匹配下一条件直至结束", - }, - { - icon: sleepSvg, - name: "睡眠", - type: "sleep", - desc: "用于睡眠整个流程,表示延迟多少毫秒", - action: 'sleep', - nodeParams: [ - { name: "delayMs", type: "input", componentType: 'number', input: "", disabled: true } - ], - outputType: 'json' - }, - ], - }, - { - collapseTitle: "机器人", - nodeList: [ - { - icon: videoSvg, - name: "机械臂", - type: "serviceNode", - desc: "控制机器人的手臂", - action: 'ALM', - nodeParams: [ - { name: "deviceId", type: "input", input: "", disabled: true } - ], - outputType: 'json' - }, - ], - }, - { - collapseTitle: "音频", - nodeList: [ - { - icon: microphoneSvg, - name: "启动麦克风", - type: "serviceNode", - desc: "用于启动麦克风的节点", - action: 'MICROPHONE_START', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'json' - }, - { - icon: microphoneSvg, - name: "停止麦克风", - type: "serviceNode", - desc: "用于停止麦克风的节点", - action: 'MICROPHONE_START', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } - ], - outputType: 'json' - }, - { - icon: microphoneSvg, - name: "播放音频", - type: "serviceNode", - desc: "用于播放音频的节点", - action: 'SPEAKER_PLAYAUDIO', - nodeParams: [ - { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: audioOptions(), disabled: true } - ], - outputType: 'json' - }, - ], - }, - { - collapseTitle: "大模型", - nodeList: [ - { - icon: microphoneSvg, - name: "获取触控坐标", - type: "serviceNode", - desc: "用于获取触控坐标的节点", - action: 'TOUCH_COORDINATES', - nodeParams: [ - { name: "words", type: "input", input: "", disabled: true } - ], - outputType: 'json', - outputParams: [{ name: 'coordinates', type: 'Object', desc: '坐标对象'}] - }, - ], - }, -] +import { Group, SelectionSelect } from "@logicflow/extension"; +import { registerCommon } from "./nodes/common/index"; + +import { registerFunction } from './nodes/function' + +import cameraSvg from './icon/camera.svg' +import videoSvg from './icon/video.svg' +import loopSvg from './icon/loop.svg' +import stopLoopSvg from './icon/stopLoop.svg' +import switchSvg from './icon/switch.svg' +import startSvg from './icon/start.svg' +import endSvg from './icon/end.svg' +import microphoneSvg from './icon/microphone.svg' +import sleepSvg from './icon/sleep.svg' + +import { v4 as randomUUID } from 'uuid' + +import { useFlowStore } from "@/store/modules/flow"; + +const flowStore = useFlowStore(); + + +export const lfConfig = { + idGenerator: () => { + // 生成标准UUID并移除连字符 + // return crypto.randomUUID().replace(/-/g, ''); + return randomUUID().replace(/-/g, '') + }, + background: { + backgroundColor: "#f6f8fa", + }, + grid: false, + plugins: [Group, SelectionSelect], + animation: true, + adjustEdgeStartAndEnd: false, + // multipleSelectKey: "ctrl", + // disabledTools: ["multipleSelect"], + partial: true, + // group: { + // foldable: true, // 启用折叠功能 + // foldSize: 30, // 折叠后显示的图标尺寸 + // }, + edgeType: "bezier", + style: { + anchor: { + show: true, // 强制全局锚点显示 + hoverOn: false, + visibility: "visible", + fill: "#FF5722", // 实心绿色 + stroke: "#FF5722", // 边框同色 + strokeWidth: 0, // 消除边框 + r: 7, // 锚点半径 + hover: { fill: "#FF5722" }, // 禁用悬停变色 + }, + anchorLine: { + stroke: "#FF5722", + strokeWidth: 2, + strokeDasharray: "3,2", + }, + bezier: { + stroke: "#FF5722", + strokeWidth: 2, + arrow: false, // 关闭箭头显示 + animation: true, // 开启动画效果 + animationSpeed: 3, + }, + }, +}; + +// 注册自定义节点 +export const registerCustomizeNode = (lf) => { + registerCommon(lf) + registerFunction(lf) +}; + +const deviceOptions = () => { + return ['cam1', 'cam2', 'cam3', 'cam4'] +} + +const audioOptions = () => { + return ['spk1'] +} + +export const collapseList = [ + { + collapseTitle: "相机", + nodeList: [ + { + icon: cameraSvg, + name: "开启相机", + type: "serviceNode", + desc: "在获取相机照片时,需要先启动相机", + action: 'CAMERA_START', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'json' + }, + { + icon: cameraSvg, + name: "获取图片", + type: "serviceNode", + desc: "获取相机拍摄的照片", + action: 'CAMERA_GETRGBIMAGE', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'img', + outputParams: [{ name: 'imageUrl', type: 'Array', desc: '图片地址数组'}] + }, + { + icon: cameraSvg, + name: "关闭相机", + type: "serviceNode", + desc: "获取相机照片后,关闭该相机", + action: 'CAMERA_STOP', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'json' + }, + ], + }, + { + collapseTitle: "录像", + nodeList: [ + { + icon: videoSvg, + name: "开启录像", + type: "serviceNode", + desc: "开启摄像头,并开始录像", + action: 'CAMERA_RECORDING_START', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'json' + }, + { + icon: videoSvg, + name: "结束录像", + type: "serviceNode", + desc: "停止录像,并关闭摄像头", + action: 'CAMERA_RECORDING_STOP', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'video', + outputParams: [{ name: 'videoUrl', type: 'Array', desc: '视频播放地址数组'}] + } + ], + }, + { + collapseTitle: "功能", + nodeList: [ + { + icon: loopSvg, + name: "循环", + type: "loop", + action: 'START_LOOP', + desc: "实现对列表对象循环执行一系列任务", + }, + { + icon: stopLoopSvg, + name: "结束循环", + type: "stopLoop", + action: 'STOP_LOOP', + desc: "用于立即终止当前所在的循环,跳出循环体", + }, + { + icon: startSvg, + name: "单次循环开始", + type: "subStart", + action: 'SUB_START', + desc: "循环体内部工作流的开始节点,开始循环体内部的单次流程", + }, + { + icon: endSvg, + name: "单次循环结束", + type: "subEnd", + action: 'SUB_END', + desc: "循环体内部工作流的终止节点,结束循环体内部的单次流程", + }, + { + icon: switchSvg, + name: "分支", + type: "branch", + action: 'BRANCH', + desc: "连接多个下游分支,根据设定的条件按照顺序查找的方式来匹配运行的分支,如果匹配到某条件则只运行该条件对应的分支,否则继续匹配下一条件直至结束", + }, + { + icon: sleepSvg, + name: "睡眠", + type: "sleep", + desc: "用于睡眠整个流程,表示延迟多少毫秒", + action: 'sleep', + nodeParams: [ + { name: "delayMs", type: "input", componentType: 'number', input: "", disabled: true } + ], + outputType: 'json' + }, + ], + }, + { + collapseTitle: "机器人", + nodeList: [ + { + icon: videoSvg, + name: "机械臂", + type: "serviceNode", + desc: "控制机器人的手臂", + action: 'ALM', + nodeParams: [ + { name: "deviceId", type: "input", input: "", disabled: true } + ], + outputType: 'json' + }, + ], + }, + { + collapseTitle: "音频", + nodeList: [ + { + icon: microphoneSvg, + name: "启动麦克风", + type: "serviceNode", + desc: "用于启动麦克风的节点", + action: 'MICROPHONE_START', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'json' + }, + { + icon: microphoneSvg, + name: "停止麦克风", + type: "serviceNode", + desc: "用于停止麦克风的节点", + action: 'MICROPHONE_START', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: deviceOptions(), disabled: true } + ], + outputType: 'json' + }, + { + icon: microphoneSvg, + name: "播放音频", + type: "serviceNode", + desc: "用于播放音频的节点", + action: 'SPEAKER_PLAYAUDIO', + nodeParams: [ + { name: "deviceId", type: "input", input: "", componentType: 'select', selectOptions: audioOptions(), disabled: true } + ], + outputType: 'json' + }, + ], + }, + { + collapseTitle: "大模型", + nodeList: [ + { + icon: microphoneSvg, + name: "获取触控坐标", + type: "serviceNode", + desc: "用于获取触控坐标的节点", + action: 'TOUCH_COORDINATES', + nodeParams: [ + { name: "targetFeature", type: "input", input: "运动模式", disabled: true }, + { name: "manufacturer", type: "input", input: "xiaomi", disabled: true }, + { name: "vehType", type: "input", input: "su7", disabled: true }, + ], + outputType: 'json', + outputParams: [{ name: 'coordinates', type: 'Object', desc: '坐标对象'}] + }, + ], + }, +] diff --git a/src/views/flow/index.vue b/src/views/flow/index.vue index 86b4c04..c0541a3 100644 --- a/src/views/flow/index.vue +++ b/src/views/flow/index.vue @@ -1,692 +1,692 @@ - - - - + + + + diff --git a/vite.config.js b/vite.config.js index 6ef73cf..4fde0b1 100644 --- a/vite.config.js +++ b/vite.config.js @@ -1,68 +1,68 @@ -import {defineConfig, loadEnv, normalizePath} from 'vite' -import path from 'path' -import createVitePlugins from './vite/plugins' - -// https://vitejs.dev/config/ -export default defineConfig(({mode, command}) => { - const env = loadEnv(mode, process.cwd()) - const {VITE_APP_ENV, VITE_API_URL} = env - const variablePath = normalizePath(path.resolve('./src/style/variable.scss')); - return { - // 部署生产环境和开发环境下的URL。 - // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上 - // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 - base: VITE_APP_ENV === 'production' ? '/' : '/', - plugins: createVitePlugins(env, command === 'build'), - resolve: { - // https://cn.vitejs.dev/config/#resolve-alias - alias: { - // 设置路径 - '~': path.resolve(__dirname, './'), - // 设置别名 - '@': path.resolve(__dirname, './src') - }, - // https://cn.vitejs.dev/config/#resolve-extensions - extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] - }, - // vite 相关配置 - server: { - port: 13080, - host: true, - open: true, - proxy: { - // https://cn.vitejs.dev/config/#server-proxy - '/dev-api': { - //杨 http://10.148.108.95:13080 - //赵 http://10.148.108.58:13080 - // dev http://10.148.20.34:13080 - // target: command === 'build' ? VITE_API_URL : 'http://10.148.20.34:13080', - target: command === 'build' ? VITE_API_URL : 'http://10.148.108.95:13080', - changeOrigin: true, - rewrite: (p) => p.replace(/^\/dev-api/, '') - } - } - }, - //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file - css: { - postcss: { - plugins: [ - { - postcssPlugin: 'internal:charset-removal', - AtRule: { - charset: (atRule) => { - if (atRule.name === 'charset') { - atRule.remove(); - } - } - } - } - ] - }, - preprocessorOptions: { - scss: { - additionalData: `@import "${variablePath}";` - }, - }, - } - } -}) +import {defineConfig, loadEnv, normalizePath} from 'vite' +import path from 'path' +import createVitePlugins from './vite/plugins' + +// https://vitejs.dev/config/ +export default defineConfig(({mode, command}) => { + const env = loadEnv(mode, process.cwd()) + const {VITE_APP_ENV, VITE_API_URL} = env + const variablePath = normalizePath(path.resolve('./src/style/variable.scss')); + return { + // 部署生产环境和开发环境下的URL。 + // 默认情况下,vite 会假设你的应用是被部署在一个域名的根路径上 + // 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。 + base: VITE_APP_ENV === 'production' ? '/' : '/', + plugins: createVitePlugins(env, command === 'build'), + resolve: { + // https://cn.vitejs.dev/config/#resolve-alias + alias: { + // 设置路径 + '~': path.resolve(__dirname, './'), + // 设置别名 + '@': path.resolve(__dirname, './src') + }, + // https://cn.vitejs.dev/config/#resolve-extensions + extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] + }, + // vite 相关配置 + server: { + port: 13080, + host: true, + open: true, + proxy: { + // https://cn.vitejs.dev/config/#server-proxy + '/dev-api': { + //杨 http://192.168.1.10:13080 + //赵 http://10.148.108.58:13080 + // dev http://10.148.20.34:13080 + // target: command === 'build' ? VITE_API_URL : 'http://10.148.20.34:13080', + target: command === 'build' ? VITE_API_URL : 'http://192.168.1.10:13080', + changeOrigin: true, + rewrite: (p) => p.replace(/^\/dev-api/, '') + } + } + }, + //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file + css: { + postcss: { + plugins: [ + { + postcssPlugin: 'internal:charset-removal', + AtRule: { + charset: (atRule) => { + if (atRule.name === 'charset') { + atRule.remove(); + } + } + } + } + ] + }, + preprocessorOptions: { + scss: { + additionalData: `@import "${variablePath}";` + }, + }, + } + } +})