Commit 4cea34ffd1912809ee59d458e2aba14c62c242e3

Authored by sqy
1 parent 3a5599e0

feat:"转换脚本开发完成",fix:“菜单显示不正确修复”,feat:所属网关字段,图片样式调整

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