diff --git a/package.json b/package.json index 3a3a123..88d21cd 100644 --- a/package.json +++ b/package.json @@ -13,11 +13,12 @@ "format": "prettier --write src/" }, "dependencies": { - "@vueuse/core": "^13.2.0" + "@vueuse/core": "^13.2.0", + "echarts": "^5.6.0" }, "devDependencies": { - "@ease-forge/runtime": "^1.0.12", - "@ease-forge/shared": "^1.0.12", + "@ease-forge/runtime": "^1.0.15", + "@ease-forge/shared": "^1.0.15", "@element-plus/icons-vue": "^2.3.1", "@guolao/vue-monaco-editor": "^1.5.5", "@rolldown/pluginutils": "1.0.0-beta.8-commit.56abf23", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 82befc2..41a226c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,11 +13,11 @@ importers: version: 13.2.0(vue@3.5.14(typescript@5.8.3)) devDependencies: '@ease-forge/runtime': - specifier: ^1.0.12 - version: 1.0.12(typescript@5.8.3) + specifier: ^1.0.15 + version: 1.0.15(typescript@5.8.3) '@ease-forge/shared': - specifier: ^1.0.12 - version: 1.0.12 + specifier: ^1.0.15 + version: 1.0.15 '@element-plus/icons-vue': specifier: ^2.3.1 version: 2.3.1(vue@3.5.14(typescript@5.8.3)) @@ -327,11 +327,11 @@ packages: '@dimforge/rapier3d-compat@0.12.0': resolution: {integrity: sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==} - '@ease-forge/runtime@1.0.12': - resolution: {integrity: sha512-L8X+uLb4/uxJrk9N7FRA5qCc6mXwQWGyQA1DN0FLF4Yqc4j/ErOfnWpmy45EkDqSbDNF1PS5CGMBTXW9dmw2XQ==} + '@ease-forge/runtime@1.0.15': + resolution: {integrity: sha512-PPVRGNRk4+7rGARL56772crYub2YGl86nnKuIUSH6fha44jpXJXAqOqrXlZ/mn7YcpQo5GNofKvVkGnTULA5DA==} - '@ease-forge/shared@1.0.12': - resolution: {integrity: sha512-+in1kiZnVP/QETMGC6i7znJKBs6WUMz8f9yHmGlmWvunTf6Ap7B60fvK7W12NlPpAnqH8WIRtLR5cSmgNeUQsQ==} + '@ease-forge/shared@1.0.15': + resolution: {integrity: sha512-R2FcwWCyrCeKN+f9iyNpBkvO9HNXpfX3ssMbGVTpKG9vPd+rYOK6xyBHgnjnVCYR8PptRAAtgY4cZkSMiohWrQ==} '@element-plus/icons-vue@2.3.1': resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==} @@ -1199,7 +1199,7 @@ packages: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} gsap@3.13.0: - resolution: {integrity: sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw==, tarball: https://registry.npmmirror.com/gsap/-/gsap-3.13.0.tgz} + resolution: {integrity: sha512-QL7MJ2WMjm1PHWsoFrAQH/J8wUeqZvMtHO58qdekHpCfhvhSL4gSiz6vJf5EeMP0LOn3ZCprL2ki/gjED8ghVw==} has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} @@ -1695,7 +1695,7 @@ packages: engines: {node: '>=16'} three-csg-ts@3.2.0: - resolution: {integrity: sha512-oTYg8kdal6qgHDbso/6VzA12Udf2ic2uXhf0XlJzuSP+Gs0OUR5gTHSZ7GotAE+M/QcVlw41eOwiWZVnJG5/8w==, tarball: https://registry.npmmirror.com/three-csg-ts/-/three-csg-ts-3.2.0.tgz} + resolution: {integrity: sha512-oTYg8kdal6qgHDbso/6VzA12Udf2ic2uXhf0XlJzuSP+Gs0OUR5gTHSZ7GotAE+M/QcVlw41eOwiWZVnJG5/8w==} peerDependencies: '@types/three': '>= 0.154.0' three: '>= 0.154.0' @@ -2100,9 +2100,9 @@ snapshots: '@dimforge/rapier3d-compat@0.12.0': {} - '@ease-forge/runtime@1.0.12(typescript@5.8.3)': + '@ease-forge/runtime@1.0.15(typescript@5.8.3)': dependencies: - '@ease-forge/shared': 1.0.12 + '@ease-forge/shared': 1.0.15 '@vue/shared': 3.5.13 json5: 2.2.3 lodash: 4.17.21 @@ -2112,7 +2112,7 @@ snapshots: - debug - typescript - '@ease-forge/shared@1.0.12': + '@ease-forge/shared@1.0.15': dependencies: axios: 1.9.0 csstype: 3.1.3 diff --git a/src/assets/images/rotate.svg b/src/assets/images/rotate.svg new file mode 100644 index 0000000..3d8fb43 --- /dev/null +++ b/src/assets/images/rotate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/data-form/DataForm.vue b/src/components/data-form/DataForm.vue index 1e2c36a..9cfe7b6 100644 --- a/src/components/data-form/DataForm.vue +++ b/src/components/data-form/DataForm.vue @@ -104,10 +104,10 @@ function toDataFormItems(formFields?: Array, formData?: FormData) { * @param formData 表单数据 */ function toDataFormItem(formField: FormField, formData?: FormData) { - const { dataPath, widthCount, label, input, inputProps, format, transform, extInputs, hidden, watchValues, rawProps } = formField; + const { dataPath, widthCount, label, inputRef, input, inputProps, format, transform, extInputs, hidden, watchValues, rawProps } = formField; const item: DataFormItem = { widthCount: widthCount ?? 1, - inputRef: dataPath?.replaceAll(/[.\[\]]/g, '_') + '_' + lodash.uniqueId(), + inputRef: inputRef ?? dataPath?.replaceAll(/[.\[\]]/g, '_') + '_' + lodash.uniqueId(), formItemProps: { ...rawProps }, dataPath, format, @@ -115,9 +115,7 @@ function toDataFormItem(formField: FormField, formData?: FormData) { hidden, }; if (dataPath) { - item.formItemProps.name = dataPathToNamePath(dataPath); - } else { - item.formItemProps.autoLink = false; + item.formItemProps.prop = dataPathToNamePath(dataPath); } if (dataPath && Typeof.isFunction(label)) { const dataValue = Expression.getKeyPathValue(dataPath, formData); @@ -485,7 +483,7 @@ export type { } .data-form-item-no-label :deep(> .el-form-item__content), -.data-form-item-ext-input :deep(> .el-form-item__content){ +.data-form-item-ext-input :deep(> .el-form-item__content) { margin-left: 0 !important; } diff --git a/src/components/data-form/DataFormTypes.ts b/src/components/data-form/DataFormTypes.ts index 81c2a6d..fa682a0 100644 --- a/src/components/data-form/DataFormTypes.ts +++ b/src/components/data-form/DataFormTypes.ts @@ -111,6 +111,8 @@ interface FormField { label?: Label; /** 字段输入组件,组件名或者组件对象 */ input?: any; + /** 输入组件ref */ + inputRef?: string; /** 字段输入组件props */ inputProps?: FormInputBaseProps; /** 表单数据绑定到表单组件上时的格式化操作 */ diff --git a/src/config.ts b/src/config.ts new file mode 100644 index 0000000..e3838b9 --- /dev/null +++ b/src/config.ts @@ -0,0 +1,61 @@ +import type { InternalAxiosRequestConfig } from "axios"; +import { Constant, initGlobalConfig } from "@ease-forge/shared"; +import { initGlobalConfigWithRuntime } from "@ease-forge/runtime"; +import router from "@/router"; + +function globalConfig() { + window.globalConfig.customAxios = axiosInstance => { + // 全局请求拦截 + axiosInstance.interceptors.request.clear(); + axiosInstance.interceptors.request.use( + (request: InternalAxiosRequestConfig) => request, + (error: any) => { + const err: AxiosInterceptorError = { + rawError: error, + title: "系统错误", + message: "发送请求给服务端失败,请检查电脑网络,再重试", + status: -1, + }; + return Promise.reject(err); + }, + ); + // 全局拦截配置 + axiosInstance.interceptors.response.clear(); + axiosInstance.interceptors.response.use( + response => response, + (error: any) => { + const { response } = error; + const err: AxiosInterceptorError = { + rawError: error, + status: response?.status ?? -1, + title: "系统错误", + message: "", + }; + if (!error || !response) { + err.message = "请求服务端异常"; + } else if (response?.status === 401) { + err.title = "当前用户未登录"; + err.message = "当前用户未登录,请先登录系统"; + router.push({ name: "login" }).finally(); + } else { + err.title = "操作失败"; + const { data: { message, validMessageList } } = response; + if (validMessageList) { + err.message = "请求参数校验失败"; + } else if (message) { + err.message = message ?? Constant.defHttpErrorMsg[response.status] ?? "服务器异常"; + } + } + system.msg(err.message); + return Promise.reject(err); + }, + ); + return axiosInstance; + }; + initGlobalConfig(); + initGlobalConfigWithRuntime(); +} + +export { + globalConfig, +} \ No newline at end of file diff --git a/src/currentUser.ts b/src/currentUser.ts new file mode 100644 index 0000000..7e75148 --- /dev/null +++ b/src/currentUser.ts @@ -0,0 +1,24 @@ +import lodash from "lodash"; +import { Request } from "@ease-forge/shared"; + +async function getCurrentUser() { + return Request.request.post("/api/current_user").then(res => { + const userInfo = res.userInfo; + const { loginName, userId, userName } = userInfo; + window.globalConfig.user = { + uid: lodash.toString(userId), + loginName: loginName, + nickname: userName, + }; + window.globalConfig.security.roles.length = 0; + window.globalConfig.security.permissions.length = 0; + window.globalConfig.security.roles.push(...res.roles); + window.globalConfig.security.permissions.push(...res.permissions); + }).catch(err => { + console.log("未登录", err); + }); +} + +export { + getCurrentUser +} diff --git a/src/editor/CatalogDefine.vue b/src/editor/CatalogDefine.vue new file mode 100644 index 0000000..ad15034 --- /dev/null +++ b/src/editor/CatalogDefine.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/src/editor/ModelMain.vue b/src/editor/ModelMain.vue index 2040469..df5af9c 100644 --- a/src/editor/ModelMain.vue +++ b/src/editor/ModelMain.vue @@ -60,7 +60,7 @@ - + @@ -112,13 +112,14 @@ import { getAllWidget, getWidgetByName, getWidgetBySide } from '@/runtime/Define import Model2DEditor from './Model2DEditor.vue' import Model3DViewer from './Model3DViewer.vue' import { normalizeShortKey } from '@/utils/webutils.ts' +import CatalogDefine from './CatalogDefine.vue' import Logo from '@/assets/images/logo.png' import './ModelMain.less' import EventBus from '@/runtime/EventBus.js' export default { - components: { Model2DEditor, Model3DViewer, Split, SplitArea }, + components: { Model2DEditor, Model3DViewer, Split, SplitArea, CatalogDefine }, created() { ModelMainInit() }, diff --git a/src/main.ts b/src/main.ts index b60708d..e970839 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,34 +1,31 @@ import { createApp } from 'vue' import { createPinia } from 'pinia' - import App from './App.vue' import router from './router' import * as webIndex from '@/components/webindex' import { directive, menusEvent, Vue3Menus } from 'vue3-menus' import ElementPlus from 'element-plus' -import { initGlobalConfig } from "@ease-forge/shared"; -import { initGlobalConfigWithRuntime } from "@ease-forge/runtime"; +import { globalConfig } from "@/config.ts"; import System from '@/runtime/System' - +import { getCurrentUser } from "@/currentUser.ts"; import 'ag-grid-community/styles/ag-grid.css' import 'ag-grid-community/styles/ag-theme-alpine.css' import 'element-plus/dist/index.css' import './main.less' -initGlobalConfig(); -initGlobalConfigWithRuntime(); - -const app = createApp(App) - -app.use(createPinia()) -app.use(ElementPlus) -app.component('vue3-menus', Vue3Menus) -app.directive('menus', directive) -app.config.globalProperties.$menusEvent = menusEvent - -window['system'] = new System(app) - -app.use(router) -app.use(webIndex) - -app.mount('#app') +async function main() { + const app = createApp(App) + app.use(createPinia()) + app.use(ElementPlus) + app.component('vue3-menus', Vue3Menus) + app.directive('menus', directive) + app.config.globalProperties.$menusEvent = menusEvent + window['system'] = new System(app) + app.use(router) + app.use(webIndex) + app.mount('#app') + globalConfig(); + await getCurrentUser(); +} + +main().finally(); diff --git a/src/router/index.ts b/src/router/index.ts index fb5a3a2..3315653 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -7,7 +7,151 @@ const router = createRouter({ path: '/', name: 'home', // 自动引导到 /editor - redirect: '/editor' + component: () => import('@/views/HomeView.vue'), + children: [ + { + path: '/dashboard', + name: 'dashboard', + meta: { + title: '仪表盘' + }, + component: () => import('@/views/dashboard/index.vue') + }, + { + path: '/modelingSimulation', + name: 'modelingSimulation', + meta: { + title: '建模仿真控制平台' + }, + component: () => import('@/views/modelingSimulation/index.vue') + }, + { + path: '/taskManagement', + name: 'taskManagement', + children:[ + { + path: '/taskQuery', + name: 'taskQuery', + meta: { + title: '任务查询' + }, + component: () => import('@/views/taskManagement/taskQuery.vue') + }, + { + path: '/automatedPresentation', + name: 'automatedPresentation', + meta: { + title: '自动演示管理' + }, + component: () => import('@/views/taskManagement/automatedPresentation.vue') + } + ] + }, + { + path: '/log', + name: 'log', + children:[ + { + path: '/upstream', + name: 'upstream', + meta: { + title: '上游接口日志' + }, + component: () => import('@/views/log/upstream.vue') + }, + { + path: '/device', + name: 'device', + meta: { + title: '设备报文日志' + }, + component: () => import('@/views/log/device.vue') + } + ] + }, + { + path: '/device', + name: 'device', + children:[ + { + path: '/points', + name: 'points', + meta: { + title: '点位管理' + }, + component: () => import('@/views/device/points.vue') + }, + { + path: '/locations', + name: 'locations', + meta: { + title: '货位管理' + }, + component: () => import('@/views/device/locations.vue') + }, + { + path: '/vehicles', + name: 'vehicles', + meta: { + title: '车辆管理' + }, + component: () => import('@/views/device/vehicles.vue') + }, + { + path: '/chargers', + name: 'chargers', + meta: { + title: '充电位管理' + }, + component: () => import('@/views/device/chargers.vue') + } + ] + }, + { + path: '/inventory', + name: 'inventory', + children:[ + { + path: '/query', + name: 'query', + meta: { + title: '库存查询' + }, + component: () => import('@/views/inventory/query.vue') + }, + { + path: '/account', + name: 'account', + meta: { + title: '帐页查询' + }, + component: () => import('@/views/inventory/account.vue') + } + ] + }, + { + path: '/user', + name: 'user', + children:[ + { + path: '/users', + name: 'users', + meta: { + title: '用户管理' + }, + component: () => import('@/views/user/users.vue') + }, + { + path: '/roles', + name: 'roles', + meta: { + title: '角色管理' + }, + component: () => import('@/views/user/roles.vue') + } + ] + } + ] }, { path: '/tp', diff --git a/src/views/Header.vue b/src/views/Header.vue new file mode 100644 index 0000000..bb3226a --- /dev/null +++ b/src/views/Header.vue @@ -0,0 +1,74 @@ + + + + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index 3ed23fc..df7da33 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,50 +1,126 @@ - - function animate() { - requestAnimationFrame(animate) - cube.rotation.x += 0.01 - cube.rotation.y += 0.01 - renderer.render(scene, camera) + diff --git a/src/views/Login.vue b/src/views/Login.vue new file mode 100644 index 0000000..895a66f --- /dev/null +++ b/src/views/Login.vue @@ -0,0 +1,181 @@ + + + + + \ No newline at end of file diff --git a/src/views/Sidebar.vue b/src/views/Sidebar.vue new file mode 100644 index 0000000..0e64ca7 --- /dev/null +++ b/src/views/Sidebar.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/views/dashboard/EChartWrapper.vue b/src/views/dashboard/EChartWrapper.vue new file mode 100644 index 0000000..2e6aaad --- /dev/null +++ b/src/views/dashboard/EChartWrapper.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/src/views/dashboard/index.vue b/src/views/dashboard/index.vue new file mode 100644 index 0000000..b53de95 --- /dev/null +++ b/src/views/dashboard/index.vue @@ -0,0 +1,281 @@ + + + diff --git a/src/views/device/chargers.vue b/src/views/device/chargers.vue new file mode 100644 index 0000000..188d6a7 --- /dev/null +++ b/src/views/device/chargers.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/device/locations.vue b/src/views/device/locations.vue new file mode 100644 index 0000000..cca4dcf --- /dev/null +++ b/src/views/device/locations.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/device/points.vue b/src/views/device/points.vue new file mode 100644 index 0000000..89a0c01 --- /dev/null +++ b/src/views/device/points.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/device/vehicles.vue b/src/views/device/vehicles.vue new file mode 100644 index 0000000..1970a3b --- /dev/null +++ b/src/views/device/vehicles.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/inventory/account.vue b/src/views/inventory/account.vue new file mode 100644 index 0000000..c991376 --- /dev/null +++ b/src/views/inventory/account.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/inventory/query.vue b/src/views/inventory/query.vue new file mode 100644 index 0000000..e0a617a --- /dev/null +++ b/src/views/inventory/query.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/log/device.vue b/src/views/log/device.vue new file mode 100644 index 0000000..e0941c8 --- /dev/null +++ b/src/views/log/device.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/log/upstream.vue b/src/views/log/upstream.vue new file mode 100644 index 0000000..419ef11 --- /dev/null +++ b/src/views/log/upstream.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/modelingSimulation/index.vue b/src/views/modelingSimulation/index.vue new file mode 100644 index 0000000..f4cc1b5 --- /dev/null +++ b/src/views/modelingSimulation/index.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/taskManagement/automatedPresentation.vue b/src/views/taskManagement/automatedPresentation.vue new file mode 100644 index 0000000..b7da511 --- /dev/null +++ b/src/views/taskManagement/automatedPresentation.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/taskManagement/taskQuery.vue b/src/views/taskManagement/taskQuery.vue new file mode 100644 index 0000000..28b5590 --- /dev/null +++ b/src/views/taskManagement/taskQuery.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/user/roles.vue b/src/views/user/roles.vue new file mode 100644 index 0000000..ce510db --- /dev/null +++ b/src/views/user/roles.vue @@ -0,0 +1,12 @@ + + + diff --git a/src/views/user/users.vue b/src/views/user/users.vue new file mode 100644 index 0000000..cea3ce3 --- /dev/null +++ b/src/views/user/users.vue @@ -0,0 +1,12 @@ + + +