Commit 69a0700ef1f800d820814d21686d1e10559bde7f
Merge branch 'sqy_dev' into 'main'
feat:"转换脚本开发完成",fix:“菜单显示不正确修复”,feat:所属网关字段,图片样式调整 See merge request huang/yun-teng-iot-front!131
Showing
10 changed files
with
48 additions
and
77 deletions
@@ -289,10 +289,8 @@ | @@ -289,10 +289,8 @@ | ||
289 | } | 289 | } |
290 | const content = editor?.getContent() ?? ''; | 290 | const content = editor?.getContent() ?? ''; |
291 | const val = | 291 | const val = |
292 | - content?.replace( | ||
293 | - getUploadingImgName(name), | ||
294 | - `<img src="${url}" style="height:6rem;width:6rem"/>` | ||
295 | - ) ?? ''; | 292 | + content?.replace(getUploadingImgName(name), `<img src="${url}" style="width:8rem"/>`) ?? |
293 | + ''; | ||
296 | setValue(editor, val); | 294 | setValue(editor, val); |
297 | } | 295 | } |
298 | 296 |
@@ -64,14 +64,14 @@ export const step1Schemas: FormSchema[] = [ | @@ -64,14 +64,14 @@ export const step1Schemas: FormSchema[] = [ | ||
64 | 64 | ||
65 | onChange() { | 65 | onChange() { |
66 | setFieldsValue({ | 66 | setFieldsValue({ |
67 | - gateWayDeviceId: null, | 67 | + gateWayId: null, |
68 | }); | 68 | }); |
69 | }, | 69 | }, |
70 | }; | 70 | }; |
71 | }, | 71 | }, |
72 | }, | 72 | }, |
73 | { | 73 | { |
74 | - field: 'gateWayDeviceId', | 74 | + field: 'gateWayId', |
75 | label: '网关设备', | 75 | label: '网关设备', |
76 | required: true, | 76 | required: true, |
77 | component: 'ApiSelect', | 77 | component: 'ApiSelect', |
@@ -24,6 +24,11 @@ export const descSchema: DescItem[] = [ | @@ -24,6 +24,11 @@ export const descSchema: DescItem[] = [ | ||
24 | label: '设备配置', | 24 | label: '设备配置', |
25 | }, | 25 | }, |
26 | { | 26 | { |
27 | + field: 'gatewayName', | ||
28 | + label: '所属网关', | ||
29 | + show: (data) => !!data.gatewayName, | ||
30 | + }, | ||
31 | + { | ||
27 | field: 'deviceType', | 32 | field: 'deviceType', |
28 | label: '设备类型', | 33 | label: '设备类型', |
29 | render: (text) => { | 34 | render: (text) => { |
@@ -37,6 +42,7 @@ export const descSchema: DescItem[] = [ | @@ -37,6 +42,7 @@ export const descSchema: DescItem[] = [ | ||
37 | { | 42 | { |
38 | field: 'description', | 43 | field: 'description', |
39 | label: '描述', | 44 | label: '描述', |
45 | + span: 2, | ||
40 | }, | 46 | }, |
41 | ]; | 47 | ]; |
42 | 48 |
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | <div class="tabs-detail"> | 2 | <div class="tabs-detail"> |
3 | <div v-if="deviceDetail?.deviceInfo?.avatar"> | 3 | <div v-if="deviceDetail?.deviceInfo?.avatar"> |
4 | <p>设备图片</p> | 4 | <p>设备图片</p> |
5 | - <Image :src="deviceDetail.deviceInfo.avatar" :width="100" /> | 5 | + <Image :src="deviceDetail.deviceInfo.avatar" :width="200" /> |
6 | </div> | 6 | </div> |
7 | <div> | 7 | <div> |
8 | <div class="flex" style="align-items: center"> | 8 | <div class="flex" style="align-items: center"> |
@@ -210,7 +210,7 @@ | @@ -210,7 +210,7 @@ | ||
210 | async function handleEdit(record: Recordable) { | 210 | async function handleEdit(record: Recordable) { |
211 | if (record.deviceType === 'SENSOR') { | 211 | if (record.deviceType === 'SENSOR') { |
212 | const res = await getGATEWAY(record.tbDeviceId); | 212 | const res = await getGATEWAY(record.tbDeviceId); |
213 | - Reflect.set(record, 'gateWayDeviceId', res.id); | 213 | + Reflect.set(record, 'gateWayId', res.id); |
214 | } | 214 | } |
215 | openModal(true, { | 215 | openModal(true, { |
216 | isUpdate: true, | 216 | isUpdate: true, |
@@ -38,6 +38,7 @@ | @@ -38,6 +38,7 @@ | ||
38 | import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题 | 38 | import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题 |
39 | import 'ace-builds/src-noconflict/mode-javascript'; // 默认设置的语言模式 | 39 | import 'ace-builds/src-noconflict/mode-javascript'; // 默认设置的语言模式 |
40 | import { beautify } from 'ace-builds/src-noconflict/ext-beautify.js'; | 40 | import { beautify } from 'ace-builds/src-noconflict/ext-beautify.js'; |
41 | + | ||
41 | const emit = defineEmits(['register', 'isStatus', 'success']); | 42 | const emit = defineEmits(['register', 'isStatus', 'success']); |
42 | const isUpdate = ref(false); | 43 | const isUpdate = ref(false); |
43 | const aceEditor = ref(); | 44 | const aceEditor = ref(); |
@@ -66,9 +67,9 @@ | @@ -66,9 +67,9 @@ | ||
66 | mode: 'ace/mode/javascript', // 默认设置的语言模式 | 67 | mode: 'ace/mode/javascript', // 默认设置的语言模式 |
67 | tabSize: 2, // 制表符设置为 4 个空格大小 | 68 | tabSize: 2, // 制表符设置为 4 个空格大小 |
68 | }); | 69 | }); |
70 | + | ||
69 | aceEditor.value.setOptions({ | 71 | aceEditor.value.setOptions({ |
70 | enableBasicAutocompletion: true, | 72 | enableBasicAutocompletion: true, |
71 | - enableSnippets: true, | ||
72 | enableLiveAutocompletion: true, | 73 | enableLiveAutocompletion: true, |
73 | }); | 74 | }); |
74 | aceEditor.value.setValue(jsScript ?? 'return {msg: msg, metadata: metadata};'); | 75 | aceEditor.value.setValue(jsScript ?? 'return {msg: msg, metadata: metadata};'); |
@@ -98,8 +98,10 @@ | @@ -98,8 +98,10 @@ | ||
98 | import ace from 'ace-builds'; | 98 | import ace from 'ace-builds'; |
99 | import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题 | 99 | import 'ace-builds/src-noconflict/theme-chrome'; // 默认设置的主题 |
100 | import 'ace-builds/src-noconflict/mode-javascript'; // 默认设置的语言模式 | 100 | import 'ace-builds/src-noconflict/mode-javascript'; // 默认设置的语言模式 |
101 | - import { beautify } from 'ace-builds/src-noconflict/ext-beautify.js'; | ||
102 | - | 101 | + import 'ace-builds/src-noconflict/ext-language_tools.js'; //语言提示 |
102 | + import { beautify } from 'ace-builds/src-noconflict/ext-beautify.js'; //格式化 | ||
103 | + // !!!important 重要,配置ace编辑器的错误提示,基础路径。否则会加载不到相关web Worker,就没有syntax validation提示 | ||
104 | + ace.config.set('basePath', 'https://cdn.jsdelivr.net/npm/ace-builds@1.4.14/src-noconflict/'); | ||
103 | defineComponent({ | 105 | defineComponent({ |
104 | Tooltip, | 106 | Tooltip, |
105 | }); | 107 | }); |
@@ -141,11 +143,8 @@ | @@ -141,11 +143,8 @@ | ||
141 | theme: 'ace/theme/chrome', // 默认设置的主题 | 143 | theme: 'ace/theme/chrome', // 默认设置的主题 |
142 | mode: 'ace/mode/javascript', // 默认设置的语言模式 | 144 | mode: 'ace/mode/javascript', // 默认设置的语言模式 |
143 | tabSize: 2, // 制表符设置为 2 个空格大小 | 145 | tabSize: 2, // 制表符设置为 2 个空格大小 |
144 | - }); | ||
145 | - aceEditor.value.setOptions({ | ||
146 | - enableBasicAutocompletion: true, | ||
147 | - enableSnippets: true, | ||
148 | - enableLiveAutocompletion: true, | 146 | + enableBasicAutocompletion: true, //补全 |
147 | + enableLiveAutocompletion: true, // | ||
149 | }); | 148 | }); |
150 | } | 149 | } |
151 | const mataData: any = { | 150 | const mataData: any = { |
@@ -194,12 +193,12 @@ | @@ -194,12 +193,12 @@ | ||
194 | }; | 193 | }; |
195 | 194 | ||
196 | // 测试 | 195 | // 测试 |
197 | - const handleTestFunc = () => { | 196 | + const handleTestFunc = async () => { |
198 | // 收集3方数据 | 197 | // 收集3方数据 |
199 | - const msg = JsonEditor.value.get(); | ||
200 | - const metadata = mataData; | ||
201 | - const jsCode = aceEditor.value.getValue(); | ||
202 | try { | 198 | try { |
199 | + const msg = JsonEditor.value.get(); | ||
200 | + const metadata = mataData; | ||
201 | + const jsCode = aceEditor.value.getValue(); | ||
203 | // 执行动态Javascript脚本 | 202 | // 执行动态Javascript脚本 |
204 | let result = Function('msg', 'metadata', jsCode)(msg, metadata); | 203 | let result = Function('msg', 'metadata', jsCode)(msg, metadata); |
205 | // 设置输出值 | 204 | // 设置输出值 |
@@ -11,7 +11,7 @@ | @@ -11,7 +11,7 @@ | ||
11 | <template #menu="{ model, field }"> | 11 | <template #menu="{ model, field }"> |
12 | <BasicTree | 12 | <BasicTree |
13 | v-if="treeData.length > 0" | 13 | v-if="treeData.length > 0" |
14 | - ref="tree" | 14 | + ref="treeRef" |
15 | v-model:value="model[field]" | 15 | v-model:value="model[field]" |
16 | :treeData="treeData" | 16 | :treeData="treeData" |
17 | :replaceFields="{ title: 'menuName' }" | 17 | :replaceFields="{ title: 'menuName' }" |
@@ -19,7 +19,6 @@ | @@ -19,7 +19,6 @@ | ||
19 | checkable | 19 | checkable |
20 | toolbar | 20 | toolbar |
21 | title="菜单分配" | 21 | title="菜单分配" |
22 | - @check="handleCheckClick" | ||
23 | :defaultExpandAll="true" | 22 | :defaultExpandAll="true" |
24 | /> | 23 | /> |
25 | </template> | 24 | </template> |
@@ -27,7 +26,7 @@ | @@ -27,7 +26,7 @@ | ||
27 | </BasicDrawer> | 26 | </BasicDrawer> |
28 | </template> | 27 | </template> |
29 | <script lang="ts"> | 28 | <script lang="ts"> |
30 | - import { defineComponent, ref, computed, unref, getCurrentInstance } from 'vue'; | 29 | + import { defineComponent, ref, computed, unref } from 'vue'; |
31 | import { BasicForm, useForm } from '/@/components/Form/index'; | 30 | import { BasicForm, useForm } from '/@/components/Form/index'; |
32 | import { formSchema } from './role.data'; | 31 | import { formSchema } from './role.data'; |
33 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; | 32 | import { BasicDrawer, useDrawerInner } from '/@/components/Drawer'; |
@@ -47,20 +46,20 @@ | @@ -47,20 +46,20 @@ | ||
47 | components: { BasicDrawer, BasicForm, BasicTree }, | 46 | components: { BasicDrawer, BasicForm, BasicTree }, |
48 | emits: ['success', 'register'], | 47 | emits: ['success', 'register'], |
49 | setup(_, { emit }) { | 48 | setup(_, { emit }) { |
50 | - const { proxy } = getCurrentInstance(); | ||
51 | const isUpdate = ref<boolean>(true); | 49 | const isUpdate = ref<boolean>(true); |
52 | const treeData = ref<TreeItem[]>([]); | 50 | const treeData = ref<TreeItem[]>([]); |
53 | const roleMenus = ref<string[]>([]); | 51 | const roleMenus = ref<string[]>([]); |
54 | - const allCheckedKeys = ref<string[]>([]); | ||
55 | const roleId = ref<string>(''); | 52 | const roleId = ref<string>(''); |
53 | + const treeRef = ref(); | ||
56 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ | 54 | const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({ |
57 | - labelWidth: 90, | 55 | + labelWidth: 100, |
58 | schemas: formSchema, | 56 | schemas: formSchema, |
59 | showActionButtonGroup: false, | 57 | showActionButtonGroup: false, |
60 | }); | 58 | }); |
61 | 59 | ||
60 | + // 递归函数,将RouteItem里面的字段换名称 | ||
62 | function processChildren(items: RouteItem[]) { | 61 | function processChildren(items: RouteItem[]) { |
63 | - items.map((item) => { | 62 | + items.forEach((item) => { |
64 | item.menuName = t(item.meta.title); | 63 | item.menuName = t(item.meta.title); |
65 | item.icon = item.meta.icon; | 64 | item.icon = item.meta.icon; |
66 | item.key = item.id; | 65 | item.key = item.id; |
@@ -83,43 +82,31 @@ | @@ -83,43 +82,31 @@ | ||
83 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 82 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
84 | resetFields(); | 83 | resetFields(); |
85 | roleId.value = ''; | 84 | roleId.value = ''; |
86 | - setDrawerProps({ confirmLoading: false }); | ||
87 | isUpdate.value = data.isUpdate; | 85 | isUpdate.value = data.isUpdate; |
88 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 86 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
89 | - if (unref(treeData).length === 0) { | 87 | + if (!unref(treeData).length) { |
90 | // 获取全部的菜单 | 88 | // 获取全部的菜单 |
91 | const menuListModel = await getMenuList(); | 89 | const menuListModel = await getMenuList(); |
92 | processChildren(menuListModel); | 90 | processChildren(menuListModel); |
93 | - let treeValues: TreeItem[] = []; | ||
94 | - menuListModel.map((item) => { | ||
95 | - const data = { | ||
96 | - menuName: t(item.meta.title), | ||
97 | - icon: item.meta.icon, | ||
98 | - key: item.id, | ||
99 | - children: item.children as any as TreeItem[], | ||
100 | - }; | ||
101 | - treeValues.push(data); | ||
102 | - }); | ||
103 | - treeData.value = treeValues; | 91 | + treeData.value = menuListModel; |
92 | + // console.log(treeData.value); | ||
104 | } | 93 | } |
105 | 94 | ||
95 | + // 更新 | ||
106 | if (unref(isUpdate)) { | 96 | if (unref(isUpdate)) { |
107 | - if (data.record) { | ||
108 | - //通过角色id去获取角色对应的菜单的ids | ||
109 | - roleMenus.value = await getMenusIdsByRoleId(data.record.id); | ||
110 | - treeData.value.map((m) => { | ||
111 | - roleMenus.value.map((m1) => { | ||
112 | - if (m.key === m1 && m.children.length !== 0) { | ||
113 | - proxy.useChildrenIdsRemoveParentId(m1, roleMenus.value); | ||
114 | - } | ||
115 | - }); | 97 | + //通过角色id去获取角色对应的菜单的ids |
98 | + 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 | + } | ||
116 | }); | 105 | }); |
117 | - proxy.$refs.tree.setCheckedKeys(roleMenus.value); | ||
118 | - roleId.value = data.record.id; | ||
119 | - } | ||
120 | - setFieldsValue({ | ||
121 | - ...data.record, | ||
122 | }); | 106 | }); |
107 | + treeRef.value.setCheckedKeys(roleMenus.value); | ||
108 | + roleId.value = data.record.id; | ||
109 | + setFieldsValue(data.record); | ||
123 | } | 110 | } |
124 | }); | 111 | }); |
125 | 112 | ||
@@ -134,7 +121,7 @@ | @@ -134,7 +121,7 @@ | ||
134 | name: values.name, | 121 | name: values.name, |
135 | remark: values.remark, | 122 | remark: values.remark, |
136 | status: values.status, | 123 | status: values.status, |
137 | - menu: allCheckedKeys.value as string[], | 124 | + menu: treeRef.value.getCheckedKeys(), |
138 | }; | 125 | }; |
139 | saveOrUpdateRoleInfoWithMenu(req).then(() => { | 126 | saveOrUpdateRoleInfoWithMenu(req).then(() => { |
140 | closeDrawer(); | 127 | closeDrawer(); |
@@ -144,30 +131,15 @@ | @@ -144,30 +131,15 @@ | ||
144 | setDrawerProps({ confirmLoading: false }); | 131 | setDrawerProps({ confirmLoading: false }); |
145 | } | 132 | } |
146 | } | 133 | } |
147 | - // Tree check事件 | ||
148 | - const handleCheckClick = (_, e) => { | ||
149 | - allCheckedKeys.value = []; | ||
150 | - let nodes = e.checkedNodes; | ||
151 | - let halfKeys = e.halfCheckedKeys; | ||
152 | - nodes.map((node) => { | ||
153 | - if (node.key != halfKeys[0] && halfKeys.length == []) { | ||
154 | - allCheckedKeys.value.push(node.key); | ||
155 | - } else { | ||
156 | - allCheckedKeys.value.push(node.key); | ||
157 | - } | ||
158 | - }); | ||
159 | - allCheckedKeys.value.push(...halfKeys); | ||
160 | - }; | ||
161 | return { | 134 | return { |
162 | - allCheckedKeys, | ||
163 | registerDrawer, | 135 | registerDrawer, |
164 | registerForm, | 136 | registerForm, |
165 | getTitle, | 137 | getTitle, |
166 | handleSubmit, | 138 | handleSubmit, |
167 | treeData, | 139 | treeData, |
168 | roleMenus, | 140 | roleMenus, |
169 | - handleCheckClick, | ||
170 | useChildrenIdsRemoveParentId, | 141 | useChildrenIdsRemoveParentId, |
142 | + treeRef, | ||
171 | }; | 143 | }; |
172 | }, | 144 | }, |
173 | }); | 145 | }); |
@@ -34,10 +34,8 @@ | @@ -34,10 +34,8 @@ | ||
34 | </template> | 34 | </template> |
35 | <script lang="ts"> | 35 | <script lang="ts"> |
36 | import { defineComponent } from 'vue'; | 36 | import { defineComponent } from 'vue'; |
37 | - | ||
38 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; | 37 | import { BasicTable, useTable, TableAction } from '/@/components/Table'; |
39 | import { delRole, getRoleListByPage } from '/@/api/system/system'; | 38 | import { delRole, getRoleListByPage } from '/@/api/system/system'; |
40 | - | ||
41 | import { useDrawer } from '/@/components/Drawer'; | 39 | import { useDrawer } from '/@/components/Drawer'; |
42 | import RoleDrawer from './RoleDrawer.vue'; | 40 | import RoleDrawer from './RoleDrawer.vue'; |
43 | import { columns, searchFormSchema } from './role.data'; | 41 | import { columns, searchFormSchema } from './role.data'; |
@@ -177,12 +177,9 @@ export const formSchema: FormSchema[] = [ | @@ -177,12 +177,9 @@ export const formSchema: FormSchema[] = [ | ||
177 | }, | 177 | }, |
178 | }, | 178 | }, |
179 | { | 179 | { |
180 | - label: ' ', | 180 | + label: '', |
181 | field: 'menu', | 181 | field: 'menu', |
182 | slot: 'menu', | 182 | slot: 'menu', |
183 | component: 'Input', | 183 | component: 'Input', |
184 | - componentProps: { | ||
185 | - maxLength: 255, | ||
186 | - }, | ||
187 | }, | 184 | }, |
188 | ]; | 185 | ]; |