From 3ba33ca3c4d0ca55e50ca973860ccee7860ed9fa Mon Sep 17 00:00:00 2001
From: 杨磊 <505174330@qq.com>
Date: 星期二, 18 三月 2025 12:04:39 +0800
Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/modelLibrary

---
 src/views/system/roleManage.vue                    |  166 +++++
 src/assets/js/toolClass.js                         |  154 ----
 src/components/TreeMenu.vue                        |  304 ++++++++-
 src/assets/images/icon/fullScreen.png              |    0 
 src/assets/images/icon/halfScreen.png              |    0 
 src/layout/components/header.vue                   |   40 
 src/views/simulation/autonomousFunction/index.vue  |   14 
 src/layout/pageLayout.vue                          |   22 
 src/views/simulation/testSimulation/detail.vue     |  508 +++++++++++++++
 src/styles/global.less                             |  136 +++
 src/views/system/index.vue                         |   16 
 /dev/null                                          |   14 
 src/views/system/userManage.vue                    |  176 +++++
 src/assets/js/middleGround/tool.js                 |   15 
 src/views/simulation/realTimeSimulation/index.vue  |   14 
 src/views/simulation/testSimulation/index.vue      |  238 +++++++
 src/router/index.ts                                |   11 
 src/views/simulation/testSimulation/testReport.vue |  130 +++
 src/App.vue                                        |   19 
 19 files changed, 1,717 insertions(+), 260 deletions(-)

diff --git a/src/App.vue b/src/App.vue
index f344615..baf3306 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -1,17 +1,3 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import Header from "./layout/Header.vue";
-import TreeMenu from "./components/TreeMenu.vue";
-import { ElConfigProvider } from "element-plus";
-import zhCn from "element-plus/es/locale/lang/zh-cn";
-
-const menuItem = ref("/");
-
-const handMenu = (key: string) => {
-  menuItem.value = key;
-};
-</script>
-
 <template>
   <!-- <el-config-provider :locale="zhCn">
     <el-container class="common-layout">
@@ -29,3 +15,8 @@
     </el-container>
   </el-config-provider> -->
 </template>
+
+<script setup lang="ts">
+
+</script>
+<style></style>
diff --git a/src/assets/images/icon/fullScreen.png b/src/assets/images/icon/fullScreen.png
new file mode 100644
index 0000000..a0b9207
--- /dev/null
+++ b/src/assets/images/icon/fullScreen.png
Binary files differ
diff --git a/src/assets/images/icon/halfScreen.png b/src/assets/images/icon/halfScreen.png
new file mode 100644
index 0000000..f3a391e
--- /dev/null
+++ b/src/assets/images/icon/halfScreen.png
Binary files differ
diff --git a/src/assets/js/middleGround/tool.js b/src/assets/js/middleGround/tool.js
index 838b23b..c3d4075 100644
--- a/src/assets/js/middleGround/tool.js
+++ b/src/assets/js/middleGround/tool.js
@@ -411,17 +411,10 @@
   if (md5) {
     src = requestCtx + `/file/GetPreViewImage?md5=${md5}`
   } else {
-    if (storeInfo == 'jsek_bookFair') {
-      // return defaultBookFair;
-      return
-    } else if (storeInfo == 'jilin_imgResourceLibrary') {
-      return defaultPub
-    } else if (storeInfo == 'jilin_audiosResourceLibrary') {
-      return defaultAudio
-    } else if (storeInfo == 'jilin_videosResourceLibrary') {
-      return defaultPub
-    } else if (storeInfo == 'jilin_modelsResourceLibrary') {
-      return defaultPub
+    if(storeInfo == `defaultGoodsStore${appId}`){
+      return bookCover;
+    }else{
+      return ""
     }
   }
   if (width && src) src += `&width=${width}`
diff --git a/src/assets/js/toolClass.js b/src/assets/js/toolClass.js
index 2cac55a..85260d1 100644
--- a/src/assets/js/toolClass.js
+++ b/src/assets/js/toolClass.js
@@ -72,70 +72,6 @@
   }
 }
 
-// 澶勭悊璁㈠崟璁板綍
-// export function setOrderList(res) {
-//   // 鑾峰彇褰撳墠骞翠唤鐨勫紑濮嬫椂闂�
-//   let currentTimestamp = moment().startOf("year");
-//   let arr = [];
-//   for (let i = 0; i < res.length; i++) {
-//     const item = res[i];
-//     // 鍙戠エ鐘舵�佷负瀹℃牳涓垨鑰呭鏍稿け璐ワ紝灏唅tem閫変腑鐘舵�佽缃�変腑銆�
-//     // UI鎺у埗绂佺敤锛堟樉绀虹殑鏁堟灉涓� 閫変腑骞朵笖绂佺敤锛�
-//     if (item.invoiceInfo) {
-//       item.checked = true;
-//     } else {
-//       item.checked = false;
-//     }
-//     // 鍒ゆ柇鏄惁瓒呭嚭鐢宠鍙戠エ鐨勬棩鏈�
-//     item.exceedingTheSpecifiedTime = moment(item.createDate).isBefore(
-//       currentTimestamp
-//     );
-//     if (item.saleMethodLinks.length > 0) {
-//       let itemName = null;
-//       let itemIcon = null;
-//       let cmsItemList = null;
-//       try {
-//         cmsItemList = item.saleMethodLinks[0].orderSaleMethod.cmsItemList[0];
-//       } catch (error) {
-//         cmsItemList = null;
-//       }
-//       if (cmsItemList && cmsItemList.icon) {
-//         itemName = cmsItemList.name;
-//         itemIcon = cmsItemList.icon;
-//       } else {
-//         itemName = item.saleMethodLinks[0].orderSaleMethod.product.name;
-//         itemIcon = item.saleMethodLinks[0].orderSaleMethod.product.icon;
-//       }
-//       item.saleMethodLinks[0].title = itemName;
-//       item.saleMethodLinks[0].icon = getPublicImage(itemIcon);
-//     } else {
-//       const itemIcon = require("@/assets/images/bookCity/place_img.png");
-//       const saleMethodLink = [];
-//       const obj = {
-//         icon: itemIcon,
-//         orderSaleMethod: {
-//           price: item.payPrice,
-//         },
-//       };
-//       saleMethodLink.push(obj);
-//       item.saleMethodLinks = saleMethodLink;
-//     }
-//     if (item.state == "Success") {
-//       item.CustomState = "鏀粯鎴愬姛";
-//     }
-//     if (item.state == "Cancel") {
-//       item.CustomState = "鍙栨秷鏀粯";
-//     }
-//     if (item.state == "WaitPay") {
-//       item.CustomState = "绛夊緟鏀粯";
-//     }
-//     if (item.state == "WaitDeliver") {
-//       item.CustomState = "姝e湪鏀粯";
-//     }
-//     arr.push(item);
-//   }
-//   return arr;
-// }
 
 //澶勭悊琛ㄥ崟鎻愪氦鏁版嵁
 export function worksData(res) {
@@ -353,6 +289,7 @@
   })
 }
 
+<<<<<<< HEAD
 // 鑾峰彇鏂囦欢
 export function getPublicFile(md5, isToken) {
   const { tokenKey, requestCtx } = config
@@ -386,90 +323,9 @@
 //   }
 //   return minute + isM0 + sec;
 // }
+=======
+>>>>>>> e741b70fc22dc65e4a40595c50bb9057bed15667
 
-// export function parseHtml(content) {
-//   const tagReg =
-//     /<\/?div[^>]*>|<\/?span[^>]*>|<\/?table[^>]*>|<\/?th[^>]*>|<\/?thead>|<\/?tbody>|<\/?tr>|<\/?td[^>]*>|<br[^>]*>|<\/?p[^>]*>|<\/?sub>|<\/?sup>|<\/?font[^>]*>|<img[^>]*>|<\/?a[^>]*>|\n|\\n/gi;
-//   const escapeReg =
-//     /&(lt|gt|le|ge|nbsp|amp|quot|times|Alpha|Beta|Gamma|Delta|Epsilon|Zeta|Eta|Theta|Iota|Kappa|Lambda|MU|NU|Xi|Omicron|Pi|Rho|Sigma|Tau|Upsilon|Phi|Chi|Psi|Omega|alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigmaf|sigma|tau|upsilon|phi|chi|psi|omega|thetasym|upsih|piv|circ|tilde|ndash|permil|lsquo|rsquo|ldquo|rdquo|prime);/gi;
-//   const escapeElements = {
-//     lt: "<",
-//     gt: ">",
-//     le: "鈮�",
-//     ge: "鈮�",
-//     nbsp: " ",
-//     amp: "&",
-//     quot: '""',
-//     times: "脳",
-//     Alpha: "螒",
-//     Beta: "螔",
-//     Gamma: "螕",
-//     Delta: "螖",
-//     Epsilon: "螘",
-//     Zeta: "螙",
-//     Eta: "螚",
-//     Theta: "螛",
-//     Iota: "螜",
-//     Kappa: "螝",
-//     Lambda: "螞",
-//     Mu: "螠",
-//     Nu: "螡",
-//     Xi: "螢",
-//     Omicron: "螣",
-//     Pi: "螤",
-//     Rho: "巍",
-//     Sigma: "危",
-//     Tau: "韦",
-//     Upsilon: "违",
-//     Phi: "桅",
-//     Chi: "围",
-//     Psi: "唯",
-//     Omega: "惟",
-//     alpha: "伪",
-//     beta: "尾",
-//     gamma: "纬",
-//     delta: "未",
-//     epsilon: "蔚",
-//     zeta: "味",
-//     eta: "畏",
-//     theta: "胃",
-//     iota: "喂",
-//     kappa: "魏",
-//     lambda: "位",
-//     mu: "渭",
-//     nu: "谓",
-//     xi: "尉",
-//     omicron: "慰",
-//     pi: "蟺",
-//     rho: "蟻",
-//     sigmaf: "蟼",
-//     sigma: "蟽",
-//     tau: "蟿",
-//     upsilon: "蠀",
-//     phi: "蠁",
-//     chi: "蠂",
-//     psi: "蠄",
-//     omega: "蠅",
-//     thetasym: "蠎",
-//     upsih: "蠏",
-//     piv: "蠔",
-//     circ: "藛",
-//     tilde: "藴",
-//     ndash: "鈥�",
-//     permil: "鈥�",
-//     lsquo: "鈥�",
-//     rsquo: "鈥�",
-//     ldquo: "鈥�",
-//     rdquo: "鈥�",
-//     prime: "鈥�",
-//   };
-//   const contentWithoutTag = content.replace(tagReg, "");
-//   const contentWithOnlyOneSpace = contentWithoutTag.replace(/ {2,}/g, " ");
-//   return contentWithOnlyOneSpace.replace(
-//     escapeReg,
-//     (all, t) => escapeElements[t]
-//   );
-// }
 
 export default {
   ...tool,
@@ -478,7 +334,11 @@
   worksDataBytool,
   UpdateworksDataBytool,
   getPublicImage,
+<<<<<<< HEAD
   worksData,
   getPublicFile
   // parseHtml,
+=======
+  worksData
+>>>>>>> e741b70fc22dc65e4a40595c50bb9057bed15667
 }
diff --git a/src/components/TreeMenu.vue b/src/components/TreeMenu.vue
index 41ed582..86ea3bf 100644
--- a/src/components/TreeMenu.vue
+++ b/src/components/TreeMenu.vue
@@ -1,34 +1,92 @@
 <template>
-  <div class="tree-menu">
-    <div class="topMenu">
-      <span class="topMenu-title">妯″瀷搴�</span>
-      <div class="btnGroup">
-        <el-icon class="icon1"><FolderAdd /></el-icon>
-        <el-icon class="icon2"><Edit /></el-icon>
-        <el-icon class="icon3"><Delete /></el-icon>
+  <div class="tree-menu-box">
+    <div class="flex">
+      <div class="tree-menu">
+        <div class="topMenu">
+          <span class="topMenu-title">{{ menuName }}</span>
+          <div class="btnGroup" v-if="props.menuItem == 'model'">
+            <el-icon class="icon1" @click="addBtn"><FolderAdd /></el-icon>
+            <el-icon class="icon2" @click="editBtn"><Edit /></el-icon>
+            <el-icon class="icon3" @click="delBtn"><Delete /></el-icon>
+          </div>
+        </div>
+        <el-tree
+          ref="treeRef"
+          :data="filteredData"
+          :props="defaultProps"
+          :filter-node-method="filterNode"
+          default-expand-all
+          @node-click="handleNodeClick"
+        >
+          <template #default="{ node, data }">
+            <span class="custom-tree-node">
+              <el-icon v-if="data.icon"><component :is="data.icon" /></el-icon>
+              <span>{{ node.label }}</span>
+            </span>
+          </template>
+        </el-tree>
+      </div>
+      <div class="tree-menu" v-if="props.menuItem == 'systemManage'">
+        <div class="topMenu">
+          <span class="topMenu-title">{{ systemMenuName }}</span>
+          <div class="btnGroup">
+            <el-icon class="icon1" @click="addBtn"><FolderAdd /></el-icon>
+            <el-icon class="icon2" @click="editBtn"><Edit /></el-icon>
+            <el-icon class="icon3" @click="delBtn"><Delete /></el-icon>
+          </div>
+        </div>
+        <el-tree
+          ref="treeRef"
+          :data="systemData"
+          :props="defaultProps"
+          :filter-node-method="filterNode1"
+          default-expand-all
+          @node-click="systemClick"
+        >
+          <template #default="{ node, data }">
+            <span class="custom-tree-node">
+              <el-icon v-if="data.icon"><component :is="data.icon" /></el-icon>
+              <span>{{ node.label }}</span>
+            </span>
+          </template>
+        </el-tree>
       </div>
     </div>
-    <el-tree
-      ref="treeRef"
-      :data="filteredData"
-      :props="defaultProps"
-      :filter-node-method="filterNode"
-      default-expand-all
-      @node-click="handleNodeClick"
-    >
-      <template #default="{ node, data }">
-        <span class="custom-tree-node">
-          <el-icon v-if="data.icon"><component :is="data.icon" /></el-icon>
-          <span>{{ node.label }}</span>
-        </span>
-      </template>
-    </el-tree>
   </div>
+  <el-dialog
+    v-model="dialogFormVisible"
+    :title="dialogTitle"
+    width="500"
+    @close="closeDialog(formRef)"
+  >
+    <el-form :model="form" ref="formRef" :rules="formRules" label-width="140px">
+      <el-form-item label="鍚嶇О" prop="name">
+        <el-input v-model="form.name" autocomplete="off" placeholder="璇疯緭鍏�" style="width: 240px"/>
+      </el-form-item>
+      <el-form-item label="鎻忚堪">
+        <el-input
+          v-model="form.description"
+          style="width: 240px"
+          :rows="2"
+          type="textarea"
+          placeholder="璇疯緭鍏�"
+        />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="closeDialog(formRef)">鍙栨秷</el-button>
+        <el-button type="primary" @click="submitBtn(formRef)"> 纭畾 </el-button>
+      </div>
+    </template>
+  </el-dialog>
 </template>
 
 <script setup lang="ts">
-import { ref, watch, defineProps } from "vue";
+import { ref, reactive, defineProps, onMounted } from "vue";
 import { useRouter } from "vue-router";
+import type { FormInstance, FormRules} from "element-plus";
+import { ElMessage, ElMessageBox } from 'element-plus'
 import { Document, FolderOpened } from "@element-plus/icons-vue";
 
 const router = useRouter();
@@ -36,13 +94,21 @@
 const props = defineProps<{
   menuItem: string;
 }>();
-
+const menuName = ref("妯″瀷搴�");
+const filteredData = ref();
+const systemMenuName = ref("");
+const systemData = ref();
+const selectData = ref()
 interface TreeNode {
   label: string;
   path?: string;
   icon?: string;
   children?: TreeNode[];
 }
+const defaultProps = {
+  children: "children",
+  label: "label",
+};
 
 const modelTreeData = ref<TreeNode[]>([
   {
@@ -68,41 +134,199 @@
   },
 ]);
 
-const defaultProps = {
-  children: "children",
-  label: "label",
-};
+const visualSimulationTreeData = ref<TreeNode[]>([
+  {
+    label: "娴嬭瘯浠跨湡",
+    path: "/testSimulation",
+    icon: "Document",
+  },
+  {
+    label: "瀹炴椂浠跨湡",
+    path: "realTimeSimulation",
+    icon: "Document",
+  },
+  {
+    label: "鑷富鍔熻兘",
+    path: "/autonomousFunction",
+    icon: "Document",
+  },
+]);
 
-const filteredData = ref(modelTreeData.value);
+const systemManageTreeData = ref<TreeNode[]>([
+  {
+    label: "鏈烘瀯鐢ㄦ埛",
+    path: "/userManage",
+    icon: "Document",
+  },
+  {
+    label: "瑙掕壊鏉冮檺绠$悊",
+    path: "/roleManage",
+    icon: "Document",
+  },
+]);
+
+const systemTreeData = ref<TreeNode[]>([
+  {
+    label: "501",
+    path: "",
+    icon: "Document",
+    children: [
+      {
+        label: "涓�瀹�",
+        path: "",
+        icon: "",
+      },
+      {
+        label: "浜屽",
+        path: "",
+        icon: "",
+      },
+      {
+        label: "涓夊",
+        path: "",
+        icon: "",
+      },
+    ],
+  },
+]);
+const systemTreeData1 = ref<TreeNode[]>([
+  {
+    label: "绯荤粺绠$悊鍛�",
+    path: "",
+    icon: "",
+  },
+  {
+    label: "妯″瀷绠$悊鍛�",
+    path: "",
+    icon: "",
+  },
+  {
+    label: "娴嬭瘯浜哄憳",
+    path: "",
+    icon: "",
+  },
+  {
+    label: "鎶ュ憡鏌ョ湅浜哄憳",
+    path: "",
+    icon: "",
+  },
+]);
+
+const dialogFormVisible = ref(false);
+const dialogTitle = ref()
+const formRef = ref<FormInstance>();
+const form = reactive({
+  name: "",
+  description: "",
+});
+
+interface formInfo {
+  name: string;
+}
+const formRules = reactive<FormRules<formInfo>>({
+  name: [{ required: true, message: "鍚嶇О涓嶈兘涓虹┖", trigger: "blur" }],
+});
+
+onMounted(() => {
+  console.log(props.menuItem, "123");
+  if (props.menuItem == "model") {
+    filteredData.value = modelTreeData.value;
+    menuName.value = "妯″瀷搴�";
+  } else if (props.menuItem == "simulation") {
+    menuName.value = "鍙鍖栦豢鐪�";
+    filteredData.value = visualSimulationTreeData.value;
+  } else if (props.menuItem == "systemManage") {
+    menuName.value = "绯荤粺绠$悊";
+    filteredData.value = systemManageTreeData.value;
+  } else {
+    filteredData.value = [];
+  }
+  systemMenuName.value = systemManageTreeData.value[0].label;
+});
 
 const filterNode = (value: string, data: TreeNode) => {
   if (!value) return true;
   return data.label.toLowerCase().includes(value.toLowerCase());
 };
 
+const filterNode1 = (value: string, data: TreeNode) => {
+  if (!value) return true;
+  return data.label.toLowerCase().includes(value.toLowerCase());
+};
+
 const handleNodeClick = (data: TreeNode) => {
+  console.log(data, 12);
+  selectData.value = data
   if (data.path) {
+    systemMenuName.value = data.label;
+    if (data.path == "/userManage") {
+      systemData.value = systemTreeData.value;
+    } else if (data.path == "/roleManage") {
+      systemData.value = systemTreeData1.value;
+    }
     router.push(data.path);
   }
 };
 
-watch(
-  () => props.menuItem,
-  (value) => {
-    if (value == "/" || value == "/model") {
-      filteredData.value = modelTreeData.value;
-    } else {
-      filteredData.value = []
+//娣诲姞鐩綍
+const addBtn = () => {
+  dialogTitle.value = '娣诲姞'
+  dialogFormVisible.value = true;
+};
+const submitBtn = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
     }
-  }
-);
+  });
+};
+const closeDialog = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+  dialogFormVisible.value = false;
+};
+
+const editBtn =() =>{
+  dialogTitle.value = '缂栬緫'
+  form.name = selectData.value.label
+  dialogFormVisible.value = true;
+
+}
+
+const delBtn =()=>{
+  ElMessageBox.confirm(
+    '纭畾瑕佸垹闄ら�変腑鐨勬暟鎹�?',
+    'Warning',
+    {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      console.log()
+     
+    })
+    .catch(() => {
+      
+    })
+}
+
+const systemClick = (data: TreeNode) => {};
 </script>
 
 <style lang="less" scoped>
-.tree-menu {
+.tree-menu-box {
   height: 100%;
   background-color: #fff;
-
+  .flex {
+    height: 100%;
+  }
+}
+.tree-menu {
+  width: 260px;
+  height: 100%;
+  border-right: 1px solid #e9eef3;
   :deep(.el-tree) {
     padding: 10px;
   }
diff --git a/src/layout/Header.vue b/src/layout/components/header.vue
similarity index 67%
rename from src/layout/Header.vue
rename to src/layout/components/header.vue
index f796541..6bd80f4 100644
--- a/src/layout/Header.vue
+++ b/src/layout/components/header.vue
@@ -8,12 +8,18 @@
       mode="horizontal"
       :default-active="activeIndex"
       class="header-menu"
-      @select="handleSelect"
       router
     >
-      <el-menu-item index="/">妯″瀷绠$悊</el-menu-item>
-      <el-menu-item index="/simulation-config">鍙鍖栦豢鐪�</el-menu-item>
-      <el-menu-item index="/system/user">绯荤粺绠$悊</el-menu-item>
+      <!-- <el-menu-item index="/">妯″瀷绠$悊</el-menu-item>
+      <el-menu-item index="/simulation">鍙鍖栦豢鐪�</el-menu-item>
+      <el-menu-item index="/systemManage">绯荤粺绠$悊</el-menu-item> -->
+      <el-menu-item
+        v-for="(item,index) in navList"
+        :key="item.path"
+        :index="item.path"
+        @click="handleSelect(item.path, index)"
+        >{{ item.name }}</el-menu-item
+      >
     </el-menu>
     <div class="header-right">
       <div class="user-info" @click="handleUserClick">
@@ -26,15 +32,29 @@
 
 <script setup lang="ts">
 import { ref, defineEmits } from "vue";
-import { useRouter } from "vue-router";
+import { useRoute, useRouter } from "vue-router";
+const router = useRouter();
+const route = useRoute();
 
 const activeIndex = ref("/");
-const emit = defineEmits(["selectMenu"]);
-const router = useRouter();
+const navList = ref([
+  {
+    name: "妯″瀷绠$悊",
+    path: "/model",
+  },
+  {
+    name: "鍙鍖栦豢鐪�",
+    path: "/simulation",
+  },
+  {
+    name: "绯荤粺绠$悊",
+    path: "/systemManage",
+  },
+]);
 
-const handleSelect = (key: string) => {
-  activeIndex.value = key;
-  emit("selectMenu", key);
+const handleSelect = (path: string) => {
+  activeIndex.value = path;
+  router.push(path);
 };
 
 const handleUserClick = () => {
diff --git a/src/layout/pageLayout.vue b/src/layout/pageLayout.vue
new file mode 100644
index 0000000..12ef503
--- /dev/null
+++ b/src/layout/pageLayout.vue
@@ -0,0 +1,22 @@
+<template>
+  <div class="common-layout">
+    <el-config-provider :locale="zhCn">
+      <el-container>
+        <el-header>
+            <Header class="header"></Header>
+        </el-header>
+        <el-main>
+          <RouterView />
+        </el-main>
+      </el-container>
+    </el-config-provider>
+  </div>
+</template>
+<script setup lang="ts">
+import { ref, watch, provide, onMounted } from "vue";
+import { RouterView, useRouter } from "vue-router";
+import zhCn from "element-plus/es/locale/lang/zh-cn";
+import Header from "./components/header.vue";
+const router = useRouter();
+</script>
+<style lang="less" scoped></style>
diff --git a/src/router/index.ts b/src/router/index.ts
index 6356de5..799bf00 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -23,6 +23,7 @@
           name: "roverModel",
           component: () => import("../views/model/children/roverModel.vue"),
         },
+       
         {
           path: "/model/leapMachineModel",
           name: "leapMachineModel",
@@ -44,11 +45,11 @@
           name: "simulationTest",
           component: () => import("../views/simulation/component/test.vue"),
         },
-        {
-          path: "/system/user",
-          name: "systemUser",
-          component: () => import("../views/system/User.vue"),
-        },
+        // {
+        //   path: "/system/user",
+        //   name: "systemUser",
+        //   component: () => import("../views/system/User.vue"),
+        // },
       ],
     },
 
diff --git a/src/styles/global.less b/src/styles/global.less
index f1a2f55..d798770 100644
--- a/src/styles/global.less
+++ b/src/styles/global.less
@@ -11,6 +11,44 @@
   margin: 0;
   padding: 0;
   height: 100%;
+  width: 100%;
+}
+div,
+span,
+iframe,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+p,
+a,
+img,
+strong,
+sub,
+sup,
+ol,
+ul,
+li,
+form,
+label,
+table,
+tbody,
+tfoot,
+thead,
+tr,
+th,
+td,
+canvas,
+audio,
+video {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-size: 100%;
+  font: inherit;
+  /* vertical-align: baseline; */
 }
 
 // 娣峰叆
@@ -48,18 +86,10 @@
   color: #535bf2;
 }
 
-html,
-body {
-  margin: 0;
-  display: flex;
-  place-items: center;
-  width: 100%;
-  height: 100%;
-}
-
 h1 {
   font-size: 3.2em;
   line-height: 1.1;
+  margin:0;
 }
 
 button {
@@ -91,12 +121,11 @@
   width: 100%;
   height: 100%;
   margin: 0 auto;
-  text-align: center;
+  // text-align: center;
 }
 
 
 /* 寮曞叆 Element Plus 鐨勫熀纭�鏍峰紡 */
-
 
 .common-layout {
   width: 100%;
@@ -104,7 +133,7 @@
 }
 
 .common-layout .el-container {
-  height: calc(100% - 60px);
+  height: 100%;
 }
 
 .el-header {
@@ -114,17 +143,40 @@
   border-bottom: 1px solid #ebeef5;
 }
 
-.el-aside {
-  background-color: #D3DCE6;
-  color: #333;
-}
-
 .el-main {
   background-color: #E9EEF3;
   color: #333;
-  padding: 10px !important;
+  padding: 0 !important;
+  box-sizing: border-box;
+  flex: auto;
+
+}
+.pageContainer{
+  display: flex;
+  width: 100%;
+  height: 100%;
+  // background-color: #fff;
+  padding-top: 10px;
   box-sizing: border-box;
 }
+.menuBox{
+  box-sizing: border-box;
+  
+}
+.contentBox{
+  flex:1 1;
+  box-sizing: border-box;
+  overflow: hidden;
+  padding:10px;
+  background-color: #fff;
+}
+
+.el-table__header{
+  thead .el-table__cell{
+    background:#f1f1f1;
+  }
+}
+
 
 .mb-4 {
   margin-bottom: 16px;
@@ -148,4 +200,50 @@
   button {
     background-color: #f9f9f9;
   }
-}
\ No newline at end of file
+}
+
+//鑷畾涔�
+ul {
+  list-style: none;
+  margin:0
+}
+
+.flex{
+  display: flex;
+}
+/* 鍨傜洿灞呬腑 */
+.ai-c {
+  align-items: center;
+}
+
+/* 涓よ竟瀵归綈 */
+.jc-sb {
+  justify-content: space-between;
+}
+.hover{
+  cursor: pointer;
+
+}
+
+::-webkit-scrollbar {
+  width: 10px;
+  height: 10px;
+}
+
+::-webkit-scrollbar-track-piece {
+  background-color: rgba(0, 0, 0, 0.2);
+  -webkit-border-radius: 6px;
+}
+
+::-webkit-scrollbar-thumb:vertical {
+  height: 5px;
+  background-color: rgba(125, 125, 125, 0.7);
+  -webkit-border-radius: 6px;
+}
+
+::-webkit-scrollbar-thumb:horizontal {
+  width: 5px;
+  background-color: rgba(125, 125, 125, 0.7);
+  -webkit-border-radius: 6px;
+}
+
diff --git a/src/views/simulation/autonomousFunction/index.vue b/src/views/simulation/autonomousFunction/index.vue
new file mode 100644
index 0000000..8c39c17
--- /dev/null
+++ b/src/views/simulation/autonomousFunction/index.vue
@@ -0,0 +1,14 @@
+<template>
+    <div class="simulation-config">
+      <h2>鑷富绠$悊</h2>
+    </div>
+  </template>
+  
+  <script setup lang="ts">
+  </script>
+  
+  <style lang="less" scoped>
+  .simulation-config {
+    padding: 20px;
+  }
+  </style> 
\ No newline at end of file
diff --git a/src/views/simulation/component/Config.vue b/src/views/simulation/component/Config.vue
deleted file mode 100644
index 724c456..0000000
--- a/src/views/simulation/component/Config.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-<template>
-  <div class="simulation-config">
-    <h2>浠跨湡閰嶇疆</h2>
-  </div>
-</template>
-
-<script setup lang="ts">
-</script>
-
-<style lang="less" scoped>
-.simulation-config {
-  padding: 20px;
-}
-</style> 
\ No newline at end of file
diff --git a/src/views/simulation/component/Result.vue b/src/views/simulation/component/Result.vue
deleted file mode 100644
index 2391a7a..0000000
--- a/src/views/simulation/component/Result.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-<template>
-  <div class="simulation-result">
-    <h2>浠跨湡缁撴灉</h2>
-  </div>
-</template>
-
-<script setup lang="ts">
-</script>
-
-<style lang="less" scoped>
-.simulation-result {
-  padding: 20px;
-}
-</style> 
\ No newline at end of file
diff --git a/src/views/simulation/component/Test.vue b/src/views/simulation/component/Test.vue
deleted file mode 100644
index da6de3f..0000000
--- a/src/views/simulation/component/Test.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-<template>
-  <div class="permission-manage">
-    <h2>浠跨湡娴嬭瘯</h2>
-  </div>
-</template>
-
-<script setup lang="ts">
-</script>
-
-<style lang="less" scoped>
-.permission-manage {
-  padding: 20px;
-}
-</style> 
\ No newline at end of file
diff --git a/src/views/simulation/realTimeSimulation/index.vue b/src/views/simulation/realTimeSimulation/index.vue
new file mode 100644
index 0000000..44d0995
--- /dev/null
+++ b/src/views/simulation/realTimeSimulation/index.vue
@@ -0,0 +1,14 @@
+<template>
+    <div class="simulation-config">
+      <h2>瀹炴椂浠跨湡</h2>
+    </div>
+</template>
+  
+  <script setup lang="ts">
+  </script>
+  
+  <style lang="less" scoped>
+  .simulation-config {
+    padding: 20px;
+  }
+  </style> 
\ No newline at end of file
diff --git a/src/views/simulation/testSimulation/detail.vue b/src/views/simulation/testSimulation/detail.vue
new file mode 100644
index 0000000..a2f7589
--- /dev/null
+++ b/src/views/simulation/testSimulation/detail.vue
@@ -0,0 +1,508 @@
+<template>
+  <div class="simulation-result">
+    <div style="width: 100%; height: 100%; background: #fff" id="myDiv">
+      <div class="titleBox">
+        <div class="name">
+          <span>{{ name }}浠跨湡</span>
+          <img
+            src="@/assets/images/icon/fullScreen.png"
+            @click="enlargeDiv('true')"
+            v-if="enlarge"
+          />
+          <img
+            src="@/assets/images/icon/halfScreen.png"
+            @click="enlargeDiv('false')"
+            v-else
+          />
+        </div>
+        <div class="back hover" @click="goBack">
+          <el-icon ><ArrowLeftBold /></el-icon>杩斿洖
+        </div>
+      </div>
+      <div class="flex bodyBox">
+        <div class="modelBox"></div>
+        <div class="shadowBox">
+          <div id="shadowX">
+            <div class="title">
+              <span>X杞存姇褰�</span>
+              <img
+                src="@/assets/images/icon/fullScreen.png"
+                @click="enlargeXDiv('true')"
+                v-if="enlargeX"
+              />
+              <img
+                src="@/assets/images/icon/halfScreen.png"
+                @click="enlargeXDiv('false')"
+                v-else
+              />
+            </div>
+            <div class="shadowX-body"></div>
+          </div>
+          <div id="shadowY">
+            <div class="title">
+              <span>Y杞存姇褰�</span>
+              <img
+                src="@/assets/images/icon/fullScreen.png"
+                @click="enlargeYDiv('true')"
+                v-if="enlargeY"
+              />
+              <img
+                src="@/assets/images/icon/halfScreen.png"
+                @click="enlargeYDiv('false')"
+                v-else
+              />
+            </div>
+            <div class="shadowY-body"></div>
+          </div>
+          <div id="shadowZ">
+            <div class="title">
+              <span>Z杞存姇褰�</span>
+              <img
+                src="@/assets/images/icon/fullScreen.png"
+                @click="enlargeZDiv('true')"
+                v-if="enlargeZ"
+              />
+              <img
+                src="@/assets/images/icon/halfScreen.png"
+                @click="enlargeZDiv('false')"
+                v-else
+              />
+            </div>
+            <div class="shadowZ-body"></div>
+          </div>
+        </div>
+      </div>
+      <div class="flex operateBox" id="operateBox">
+        <div id="instruct">
+          <div class="title jc-sb">
+            <div class="title">
+              <span>鎸囦护</span>
+              <img
+                src="@/assets/images/icon/fullScreen.png"
+                @click="enlargeInstructDiv('true')"
+                v-if="enlargeI"
+              />
+              <img
+                src="@/assets/images/icon/halfScreen.png"
+                @click="enlargeInstructDiv('false')"
+                v-else
+              />
+            </div>
+            <div class="upBold">
+              <el-icon @click="operateBoxDiv('true')" v-if="operate"
+                ><ArrowUpBold
+              /></el-icon>
+              <el-icon @click="operateBoxDiv('false')" v-else
+                ><ArrowDownBold
+              /></el-icon>
+            </div>
+          </div>
+          <div class="instruct-body">
+            <div class="instruct-list">
+              <div v-for="(item, index) in instructList" :key="index">
+                >{{ item }}
+              </div>
+            </div>
+            <div class="inputBox">
+              <el-input
+                v-model="instructContent"
+                placeholder="璇疯緭鍏ユ寚浠�"
+                @keyup.enter="setInstruct"
+              />
+            </div>
+          </div>
+        </div>
+        <div id="resize"></div>
+        <div id="log">
+          <div class="title jc-sb">
+            <div class="title">
+              <span>鏃ュ織</span>
+              <img
+                src="@/assets/images/icon/fullScreen.png"
+                @click="enlargeLogDiv('true')"
+                v-if="enlargeL"
+              />
+              <img
+                src="@/assets/images/icon/halfScreen.png"
+                @click="enlargeLogDiv('false')"
+                v-else
+              />
+            </div>
+            <div class="upBold">
+              <el-icon @click="operateBoxDiv('true')" v-if="operate"
+                ><ArrowUpBold
+              /></el-icon>
+              <el-icon @click="operateBoxDiv('false')" v-else
+                ><ArrowDownBold
+              /></el-icon>
+            </div>
+          </div>
+          <div class="log-body">
+            <div class="log-list">
+              <div v-for="(item, index) in instructList" :key="index">
+                >{{ item }}
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <el-dialog v-model="reportDialogForm" title="鐢熸垚娴嬭瘯鎶ュ憡" width="500">
+    <el-form :model="reportInfo">
+      <el-form-item label="鎶ュ憡鍚嶇О" label-width="100px">
+        <el-input v-model="reportInfo.reportName" autocomplete="off" />
+      </el-form-item>
+      <el-form-item label="娴嬭瘯鏃堕棿" label-width="100px">
+        <el-input v-model="reportInfo.testTime" autocomplete="off" disabled/>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <div class="dialog-footer">
+        <el-button @click="reportDialogForm = false">鍚�</el-button>
+        <el-button type="primary" @click="reportDialogForm = false">
+         鏄�
+        </el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive,onMounted } from "vue";
+const name = ref("椋炶穬鍣ㄦ暣妯″瀷");
+const reportDialogForm = ref(false)
+const reportInfo = reactive({
+  reportName:'',
+  testTime: '',
+})
+const enlarge = ref(true);
+const enlargeX = ref(true);
+const enlargeY = ref(true);
+const enlargeZ = ref(true);
+const enlargeI = ref(true);
+const enlargeL = ref(true);
+const instructContent = ref("");
+const operate = ref(true);
+const instructList = ref([]);
+const logList = ref([]);
+
+const goBack =()=>{
+  var time = new Date(Date.now());
+		var year = time.getFullYear();
+		var month = time.getMonth()+1;
+		var day = time.getDate();
+		var hour = time.getHours();
+		var minute = time.getMinutes();
+		var second = time.getSeconds();
+		reportInfo.testTime = year+'-'+(month<10?'0'+month:month)+'-'+(day<10?'0'+day:day)+' '+(hour<10?'0'+hour:hour)+':'+(minute<10?'0'+minute:minute)+':'+(second<10?'0'+second:second)
+    reportDialogForm.value = true
+
+}
+
+
+const enlargeDiv = (state) => {
+  let divStyle = document.getElementById("myDiv");
+  if (state == "true") {
+    enlarge.value = false;
+    let screenWidth = window.innerWidth; // 鑾峰彇灞忓箷瀹藉害
+    let screenHeight = window.innerHeight; // 鑾峰彇灞忓箷楂樺害
+    divStyle.style.width = screenWidth + "px"; // 璁剧疆瀹藉害涓哄睆骞曞搴�
+    divStyle.style.height = screenHeight + "px"; // 璁剧疆楂樺害涓哄睆骞曢珮搴�
+    divStyle.style.left = "0"; // 璁剧疆宸﹁竟璺濅负0锛屼娇鍏朵粠灞忓箷宸︿晶寮�濮�
+    divStyle.style.top = "0"; // 璁剧疆椤堕儴杈硅窛涓�0锛屼娇鍏朵粠灞忓箷椤堕儴寮�濮�
+    divStyle.style.position = "fixed"; // 浣跨敤fixed瀹氫綅锛岀‘淇濊鐩栨暣涓睆骞�
+  } else {
+    enlarge.value = true;
+    divStyle.style.width = "100%"; // 杩樺師瀹藉害
+    divStyle.style.height = "100%"; // 杩樺師楂樺害
+    divStyle.style.left = ""; // 娓呴櫎宸﹁竟璺�
+    divStyle.style.top = ""; // 娓呴櫎椤堕儴杈硅窛
+    divStyle.style.position = ""; // 娓呴櫎瀹氫綅灞炴��
+  }
+};
+const enlargeXDiv = (state) => {
+  let divStyle = document.getElementById("shadowX");
+  if (state == "true") {
+    enlargeX.value = false;
+    let screenWidth = window.innerWidth;
+    let screenHeight = window.innerHeight;
+    divStyle.style.width = screenWidth + "px";
+    divStyle.style.height = screenHeight + "px";
+    divStyle.style.left = "0";
+    divStyle.style.top = "0";
+    divStyle.style.position = "fixed";
+  } else {
+    enlargeX.value = true;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "calc((100% - 6px) / 3)";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+const enlargeYDiv = (state) => {
+  let divStyle = document.getElementById("shadowY");
+  if (state == "true") {
+    enlargeY.value = false;
+    let screenWidth = window.innerWidth;
+    let screenHeight = window.innerHeight;
+    divStyle.style.width = screenWidth + "px";
+    divStyle.style.height = screenHeight + "px";
+    divStyle.style.left = "0";
+    divStyle.style.top = "0";
+    divStyle.style.position = "fixed";
+  } else {
+    enlargeY.value = true;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "calc((100% - 6px) / 3)";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+const enlargeZDiv = (state) => {
+  let divStyle = document.getElementById("shadowZ");
+  if (state == "true") {
+    enlargeZ.value = false;
+    let screenWidth = window.innerWidth;
+    let screenHeight = window.innerHeight;
+    divStyle.style.width = screenWidth + "px";
+    divStyle.style.height = screenHeight + "px";
+    divStyle.style.left = "0";
+    divStyle.style.top = "0";
+    divStyle.style.position = "fixed";
+  } else {
+    enlargeZ.value = true;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "calc((100% - 6px) / 3)";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+const enlargeInstructDiv = (state) => {
+  let divStyle = document.getElementById("instruct");
+  if (state == "true") {
+    enlargeI.value = false;
+    let screenWidth = window.innerWidth;
+    let screenHeight = window.innerHeight;
+    divStyle.style.width = screenWidth + "px";
+    divStyle.style.height = screenHeight + "px";
+    divStyle.style.left = "0";
+    divStyle.style.top = "0";
+    divStyle.style.position = "fixed";
+  } else {
+    enlargeI.value = true;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "100%";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+const enlargeLogDiv = (state) => {
+  let divStyle = document.getElementById("log");
+  if (state == "true") {
+    enlargeL.value = false;
+    let screenWidth = window.innerWidth;
+    let screenHeight = window.innerHeight;
+    divStyle.style.width = screenWidth + "px";
+    divStyle.style.height = screenHeight + "px";
+    divStyle.style.left = "0";
+    divStyle.style.top = "0";
+    divStyle.style.position = "fixed";
+  } else {
+    enlargeL.value = true;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "100%";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+
+const operateBoxDiv = (state) => {
+  let divStyle = document.getElementById("operateBox");
+  if (state == "true") {
+    operate.value = false;
+    divStyle.style.width = "100%";
+    divStyle.style.height = "calc(100% - 36px)";
+    divStyle.style.left = "0";
+    divStyle.style.top = "36px";
+    divStyle.style.position = "absolute";
+  } else {
+    operate.value = true;
+    divStyle.style.height = "calc(100% - 36px - 70%)";
+    divStyle.style.left = "";
+    divStyle.style.top = "";
+    divStyle.style.position = "";
+  }
+};
+
+const setInstruct = () => {
+  console.log(instructContent.value);
+  instructList.value.push(instructContent.value);
+  logList.value.push(instructContent.value);
+  instructContent.value = "";
+};
+
+
+onMounted(() => {
+  handleResize();
+});
+//鎸囦护鏃ュ織妗嗗搴︽嫋鎷�
+const handleResize = () => {
+  let operateDom = document.getElementById("operateBox");
+  let instructDom = document.getElementById("instruct");
+  let logDom = document.getElementById("log");
+  let resizeDom = document.getElementById("resize");
+
+  for (let i = 0; i < resizeDom.length; i++) {
+        // 榧犳爣鎸変笅浜嬩欢
+        console.log(1)
+        resizeDom[i].onmousedown = function (e) {
+            //棰滆壊鏀瑰彉鎻愰啋
+            resizeDom[i].style.background = '#f0f2f5'
+            var startX = e.clientX
+            resizeDom[i].left = resizeDom[i].offsetLeft
+            // 榧犳爣鎷栧姩浜嬩欢
+            document.onmousemove = function (e) {
+              console.log(2)
+                var endX = e.clientX
+                var moveLen = resizeDom[i].left + (endX - startX) // 锛坋ndx-startx锛�=绉诲姩鐨勮窛绂汇�俽esize[i].left+绉诲姩鐨勮窛绂�=宸﹁竟鍖哄煙鏈�鍚庣殑瀹藉害
+                var maxT = operateDom[i].clientWidth - resizeDom[i].offsetWidth // 瀹瑰櫒瀹藉害 - 宸﹁竟鍖哄煙鐨勫搴� = 鍙宠竟鍖哄煙鐨勫搴�
+ 
+                if (moveLen < 200) moveLen = 200 // 宸﹁竟鍖哄煙鐨勬渶灏忓搴︿负32px
+                if (moveLen > maxT - 200) moveLen = maxT - 200 //鍙宠竟鍖哄煙鏈�灏忓搴︿负150px
+ 
+                resizeDom[i].style.left = moveLen // 璁剧疆宸︿晶鍖哄煙鐨勫搴�
+                for (let j = 0; j < instructDom.length; j++) {
+                  instructDom[j].style.width = moveLen + 'px'
+                    logDom[j].style.width = operateDom[i].clientWidth - moveLen - 10 + 'px'
+                }
+            }
+            // 榧犳爣鏉惧紑浜嬩欢
+            document.onmouseup = function (evt) {
+                //棰滆壊鎭㈠
+                resizeDom[i].style.background = '#f0f2f5'
+                document.onmousemove = null
+                document.onmouseup = null
+                resizeDom[i].releaseCapture && resizeDom[i].releaseCapture() //褰撲綘涓嶅湪闇�瑕佺户缁幏寰楅紶鏍囨秷鎭氨瑕佸簲璇ヨ皟鐢≧eleaseCapture()閲婃斁鎺�
+            }
+            resizeDom[i].setCapture && resizeDom[i].setCapture() //璇ュ嚱鏁板湪灞炰簬褰撳墠绾跨▼鐨勬寚瀹氱獥鍙i噷璁剧疆榧犳爣鎹曡幏
+            return false
+        }
+    }
+};
+</script>
+
+<style lang="less" scoped>
+.simulation-result {
+  width: 100%;
+  height: 100%;
+  position: relative;
+}
+.titleBox {
+  height: 36px;
+  line-height: 36px;
+  background: #409eff;
+  position: relative;
+  .name {
+    display: flex;
+    justify-content: center; /* 姘村钩灞呬腑 */
+    align-items: center;
+    img {
+      margin-left: 10px;
+    }
+  }
+  .back {
+    position: absolute;
+    left: 10px;
+    top: 0;
+    display: flex;
+    align-items: center;
+    color: #ffffff;
+  }
+}
+.title {
+  background: #409eff;
+  height: 36px;
+  display: flex;
+  align-items: center;
+  padding: 0 10px;
+  img {
+    margin-left: 10px;
+  }
+}
+.bodyBox {
+  height: 70%;
+  .modelBox {
+    width: 60%;
+    border: 1px solid #f1f1f1;
+  }
+  .shadowBox {
+    width: 40%;
+  }
+  #shadowX,
+  #shadowY,
+  #shadowZ {
+    background: #fff;
+    height: calc((100% - 6px) / 3);
+    border: 1px solid #f1f1f1;
+  }
+}
+.operateBox {
+  height: calc(100% - 36px - 70%);
+  box-sizing: border-box;
+  overflow: hidden;
+  #instruct,
+  #log {
+    background: #fff;
+    border: 1px solid #f1f1f1;
+    width: calc((100% - 4px) / 2);
+    height: 100%;
+    box-sizing: border-box;
+    float: left;
+  }
+  #resize {
+    width: 3px;
+    position: relative;
+    cursor: col-resize;
+    background-size: cover;
+    background-position: center;
+    &:hover {
+      background: #45a3ff;
+    }
+  }
+
+  .upBold {
+    display: flex;
+    align-items: center;
+    color: #fff;
+  }
+
+  .instruct-body {
+    height: calc(100% - 36px);
+    position: relative;
+    .instruct-list {
+      height: calc(100% - 52px);
+      overflow-y: auto;
+      padding: 10px;
+    }
+    .inputBox {
+      width: 100%;
+      position: absolute;
+      bottom: 0;
+    }
+  }
+  .log-body {
+    height: calc(100% - 36px);
+    .log-list {
+      height: calc(100% - 20px);
+      overflow-y: auto;
+      padding: 10px;
+    }
+  }
+}
+</style>
diff --git a/src/views/simulation/testSimulation/index.vue b/src/views/simulation/testSimulation/index.vue
new file mode 100644
index 0000000..3b62d17
--- /dev/null
+++ b/src/views/simulation/testSimulation/index.vue
@@ -0,0 +1,238 @@
+<template>
+  <div class="simulation-index">
+    <div class="flex ai-c">
+      <el-select v-model="aircraftActive" placeholder="Select" style="width: 140px">
+        <el-option
+          v-for="item in aircraftList"
+          :key="item.id"
+          :label="item.name"
+          :value="item.id"
+        />
+      </el-select>
+      <ul class="flex tabs">
+        <li
+          v-for="item in modelTypeList"
+          :key="item.id"
+          @click="handleClick(item)" 
+          :class="item.id == modelTypeActive ? 'activeItem' : 'item'"
+        >
+          {{ item.name }}
+        </li>
+      </ul>
+    </div>
+    <div class="page-box">
+      <div class="search">
+        <el-input
+          v-model="searchValue"
+          style="width: 400px"
+          placeholder="璇疯緭鍏ユ悳绱㈠叧閿瓧"
+        >
+          <template #suffix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+      </div>
+      <div class="list">
+        <div class="model-body" v-loading="listLoading">
+          <el-row :gutter="20" v-if="modelDataList.length > 0">
+            <el-col
+              :span="6"
+              v-for="(item, index) in modelDataList"
+              :key="index"
+            >
+              <div class="model-body-box">
+                <div class="model-img">
+                  <img :src="item.icon" alt="" />
+                </div>
+                <div class="model-info">
+                  <h1 class="model-title" :title="item.name">
+                    {{ item.name }}
+                  </h1>
+                  <p class="flex jc-sb">
+                    <span class="attribute hover" @click="gotoDetail(item)">灞炴��</span>
+                    <span class="report hover" @click="gotoReport(item)">娴嬭瘯鎶ュ憡</span>
+                    <span class="simulation hover" @click="gotoSimulation(item)">浠跨湡</span>
+                  </p>
+                </div>
+              </div>
+            </el-col>
+          </el-row>
+          <div v-if="modelDataList.length == 0">
+            <el-empty :image-size="140" />
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+  <el-dialog
+    v-model="detailDialogVisible"
+    title="灞炴��"
+    width="500"
+    :before-close="handleClose"
+  >
+    <div>
+      <div>鍚嶇О锛氬贰瑙嗗櫒鏁存ā鍨�</div>
+      <div>灏哄锛氬贰瑙嗗櫒鏁存ā鍨�</div>
+    </div>
+    
+  </el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from "vue";
+import { useRouter, useRoute } from 'vue-router'
+const router = useRouter()
+const route = useRoute()
+
+const aircraftList = ref([]);
+const aircraftActive = ref('1')
+const modelTypeList = ref([
+  {
+    name: "鐫�闄嗗櫒",
+    id: "2",
+  },
+  {
+    name: "宸¤鍣�",
+    id: "3",
+  },
+  {
+    name: "椋炶穬鍣�",
+    id: "4",
+  },
+]);
+const modelTypeActive = ref("3");
+const searchValue = ref();
+const modelDataList = ref([]);
+const listLoading = ref(false);
+const detailDialogVisible = ref(false)
+onMounted(() => {
+  getAircraftList();
+  getModelData();
+});
+
+const getAircraftList = () => {
+  let list = [
+    {
+      name: "瀚﹀ē涓冨彿",
+      id: "1",
+    },
+    {
+      name: "鍏朵粬鍨嬪彿",
+      id: "2",
+    },
+  ];
+  aircraftList.value = list;
+};
+
+const handleClick = (item) => {
+  modelTypeActive.value = item.id
+};
+const getModelData = () => {
+  listLoading.value = true;
+  let list = [
+    {
+      name: "宸¤鍣ㄦ暣妯″瀷",
+      icon: "",
+      id: "1",
+    },
+    {
+      name: "澶╃嚎",
+      icon: "",
+      id: "2",
+    },
+    {
+      name: "澶槼缈�",
+      icon: "",
+      id: "3",
+    },
+  ];
+  modelDataList.value = list;
+  listLoading.value = false;
+};
+
+
+//鏌ョ湅灞炴��
+const gotoDetail = () => {
+  detailDialogVisible.value = true
+};
+const handleClose = () =>{
+  detailDialogVisible.value = false
+}
+//鏌ョ湅娴嬭瘯鎶ュ憡
+const gotoReport = (item) => {
+  router.push({
+    name: 'testReport',
+    query: {
+      id: item.id
+    }
+  })
+};
+//鎵撳紑浠跨湡
+const gotoSimulation = (item) => {
+  router.push({
+    name: 'testSimulation-detail',
+    query: {
+      id: item.id
+    }
+  })
+};
+
+</script>
+
+<style lang="less" scoped>
+.simulation-index {
+  padding: 20px;
+}
+.tabs{
+  margin-left: 40px;
+  li{
+    width:60px;
+    text-align: center;
+    padding: 5px 0;
+    margin:0 15px;
+    cursor: pointer;
+  }
+  .activeItem{
+    border-bottom:2px solid #1890ff;
+  }
+}
+.page-box{
+  margin-top: 20px;
+}
+.list {
+  margin-top: 20px;
+  .model-body-box {
+    border: 1px solid #f1f1f1;
+    .model-img {
+      height: 240px;
+
+      img {
+        width: 100%;
+        height: 100%;
+        object-fit: contain;
+      }
+    }
+
+    .model-info {
+      height: 80px;
+      padding: 20px;
+      .model-title {
+        font-size: 16px;
+      }
+      p {
+        line-height: 30px;
+        font-size: 16px;
+      }
+      .attribute {
+        color: #1890ff;
+      }
+      .report {
+        color: #1fbc1f;
+      }
+      .simulation {
+        color: #ee1818;
+      }
+    }
+  }
+}
+</style>
diff --git a/src/views/simulation/testSimulation/testReport.vue b/src/views/simulation/testSimulation/testReport.vue
new file mode 100644
index 0000000..0f05b0d
--- /dev/null
+++ b/src/views/simulation/testSimulation/testReport.vue
@@ -0,0 +1,130 @@
+<template>
+  <div class="permission-manage">
+    <div class="titleBox">
+      <div class="name"> 
+        <span>{{ name }}娴嬭瘯鎶ュ憡</span>
+      </div>
+      <div class="back"><el-icon><ArrowLeftBold /></el-icon>杩斿洖</div>
+    </div>
+    <div class="page-box">
+      <div class="search flex">
+        <el-date-picker
+        v-model="testTime"
+        type="date"
+        placeholder="閫夋嫨鏃ユ湡"
+      />
+        <el-input
+          v-model="searchValue"
+
+          placeholder="璇疯緭鍏ユ悳绱㈠叧閿瓧"
+          class="searchInput"
+        >
+          <template #suffix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+      </div>
+      <div class="list">
+        <div>
+          <el-table :data="tableData" border :default-sort="{ prop: 'date', order: 'descending' }" style="width: 100%">
+            <el-table-column prop="index" label="搴忓彿" width="60"/>
+            <el-table-column prop="name" label="娴嬭瘯鍚嶇О" />
+            <el-table-column prop="model" label="娴嬭瘯妯″瀷" />
+            <el-table-column prop="time" label="娴嬭瘯鏃堕棿" sortable />
+            <el-table-column prop="operator" label="娴嬭瘯浜�"/>
+            <el-table-column label="鎿嶄綔">
+              <template #default="scope">
+                <el-button
+                  size="small"
+                  @click="getDetail(scope.row)"
+                >
+                  鏌ョ湅
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from "vue";
+const name = ref('椋炶穬鍣ㄦ暣妯″瀷')
+const testTime = ref()
+const searchValue = ref()
+const tableData = ref([])
+
+onMounted(() => {
+  getReportData();
+});
+
+const getReportData =()=>{
+  let list=[
+    {
+      index: 1,
+      name:'',
+      model:'',
+      time:'',
+      operator:'',
+    },
+    {
+      index: 2,
+      name:'',
+      model:'',
+      time:'',
+      operator:'',
+    },
+    {
+      index: 3,
+      name:'',
+      model:'',
+      time:'',
+      operator:'',
+    },
+  ]
+  tableData.value = list
+}
+
+const getDetail =(row)=>{
+
+}
+
+</script>
+
+<style lang="less" scoped>
+.testReport {
+  padding: 20px;
+}
+.titleBox{
+  height:36px;
+  line-height: 36px;
+  background:#409eff;
+  position: relative;
+  .name{
+    text-align:center;
+  }
+  .back{
+    position:absolute;
+    left:10px;
+    top: 0;
+    display: flex;
+    align-items: center;
+    color:#ffffff;
+  }
+  
+}
+.page-box{
+  padding: 20px;
+  .searchInput{
+    width:220px;
+    margin-left:20px;
+  }
+  .list{
+    margin-top:20px;
+  }
+}
+</style> 
\ No newline at end of file
diff --git a/src/views/system/User.vue b/src/views/system/User.vue
deleted file mode 100644
index 1f11920..0000000
--- a/src/views/system/User.vue
+++ /dev/null
@@ -1,14 +0,0 @@
-<template>
-  <div class="user-manage">
-    <h2>鐢ㄦ埛绠$悊</h2>
-  </div>
-</template>
-
-<script setup lang="ts">
-</script>
-
-<style lang="less" scoped>
-.user-manage {
-  padding: 20px;
-}
-</style> 
\ No newline at end of file
diff --git a/src/views/system/index.vue b/src/views/system/index.vue
new file mode 100644
index 0000000..a13528e
--- /dev/null
+++ b/src/views/system/index.vue
@@ -0,0 +1,16 @@
+<template>
+  <div class="pageContainer">
+    <div class="menuBox">
+      <treeMenu :menuItem="menuItem"/>
+    </div>
+    <div class="contentBox"><RouterView /></div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref} from "vue";
+import treeMenu from "@/components/treeMenu.vue";
+const menuItem = ref('systemManage')
+</script>
+
+<style lang="less" scoped></style>
\ No newline at end of file
diff --git a/src/views/system/roleManage.vue b/src/views/system/roleManage.vue
new file mode 100644
index 0000000..d455c20
--- /dev/null
+++ b/src/views/system/roleManage.vue
@@ -0,0 +1,166 @@
+<template>
+  <div class="user-manage">
+    <div>
+      <ul class="flex tabs">
+        <li
+          v-for="item in tabList"
+          :key="item.value"
+          @click="handleClick(item)"
+          :class="item.value == tabActive ? 'activeItem' : 'item'"
+        >
+          {{ item.lable }}
+        </li>
+      </ul>
+    </div>
+    <div class="list">
+      <div>
+        <el-tree
+          :data="dataList"
+          show-checkbox
+          node-key="id"
+          default-expand-all
+          :props="defaultProps"
+        />
+
+      </div>
+
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from "vue";
+
+const tabList = ref([
+  {
+    lable:'鑿滃崟/鍔熻兘璁块棶鏉冮檺',
+    value:'menu'
+
+  },
+  {
+    lable:'妯″瀷璁块棶鏉冮檺',
+    value:'model'
+  }
+])
+const tabActive = ref('menu')
+const dataList = ref([])
+
+onMounted(() => {
+  getData();
+});
+
+const defaultProps = {
+  children: 'children',
+  label: 'name',
+}
+
+const getData = () =>{
+  let list = [
+    {
+      name:'妯″瀷绠$悊',
+      sysType:'cmsFolder',
+      productLinkPath:'111',
+      children:[
+        {
+          name:'鏂板鍨嬪彿',
+          sysType:'cmsItem',
+          productLinkPath:'211',
+        },
+        {
+          name:'缂栬緫鍨嬪彿',
+          sysType:'cmsItem',
+          productLinkPath:'212',
+        },
+        {
+          name:'鍒犻櫎鍨嬪彿',
+          sysType:'cmsItem',
+          productLinkPath:'213',
+        },
+        {
+          name:'鏂板妯″瀷',
+          sysType:'cmsItem',
+          productLinkPath:'214',
+        },{
+          name:'鍒犻櫎妯″瀷',
+          sysType:'cmsItem',
+          productLinkPath:'215',
+        },{
+          name:'鍒犻櫎妯″瀷',
+          sysType:'cmsItem',
+          productLinkPath:'216',
+        }
+      ]
+
+    },
+    {
+      name:'鍙鍖栦豢鐪�',
+      sysType:'cmsFolder',
+      productLinkPath:'112',
+      children:[
+        {
+          name:'娴嬭瘯浠跨湡',
+          sysType:'cmsFolder',
+          productLinkPath:'221',
+          children:[
+            {
+              name:'妫�绱㈡ā鍨�',
+              sysType:'cmsItem',
+              productLinkPath:'231',
+              
+            },
+            {
+              name:'妯″瀷棰勮',
+              sysType:'cmsItem',
+              productLinkPath:'232',
+            },
+            {
+              name:'妯″瀷灞炴�ф煡鐪�',
+              sysType:'cmsItem',
+              productLinkPath:'233',
+            },
+            {
+              name:'妯″瀷浠跨湡',
+              sysType:'cmsItem',
+              productLinkPath:'234',
+            },
+            {
+              name:'娴嬭瘯鎶ュ憡',
+              sysType:'cmsItem',
+              productLinkPath:'235',
+            },
+          ]
+        },
+        {
+          name:'娴嬭瘯鎶ュ憡',
+          sysType:'cmsFolder',
+          productLinkPath:'221',
+        },
+      ]
+
+    }
+  ]
+  dataList.value = list
+
+}
+const handleClick = (item) => {
+  tabActive.value = item.value
+};
+</script>
+
+<style lang="less" scoped>
+.user-manage {
+  padding: 20px;
+}
+.tabs{
+  li{
+    width:140px;
+    text-align: center;
+    padding: 5px 0;
+    margin:0 15px;
+    cursor: pointer;
+  }
+  .activeItem{
+    border-bottom:2px solid #1890ff;
+  }
+}
+</style>
diff --git a/src/views/system/userManage.vue b/src/views/system/userManage.vue
new file mode 100644
index 0000000..3d69e2f
--- /dev/null
+++ b/src/views/system/userManage.vue
@@ -0,0 +1,176 @@
+<template>
+  <div class="user-manage">
+    <div class="flex jc-sb ai-c">
+      <div class="addBox">
+        <el-icon><Plus /></el-icon>
+        <span>鏂板缓</span>
+      </div>
+      <div class="search">
+        <el-input
+          v-model="searchValue"
+          style="width: 400px"
+          placeholder="璇疯緭鍏ユ悳绱㈠叧閿瓧"
+        >
+          <template #suffix>
+            <el-icon class="el-input__icon"><search /></el-icon>
+          </template>
+        </el-input>
+      </div>
+    </div>
+    <div class="list">
+      <el-table
+        :data="tableData"
+        row-key="id"
+        border
+        style="width: 100%"
+        class="roverTable"
+      >
+        <el-table-column prop="index" label="搴忓彿" width="60" />
+        <el-table-column prop="userName" label="鐢ㄦ埛濮撳悕" />
+        <el-table-column prop="name" label="鐢ㄦ埛鍚�" />
+        <el-table-column prop="state" label="鐘舵��" />
+        <el-table-column prop="role" label="绫诲瀷" />
+        <el-table-column prop="creatTime" label="鍒涘缓鏃堕棿" />
+        <el-table-column label="鎿嶄綔"  width="220" >
+          <template #default="scope">
+            <el-button size="small" @click="update(scope.row)">
+              缂栬緫
+            </el-button>
+            <el-button size="small" @click="goDisable(scope.row)">
+              绂佺敤
+            </el-button>
+            <el-button size="small" @click="goDelete(scope.row)">
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="rover-pagination-block">
+      <el-pagination
+        v-model:current-page="currentPage"
+        :page-size="pageSize"
+        :background="background"
+        layout="total, prev, pager, next"
+        :total="100"
+        @current-change="handleCurrentChange"
+      />
+    </div>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, onMounted } from "vue";
+import { ElMessage, ElMessageBox } from 'element-plus'
+
+const searchValue = ref();
+const tableData = ref([]);
+// 鍒嗛〉
+const currentPage = ref(4);
+const pageSize = ref(100);
+const background = ref(true);
+
+onMounted(() => {
+  getUserData();
+});
+
+const getUserData =() =>{
+  let list=[
+    {
+      index: 1,
+      userName:'',
+      name:'',
+      state:'',
+      role:'',
+      creatTime:'',
+    },
+    {
+      index: 2,
+      userName:'',
+      name:'',
+      state:'',
+      role:'',
+      creatTime:'',
+    },
+    {
+      index: 3,
+      userName:'',
+      name:'',
+      state:'',
+      role:'',
+      creatTime:'',
+    },
+  ]
+  tableData.value = list
+
+}
+
+const handleCurrentChange = (val: number) => {
+  console.log(`current page: ${val}`);
+};
+
+// 缂栬緫
+const update = (row) =>{
+
+}
+//绂佺敤
+const goDisable = (row) =>{
+  ElMessageBox.confirm(
+    '纭畾瑕佺鐢ㄨ鐢ㄦ埛?',
+    'Warning',
+    {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      console.log(row)
+     
+    })
+    .catch(() => {
+      
+    })
+  
+}
+//鍒犻櫎
+const goDelete = () =>{
+  ElMessageBox.confirm(
+    '纭畾瑕佸垹闄よ鐢ㄦ埛?',
+    'Warning',
+    {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      console.log(row)
+    })
+    .catch(() => {
+      
+    })
+}
+</script>
+
+<style lang="less" scoped>
+.user-manage {
+  padding: 20px;
+}
+.addBox {
+  display: flex;
+  align-items: center;
+  color: #409eff;
+}
+.list{
+  margin-top:20px;
+}
+.rover-pagination-block {
+    height: 60px;
+    display: flex;
+    justify-content: flex-end;
+    background-color: #fff;
+    padding: 0 10px;
+    box-sizing: border-box;
+  }
+</style>

--
Gitblit v1.9.1