Commit 93c569693ca208cff1b0a5c3fd7ab77a3f00b13b
1 parent
4cea34ff
'fix:修改前端路由模式,修复选择历史数据时,页面跟着滚动,feat:升级vue新版本以及compiler-sfc'
Showing
10 changed files
with
46 additions
and
68 deletions
@@ -60,7 +60,7 @@ | @@ -60,7 +60,7 @@ | ||
60 | "sortablejs": "^1.14.0", | 60 | "sortablejs": "^1.14.0", |
61 | "tinymce": "^5.8.2", | 61 | "tinymce": "^5.8.2", |
62 | "vditor": "^3.8.6", | 62 | "vditor": "^3.8.6", |
63 | - "vue": "3.2.2", | 63 | + "vue": "^3.2.31", |
64 | "vue-i18n": "9.1.7", | 64 | "vue-i18n": "9.1.7", |
65 | "vue-json-pretty": "^2.0.4", | 65 | "vue-json-pretty": "^2.0.4", |
66 | "vue-router": "^4.0.11", | 66 | "vue-router": "^4.0.11", |
@@ -90,7 +90,7 @@ | @@ -90,7 +90,7 @@ | ||
90 | "@vitejs/plugin-legacy": "^1.5.1", | 90 | "@vitejs/plugin-legacy": "^1.5.1", |
91 | "@vitejs/plugin-vue": "^1.4.0", | 91 | "@vitejs/plugin-vue": "^1.4.0", |
92 | "@vitejs/plugin-vue-jsx": "^1.1.7", | 92 | "@vitejs/plugin-vue-jsx": "^1.1.7", |
93 | - "@vue/compiler-sfc": "3.2.2", | 93 | + "@vue/compiler-sfc": "^3.2.31", |
94 | "@vue/test-utils": "^2.0.0-rc.12", | 94 | "@vue/test-utils": "^2.0.0-rc.12", |
95 | "autoprefixer": "^10.3.1", | 95 | "autoprefixer": "^10.3.1", |
96 | "commitizen": "^4.2.4", | 96 | "commitizen": "^4.2.4", |
@@ -189,7 +189,6 @@ export const getGATEWAY = (tbDeviceId: string) => { | @@ -189,7 +189,6 @@ export const getGATEWAY = (tbDeviceId: string) => { | ||
189 | 189 | ||
190 | // 获取子设备的分页 | 190 | // 获取子设备的分页 |
191 | export const getChildDevicePage = (params: ChildDeviceParams) => { | 191 | export const getChildDevicePage = (params: ChildDeviceParams) => { |
192 | - console.log(params); | ||
193 | return defHttp.get({ | 192 | return defHttp.get({ |
194 | url: '/device/relation', | 193 | url: '/device/relation', |
195 | params, | 194 | params, |
1 | import type { RouteRecordRaw } from 'vue-router'; | 1 | import type { RouteRecordRaw } from 'vue-router'; |
2 | import type { App } from 'vue'; | 2 | import type { App } from 'vue'; |
3 | 3 | ||
4 | -import { createRouter, createWebHashHistory } from 'vue-router'; | 4 | +import { createRouter, createWebHistory } from 'vue-router'; |
5 | import { basicRoutes } from './routes'; | 5 | import { basicRoutes } from './routes'; |
6 | 6 | ||
7 | // 白名单应该包含基本静态路由 | 7 | // 白名单应该包含基本静态路由 |
@@ -15,7 +15,7 @@ getRouteNames(basicRoutes); | @@ -15,7 +15,7 @@ getRouteNames(basicRoutes); | ||
15 | 15 | ||
16 | // app router | 16 | // app router |
17 | export const router = createRouter({ | 17 | export const router = createRouter({ |
18 | - history: createWebHashHistory(import.meta.env.VITE_PUBLIC_PATH), | 18 | + history: createWebHistory(import.meta.env.VITE_PUBLIC_PATH), |
19 | routes: basicRoutes as unknown as RouteRecordRaw[], | 19 | routes: basicRoutes as unknown as RouteRecordRaw[], |
20 | strict: true, | 20 | strict: true, |
21 | scrollBehavior: () => ({ left: 0, top: 0 }), | 21 | scrollBehavior: () => ({ left: 0, top: 0 }), |
@@ -107,7 +107,7 @@ const setting: ProjectConfig = { | @@ -107,7 +107,7 @@ const setting: ProjectConfig = { | ||
107 | // Fold trigger position | 107 | // Fold trigger position |
108 | trigger: TriggerEnum.HEADER, | 108 | trigger: TriggerEnum.HEADER, |
109 | // Turn on accordion mode, only show a menu | 109 | // Turn on accordion mode, only show a menu |
110 | - accordion: true, | 110 | + accordion: false, |
111 | // Switch page to close menu | 111 | // Switch page to close menu |
112 | closeMixSidebarOnChange: false, | 112 | closeMixSidebarOnChange: false, |
113 | // Module opening method ‘click’ |'hover' | 113 | // Module opening method ‘click’ |'hover' |
@@ -328,6 +328,7 @@ export const schemas: FormSchema[] = [ | @@ -328,6 +328,7 @@ export const schemas: FormSchema[] = [ | ||
328 | return { | 328 | return { |
329 | onChange(value) { | 329 | onChange(value) { |
330 | const { updateSchema } = formActionType; | 330 | const { updateSchema } = formActionType; |
331 | + console.log(value); | ||
331 | formModel.interval = ''; | 332 | formModel.interval = ''; |
332 | updateSchema({ | 333 | updateSchema({ |
333 | field: 'interval', | 334 | field: 'interval', |
@@ -337,6 +338,7 @@ export const schemas: FormSchema[] = [ | @@ -337,6 +338,7 @@ export const schemas: FormSchema[] = [ | ||
337 | }, | 338 | }, |
338 | }); | 339 | }); |
339 | }, | 340 | }, |
341 | + getPopupContainer: () => document.body, | ||
340 | options: [ | 342 | options: [ |
341 | { | 343 | { |
342 | label: '最近1小时', | 344 | label: '最近1小时', |
@@ -386,6 +388,7 @@ export const schemas: FormSchema[] = [ | @@ -386,6 +388,7 @@ export const schemas: FormSchema[] = [ | ||
386 | }, | 388 | }, |
387 | componentProps: { | 389 | componentProps: { |
388 | placeholder: '请选择分组间隔', | 390 | placeholder: '请选择分组间隔', |
391 | + getPopupContainer: () => document.body, | ||
389 | options: [ | 392 | options: [ |
390 | { | 393 | { |
391 | label: '5分钟', | 394 | label: '5分钟', |
@@ -419,6 +422,7 @@ export const schemas: FormSchema[] = [ | @@ -419,6 +422,7 @@ export const schemas: FormSchema[] = [ | ||
419 | label: '数据聚合功能', | 422 | label: '数据聚合功能', |
420 | component: 'Select', | 423 | component: 'Select', |
421 | componentProps: { | 424 | componentProps: { |
425 | + getPopupContainer: () => document.body, | ||
422 | options: [ | 426 | options: [ |
423 | { | 427 | { |
424 | label: '最小值', | 428 | label: '最小值', |
@@ -29,13 +29,14 @@ | @@ -29,13 +29,14 @@ | ||
29 | @register="registerModal" | 29 | @register="registerModal" |
30 | title="历史数据" | 30 | title="历史数据" |
31 | width="70%" | 31 | width="70%" |
32 | + :minHeight="400" | ||
32 | :footer="null" | 33 | :footer="null" |
33 | @cancel="cancelHistoryModal" | 34 | @cancel="cancelHistoryModal" |
34 | :canFullscreen="false" | 35 | :canFullscreen="false" |
35 | > | 36 | > |
36 | <BasicForm @register="registerForm" /> | 37 | <BasicForm @register="registerForm" /> |
37 | - <Empty v-show="!isNull" /> | ||
38 | <div v-show="isNull" ref="chartRef" :style="{ height: '600px', width }"></div> | 38 | <div v-show="isNull" ref="chartRef" :style="{ height: '600px', width }"></div> |
39 | + <Empty v-show="!isNull" /> | ||
39 | </BasicModal> | 40 | </BasicModal> |
40 | <DeviceDetailDrawer @register="registerDetailDrawer" /> | 41 | <DeviceDetailDrawer @register="registerDetailDrawer" /> |
41 | </div> | 42 | </div> |
@@ -109,7 +110,7 @@ | @@ -109,7 +110,7 @@ | ||
109 | // 表单验证 | 110 | // 表单验证 |
110 | await validate(); | 111 | await validate(); |
111 | let { endTs, interval, agg } = getFieldsValue(); | 112 | let { endTs, interval, agg } = getFieldsValue(); |
112 | - if (!endTs) return; | 113 | + if (!endTs || !keys.length) return; |
113 | // 数据收集 | 114 | // 数据收集 |
114 | const dataArray: any[] = []; | 115 | const dataArray: any[] = []; |
115 | const startTs = Date.now() - endTs; | 116 | const startTs = Date.now() - endTs; |
@@ -58,6 +58,7 @@ | @@ -58,6 +58,7 @@ | ||
58 | schemas: formSchema, | 58 | schemas: formSchema, |
59 | }); | 59 | }); |
60 | 60 | ||
61 | + // 初始化编辑器 | ||
61 | const initEditor = (jsScript?: string) => { | 62 | const initEditor = (jsScript?: string) => { |
62 | aceEditor.value = ace.edit(aceRef.value, { | 63 | aceEditor.value = ace.edit(aceRef.value, { |
63 | maxLines: 12, // 最大行数,超过会自动出现滚动条 | 64 | maxLines: 12, // 最大行数,超过会自动出现滚动条 |
@@ -89,21 +89,18 @@ | @@ -89,21 +89,18 @@ | ||
89 | const menuListModel = await getMenuList(); | 89 | const menuListModel = await getMenuList(); |
90 | processChildren(menuListModel); | 90 | processChildren(menuListModel); |
91 | treeData.value = menuListModel; | 91 | treeData.value = menuListModel; |
92 | - // console.log(treeData.value); | ||
93 | } | 92 | } |
94 | - | ||
95 | // 更新 | 93 | // 更新 |
96 | if (unref(isUpdate)) { | 94 | if (unref(isUpdate)) { |
97 | //通过角色id去获取角色对应的菜单的ids | 95 | //通过角色id去获取角色对应的菜单的ids |
98 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); | 96 | roleMenus.value = await getMenusIdsByRoleId(data.record.id); |
99 | - // TODO: 此处算法还可以优化一下。 循环跑了200+次 | ||
100 | - treeData.value.map((m) => { | ||
101 | - roleMenus.value.map((m1) => { | ||
102 | - if (m.key === m1 && m.children.length) { | ||
103 | - useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
104 | - } | ||
105 | - }); | ||
106 | - }); | 97 | + for (let m of treeData.value) { |
98 | + for (let m1 of roleMenus.value) { | ||
99 | + // 利用continue特性优化一下性能 | ||
100 | + if (!(m.key === m1 && m.children.length)) continue; | ||
101 | + useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
102 | + } | ||
103 | + } | ||
107 | treeRef.value.setCheckedKeys(roleMenus.value); | 104 | treeRef.value.setCheckedKeys(roleMenus.value); |
108 | roleId.value = data.record.id; | 105 | roleId.value = data.record.id; |
109 | setFieldsValue(data.record); | 106 | setFieldsValue(data.record); |
@@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
17 | :checkedkeys="roleMenus" | 17 | :checkedkeys="roleMenus" |
18 | checkable | 18 | checkable |
19 | toolbar | 19 | toolbar |
20 | - ref="tree" | 20 | + ref="treeRef" |
21 | title="菜单分配" | 21 | title="菜单分配" |
22 | @check="handleCheckClick" | 22 | @check="handleCheckClick" |
23 | :defaultExpandAll="true" | 23 | :defaultExpandAll="true" |
@@ -27,7 +27,7 @@ | @@ -27,7 +27,7 @@ | ||
27 | </BasicDrawer> | 27 | </BasicDrawer> |
28 | </template> | 28 | </template> |
29 | <script lang="ts"> | 29 | <script lang="ts"> |
30 | - import { defineComponent, ref, computed, unref, getCurrentInstance } from 'vue'; | 30 | + import { defineComponent, ref, computed, unref } from 'vue'; |
31 | import { BasicForm, useForm } from '/@/components/Form/index'; | 31 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | import { formSchema } from './role.data'; | 32 | import { formSchema } from './role.data'; |
33 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | 33 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
@@ -47,13 +47,12 @@ | @@ -47,13 +47,12 @@ | ||
47 | components: { BasicDrawer, BasicForm, BasicTree }, | 47 | components: { BasicDrawer, BasicForm, BasicTree }, |
48 | emits: ['success', 'register'], | 48 | emits: ['success', 'register'], |
49 | setup(_, { emit }) { | 49 | setup(_, { emit }) { |
50 | - const { proxy } = getCurrentInstance(); | ||
51 | const isUpdate = ref(true); | 50 | const isUpdate = ref(true); |
52 | const treeData = ref<TreeItem[]>([]); | 51 | const treeData = ref<TreeItem[]>([]); |
53 | const roleMenus = ref<string[]>([]); | 52 | const roleMenus = ref<string[]>([]); |
54 | const roleId = ref(''); | 53 | const roleId = ref(''); |
55 | const allCheckedKeys = ref<string[]>([]); | 54 | const allCheckedKeys = ref<string[]>([]); |
56 | - | 55 | + const treeRef = ref(); |
57 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ | 56 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ |
58 | labelWidth: 90, | 57 | labelWidth: 90, |
59 | schemas: formSchema, | 58 | schemas: formSchema, |
@@ -84,58 +83,30 @@ | @@ -84,58 +83,30 @@ | ||
84 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 83 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
85 | resetFields(); | 84 | resetFields(); |
86 | roleId.value = ''; | 85 | roleId.value = ''; |
87 | - setDrawerProps({ confirmLoading: false }); | 86 | + isUpdate.value = data.isUpdate; |
88 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 87 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
89 | - if (unref(treeData).length === 0) { | 88 | + if (!unref(treeData).length) { |
89 | + // 获取全部的菜单 | ||
90 | const menuListModel = await getMenuList(); | 90 | const menuListModel = await getMenuList(); |
91 | processChildren(menuListModel); | 91 | processChildren(menuListModel); |
92 | - let treeValues = new Array<TreeItem>(); | ||
93 | - menuListModel.map((item) => { | ||
94 | - const data = { | ||
95 | - menuName: t(item.meta.title), | ||
96 | - icon: item.meta.icon, | ||
97 | - key: item.id, | ||
98 | - children: item.children as any as TreeItem[], | ||
99 | - }; | ||
100 | - treeValues.push(data); | ||
101 | - }); | ||
102 | - treeData.value = treeValues; | 92 | + treeData.value = menuListModel; |
103 | } | 93 | } |
94 | + // 更新 | ||
104 | if (unref(isUpdate)) { | 95 | if (unref(isUpdate)) { |
105 | - if (data.record) { | ||
106 | - //通过角色id去获取角色对应的菜单的ids | ||
107 | - roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
108 | - treeData.value.map((m) => { | ||
109 | - roleMenus.value.map((m1) => { | ||
110 | - if (m.key === m1 && m.children.length !== 0) { | ||
111 | - proxy.useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
112 | - } | ||
113 | - }); | ||
114 | - }); | ||
115 | - proxy.$refs.tree.setCheckedKeys(roleMenus.value); | ||
116 | - roleId.value = data.record.id; | 96 | + //通过角色id去获取角色对应的菜单的ids |
97 | + roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
98 | + for (let m of treeData.value) { | ||
99 | + for (let m1 of roleMenus.value) { | ||
100 | + // 利用continue特性优化一下性能 | ||
101 | + if (!(m.key === m1 && m.children.length)) continue; | ||
102 | + useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
103 | + } | ||
117 | } | 104 | } |
118 | - setFieldsValue({ | ||
119 | - ...data.record, | ||
120 | - }); | 105 | + treeRef.value.setCheckedKeys(roleMenus.value); |
106 | + roleId.value = data.record.id; | ||
107 | + setFieldsValue(data.record); | ||
121 | } | 108 | } |
122 | }); | 109 | }); |
123 | - | ||
124 | - // Tree check事件 | ||
125 | - const handleCheckClick = (_, e) => { | ||
126 | - allCheckedKeys.value = []; | ||
127 | - let nodes = e.checkedNodes; | ||
128 | - let halfKeys = e.halfCheckedKeys; | ||
129 | - nodes.map((node) => { | ||
130 | - if (node.key != halfKeys[0] && halfKeys.length == []) { | ||
131 | - allCheckedKeys.value.push(node.key); | ||
132 | - } else { | ||
133 | - allCheckedKeys.value.push(node.key); | ||
134 | - } | ||
135 | - }); | ||
136 | - allCheckedKeys.value.push(...halfKeys); | ||
137 | - }; | ||
138 | - | ||
139 | const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')); | 110 | const getTitle = computed(() => (!unref(isUpdate) ? '新增角色' : '编辑角色')); |
140 | 111 | ||
141 | async function handleSubmit() { | 112 | async function handleSubmit() { |
@@ -159,15 +130,14 @@ | @@ -159,15 +130,14 @@ | ||
159 | } | 130 | } |
160 | 131 | ||
161 | return { | 132 | return { |
162 | - allCheckedKeys, | ||
163 | useChildrenIdsRemoveParentId, | 133 | useChildrenIdsRemoveParentId, |
164 | - handleCheckClick, | ||
165 | registerDrawer, | 134 | registerDrawer, |
166 | registerForm, | 135 | registerForm, |
167 | getTitle, | 136 | getTitle, |
168 | handleSubmit, | 137 | handleSubmit, |
169 | treeData, | 138 | treeData, |
170 | roleMenus, | 139 | roleMenus, |
140 | + treeRef, | ||
171 | }; | 141 | }; |
172 | }, | 142 | }, |
173 | }); | 143 | }); |