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 | ]; |