wu
2024-12-23 b9b44b51b201e2f5a9a1f3665c7fb76b5690f9af
UI-Project/src/layout/MainErpView.vue
@@ -7,15 +7,14 @@
import deepClone from '@/utils/deepClone'
import { useRouter } from 'vue-router';  
import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
const { t } = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const store = userInfo()
const isCollapse = ref(false);
// const { $i18n } = useI18n(); // 获取 i18n 实例  
const router = useRouter()
const userStore = useUserInfoStore()
// const user = userStore.user.userName
let userInfoStr = window.localStorage.getItem('userInfo')
console.log(userInfoStr);
// const userInfoStr = localStorage.getItem('userInfo');  
@@ -29,60 +28,66 @@
              })
  router.push('/login')  
}
// const quit = async () => {
//   try  {
//       store.$patch({user: null})
//     const response = await request.post('/loadGlass/sys/user/logout')
//     if (response.code === 200) {
//         console.log('登出成功');
//       } else {
//         // 处理错误情况
//         console.error('登出失败', response);
//       }
// }
// catch (error) {
//     // 处理错误
//     console.error(error);
//   }
// }
// store.createWebSocket();
// function quit() {
//   userStore.$patch({
//     user: null,
//   })
//   // router.push('/login')
//   request.get("/loadGlass/sys/user/login").then((res) => {
//     if (res.code === 200) {
//     ElMessage.success(res.msg);
//      console.log(res.data);
//     } else {
//     ElMessage.warning(res.msg);
//     // router.push("/login");
//     }
//    });
// }
  function replaceChineseWithEnglish(menuData) {  
      // 定义中英文对照关系对象
      // 定义中俄文对照关系对象
       const translation  = {  
          '上片机': 'Стол загрузки',
          '掰片/识别': 'Разлом/идентификация',
          '卧式缓存': ' Горизонтальный буфер',
          '磨边前卧式缓存': 'Горизонтальный буфер перед шлифовкой',
          '下片卧式缓存': 'Горизонтальный буфер стекла разгрузки',
          '磨边(冷加工)': 'Шлифовать края (холодная обработка)',
          '1线磨边(冷加工)': 'Шлифовать края 1 линии (холодная обработка)',
          '2线磨边(冷加工)': 'Шлифовать края 2 линии (холодная обработка)',
          '大理片笼': 'Буферная система',
          '钢化': 'Закалка',
          '钢化前': 'Перед закалки',
          '钢化后': 'После закалки',
          '下片台': 'Стол разгрузки',
          '系统管理': 'Управление системой',
          '用户管理': 'Управление пользователем',
          '权限管理': 'Управление полномочиями',
          '角色管理': 'Управление ролью',
    '上片机': 'Стол загрузки',
    '上片': 'Верхняя часть',
    '掰片/识别': 'Разлом/идентификация',
    '卧式缓存': ' Горизонтальный буфер',
    '磨边前卧式缓存': 'Горизонтальный буфер перед шлифовкой',
    '下片卧式缓存': 'Горизонтальный буфер стекла разгрузки',
    '磨边(冷加工)': 'Шлифовать края (холодная обработка)',
    '1线磨边(冷加工)': 'Шлифовать края 1 линии (холодная обработка)',
    '2线磨边(冷加工)': 'Шлифовать края 2 линии (холодная обработка)',
    '大理片笼': 'Буферная система',
    '钢化': 'Закалка',
    '钢化前': 'Перед закалки',
    '钢化后': 'После закалки',
    '下片台': 'Стол разгрузки',
    '系统管理': 'Управление системой',
    '用户管理': 'Управление пользователем',
    '权限管理': 'Управление полномочиями',
    '角色管理': 'Управление ролью',
    '可视化系统': 'Визуальная система',
    '报工管理': 'Управление отчетностью',
    '仓储中心': 'Складской центр',
    '原片仓储': 'Склад сырья',
     };
  menuData.forEach(menu => {
    menu.menuName = translation[menu.menuName] || menu.menuName;
    // if (menu.children) {
      menu.children && menu.children.forEach(submenu => {
        submenu.menuName = translation[submenu.menuName] || submenu.menuName;
      });
    // }
  });
}
function replaceChineseWithRussian(menuData) {
      // 定义中英文对照关系对象
   const translation  = {
    '上片机': 'Loading Machine',
    '上片': 'Start showing a movie',
    '掰片/识别': 'Breaking /Identification',
    '卧式缓存': 'Horizontal cache',
    '磨边前卧式缓存': 'Horizontal buffer before edge grinding',
    '下片卧式缓存': 'Offline horizontal cache',
    '磨边(冷加工)': 'Grinding edge (cold processing)',
    '1线磨边(冷加工)': '1-line edge grinding (cold processing)',
    '2线磨边(冷加工)': '2-line edge grinding (cold processing)',
    '大理片笼': 'Dali slice cage',
    '钢化': 'Toughened',
    '钢化前': 'Before Tempering',
    '钢化后': 'After Tempering',
    '下片台': 'Next Stage',
    '系统管理': 'System Management',
    '用户管理': 'User Management',
    '权限管理': 'Rights Management',
    '角色管理': 'Roles',
    '可视化系统': 'visualization system',
    '报工管理': 'Job reporting management',
    '仓储中心': 'Storage Center',
    '原片仓储': 'Original film storage',
     };  
  menuData.forEach(menu => {  
    menu.menuName = translation[menu.menuName] || menu.menuName;  
@@ -95,33 +100,15 @@
//提取菜单模块列表
let menuList = $ref([])
// onMounted(async () => {
//   try {
//     const res = await request.get('/loadGlass/sys/menu/getMenuTree'); // 假设 request.get 返回 Promise
//     if (res.code == 200) {
//       // 使用 value 属性来修改 ref 引用的值
//       menuList.value = deepClone(res.data);
//       const language = $i18n.locale;
//       if (language === 'en') {
//         replaceChineseWithEnglish(menuList.value); // 传入 ref 的 value
//       }
//       console.log(res.data.token); // 如果 res.data 中有 token 的话
//     } else {
//       ElMessage.warning(res.msg);
//       router.push('/login');
//     }
//   } catch (error) {
//     // 处理请求错误
//     console.error('获取菜单列表时出错:', error);
//   }
// });
request.get('/loadGlass/sys/menu/getMenuTree').then((res) => {
  if (res.code == 200) {
    menuList = res.data
    console.log(language.value)
    // translateMenu(menuList.value, language.value);
      if (language.value === 'en') {
        replaceChineseWithRussian(menuList);
      }
      if (language.value === 'py') {
        replaceChineseWithEnglish(menuList);
      }
  } else {
@@ -131,7 +118,6 @@
})
const menu = ref(null)
let indexKey = ref(null)
function handleOpen(key) {
  indexKey.value = key
}
@@ -144,11 +130,9 @@
    },
    {deep: true}
)
router.beforeEach((to, from) => {
  //return false
})
let openFlag = $ref(null)
//原始菜单打开
const openMenu = (menuID) => {
@@ -158,21 +142,19 @@
    openFlag = menuID
  }
}
function toggleCollapse() {
  isCollapse.value = !isCollapse.value;
}
</script>
<template>
  <div id="all">
    <el-container>
      <el-header>
        <div style="height: 100%;width: 100%;display: flex;background-color: #fff;">
          <img src="../assets/northGlass.ico"
               alt=""
               alt=""  @click="toggleCollapse"
               style="max-width: 100%;max-height: 100%">
          <h3 style="margin: 1rem  ;font-weight: bold;width: 33vw;"> {{ $t('main.titleFirst') }}{{ userName }}{{ $t('main.titleLast') }}</h3>
          <!-- <div class="header-left">
            <el-button :icon="isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'" @click="toggleCollapse"
              style="height:30px;"></el-button>
          </div> -->
          <span style="height: 70%;width: 78vw;margin-top: 1rem;">
            <!-- <el-button class="sys-quit"
                       @click="quit"
@@ -188,33 +170,22 @@
                <SwitchButton size=""/>{{ $t('main.quit') }}
              </el-icon>
            </el-button>
            <!-- <div class="header-left">
              <el-button @click="toggleCollapse" style="height: 30px;">
               <el-icon><Expand /></el-icon>
              </el-button>
          </div> -->
          </span>
        </div>
      </el-header>
      <div id="line"></div>
      <el-container>
        <!-- <el-aside width="160px"
                  style="height: 99%; background-color: #fff;">
          <div class="menu">
            <div v-for="items in menuList">
              <div class='menu_title'
                   @click="openMenu(items.id)">
                <span>☰</span>
                {{ items.menuName }}
              </div>
              <ul class='enter-x-left'
                  v-show="openFlag==items.id">
                <li v-for="menuItem in items.children"
                    style="margin-bottom:2px">
                  <router-link :to="{path:menuItem.url}">
                    {{ menuItem.menuName }}
                  </router-link>
        </el-aside> -->
      <el-aside :width="isCollapse ? '0px' : '200px'" style="background-color: #fff;">
        <el-row :span="20">
            <el-menu :default-active="activePath" class="el-menu-vertical-demo" background-color="#fff">
            <el-menu :default-active="activePath" class="el-menu-vertical-demo" >
              <div class="menu">
            <div v-for="items in menuList">
              <div class='menu_title'
              <div class='menu_title' v-show="!isCollapse"
                   @click="openMenu(items.id)">
                <span>☰</span>
                {{ items.menuName }}
@@ -232,50 +203,39 @@
                  </div>
            </el-menu>
          </el-row>
        <el-main>
</el-aside>
<el-main>
          <div id="main">
            <router-view></router-view>
          </div>
        </el-main>
      </el-container>
    </el-container>
  </div>
</template>
<style scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
  width: 200px;
  min-height: 400px;
  text-align: left;
}
#all {
  background-color: #eee;
  height: 100%;
}
.el-container {
  height: 100vh;
  width: 99vw;
}
* {
  padding: 0;
  margin: 0;
}
:deep(.sys-quit) {
  float: right;
  margin-right: 1rem;
  width: 5rem;
}
/* 横线 */
#line {
  float: right;
@@ -287,16 +247,13 @@
  position: relative;
  text-align: center;
}
:deep(span) {
  margin-right: 0;
}
.el-collapse {
  font-size: 16px;
  font-weight: bold;
}
#main {
  width: 99%;
  float: right;
@@ -304,9 +261,7 @@
  background-color: #fff;
}
/*------------*/
/* .menu div div{
  width: 138px;
  height: 35px;
  line-height: 35px;
@@ -328,27 +283,23 @@
/* background-color:#5CADFE; */
/* box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19); */
/* } */
.menu {
  width: 138px;
  height: 33px;
  line-height: 25px;
  color: #000000;
  font-size: 16px;
  padding-left: 15px;
  padding-right: 2px;
}
ul {
  height: auto;
  margin: 1px auto;
  text-align: center;
}
ul li {
  height: 28px;
  width: 200px;
  width: 180px;
  line-height: 30px;
  /* background: rgb(128, 128, 128); */
  color: #000000;
@@ -358,16 +309,13 @@
  text-align: left;
  /* border-radius:8px; */
  /*   outline: none; */
  /* background: #5CADFE; */
  /* box-shadow: 0 8px 16px 0 rgba(0,0,0,0), 0 6px 5px 0 rgba(0,0,0,0.19); */
}
ul li:hover {
  /* background:#5CADFE ; */
  color: #ffffff;
}
ul li a {
  text-decoration: none;
  color: #000000;
@@ -376,7 +324,6 @@
ul li a:hover {
  color: #1087ff;
}
.item_divider {
  width: 118px;
  height: 0px;
@@ -384,7 +331,6 @@
  opacity: 0.8; */
  margin-bottom: 2px;
}
.item a {
  width: 138px;
  height: 35px;
@@ -395,13 +341,11 @@
  font-size: 14px;
  text-decoration: none;
}
.menu_title {
  width: 180px;
  /* white-space: nowrap;  
  overflow: hidden;  
  text-overflow: ellipsis;   */
  height: 45px;
  line-height: 55px;
  /* background: #fafafa; */
@@ -414,12 +358,10 @@
  font-weight: bold;
  overflow: hidden;
}
.menu_title:hover {
  /* background: #dedede; */
  color: #3b9af9;
}
.indicator {
  display: block;
  width: 40px;
@@ -431,7 +373,6 @@
  transition: all 0.3s ease;
  text-align: center;
}
/* 动画效果 */
.enter-x-left {
  z-index: 9;
@@ -441,19 +382,15 @@
  transform: translateX(-50px);
  transition: all 0.3s ease;
}
.enter-x-left:nth-child(1) {
  animation-delay: 0.1s;
}
.enter-x-left:nth-child(2) {
  animation-delay: 0.2s;
}
.enter-x-left:nth-child(3) {
  animation-delay: 0.3s;
}
.enter-x-left:nth-child(4) {
  animation-delay: 0.4s;
}
@@ -463,4 +400,7 @@
    transform: translateX(0);
  }
}
.header-left{
  margin-left: -350px;
}
</style>