Browse Source

权限管理及侧边栏菜单

yangg 11 tháng trước cách đây
mục cha
commit
2664e2f22f

+ 13 - 0
src/api/auth.js

@@ -153,3 +153,16 @@ export function editUserInfo(params) {
     data: params
   })
 }
+
+/**
+ * 获取套餐角色列表
+ * @param params
+ */
+export function getPackageRoleList(params) {
+  return request({
+    url: 'admin/systems/roles/packageSuper',
+    method: 'get',
+    loading: false,
+    params
+  })
+}

+ 16 - 0
src/api/common.js

@@ -89,3 +89,19 @@ export function getSiteInfo() {//${api.admin}
     loading: false
   })
 }
+
+/* 公司查询  */
+export function getCompany(para) {
+  return request({
+    url: `/admin/systems/admin-users/login/getCompany?key=${para}`,
+    method: 'get',
+    needToken: false
+  })
+}
+
+/* export function getLoginCompany(para) {
+  return request({
+      url: `/admin/systems/admin-users/login/getCompany?key=${para}`,
+      method: 'get'
+  })
+} */

+ 4 - 4
src/api/menus.js

@@ -5,14 +5,14 @@
 import request from '@/utils/request'
 
 /**
- * 获取菜单
+ * 获取菜单parent_id = 0/${parent_id}params: { parent_id }
  * @param parent_id
  */
-export function getMenusChildren(parent_id = 0) {
+export function getMenusChildren() {
   return request({
-    url: `admin/systems/menus/children/${parent_id}`,
+    url: `admin/systems/menus/children`,
     method: 'get',
-    params: { parent_id }
+    
   })
 }
 

+ 4 - 0
src/app-setting.ts

@@ -12,6 +12,10 @@ export default {
         val = val || $themeConfig.menu;
         store.dispatch('toggleMenu', val);
 
+        val = localStorage.getItem('superMenu'); // vertical, collapsible-vertical, horizontal
+        val = val || $themeConfig.menu;
+        store.dispatch('toggleSuperMenu', val);
+
         val = localStorage.getItem('layout'); // full, boxed-layout
         val = val || $themeConfig.layout;
         store.dispatch('toggleLayout', val);

+ 0 - 0
src/assets/css/sidebar.css


+ 14 - 53
src/components/layout/Sidebar.vue

@@ -15,19 +15,20 @@
             <icon-carets-down class="m-auto rotate-90" />
           </a>
         </div>
+        <!-- <el-scrollbar wrap-class="scrollbar-wrapper">
+          <el-menu mode="vertical" :default-active="$route.path" :collapse="isCollapse">
+            <sidebar-item v-for="route in permissionRouters" :key="route.name" :item="route" :base-path="route.path"></sidebar-item>
+          </el-menu>
+        </el-scrollbar> -->
         <perfect-scrollbar
+          v-if="superMenu=='super'"
           :options="{
             swipeEasing: true,
             wheelPropagation: false,
           }"
           class="h-[calc(100vh-80px)] relative"
         >
-          <!-- <el-scrollbar wrapClass="scrollbar-wrapper">
-            <el-menu mode="vertical" :show-timeout="200" :default-active="$route.path" :collapse="isCollapse">
-              <sidebar-item v-for="route in permissionRouters" :key="route.name" :item="route" :base-path="route.path"></sidebar-item>
-            </el-menu>
-          </el-scrollbar> -->
-          <ul class="relative font-semibold space-y-0.5 p-4 py-0">
+           <ul class="relative font-semibold space-y-0.5 p-4 py-0">
             <li class="menu nav-item">
               <button
                 type="button"
@@ -65,46 +66,6 @@
                 </ul>
               </vue-collapsible>
             </li>
-            <!-- <li class="nav-item">
-              <ul>
-                <li class="menu nav-item">
-                  <button
-                    type="button"
-                    class="nav-link group w-full"
-                    :class="{ active: activeDropdown === 'invoice' }"
-                    @click="activeDropdown === 'invoice' ? (activeDropdown = null) : (activeDropdown = 'invoice')"
-                  >
-                    <div class="flex items-center">
-                      <icon-menu-chat class="group-hover:!text-primary shrink-0" />
-
-                      <span class="ltr:pl-3 rtl:pr-3 text-black dark:text-[#506690] dark:group-hover:text-white-dark"> 应用列表 </span>
-                    </div>
-                    <div :class="{ 'rtl:rotate-90 -rotate-90': activeDropdown == 'invoice' }">
-                      <icon-caret-down />
-                    </div>
-                  </button>
-                  <vue-collapsible :isOpen="activeDropdown === 'invoice'">
-                    <ul class="sub-menu text-gray-500">
-                      <li>
-                        <router-link to="/login" @click="toggleMobileMenu">所有应用</router-link>
-                      </li>
-                      <li>
-                        <router-link to="/apps/custom" @click="toggleMobileMenu">客户列表</router-link>
-                      </li>
-                      <li>
-                        <router-link to="/apps/stock" @click="toggleMobileMenu">仓库列表</router-link>
-                      </li>
-                      <li>
-                        <router-link to="/apps/order" @click="toggleMobileMenu">订单列表</router-link>
-                      </li>
-                      <li>
-                        <router-link to="/apps/goods" @click="toggleMobileMenu">商品列表</router-link>
-                      </li>
-                    </ul>
-                  </vue-collapsible>
-                </li>
-              </ul>
-            </li> -->
             <li class="menu nav-item">
               <button
                 type="button"
@@ -153,15 +114,15 @@
               </button>
               <vue-collapsible :isOpen="activeDropdown === 'users'">
                 <ul class="sub-menu text-gray-500">
-                  <!-- <li>
-                    <router-link to="/setting/package" @click="toggleMobileMenu">{{ $t('package') }}</router-link>
-                  </li> -->
                   <li>
                     <router-link to="/setting/company" @click="toggleMobileMenu">{{ $t('company') }}</router-link>
                   </li>
                   <li>
                     <router-link to="/setting/roleManage" @click="toggleMobileMenu">{{ $t('roleManage') }}</router-link>
                   </li>
+                  <li>
+                    <router-link to="/setting/branch" @click="toggleMobileMenu">{{ $t('branch') }}</router-link>
+                  </li>
                 </ul>
               </vue-collapsible>
               <vue-collapsible :isOpen="activeDropdown === 'users'">
@@ -176,7 +137,7 @@
 </template>
 
 <script lang="ts" setup>
-import { ref, onMounted, computed } from 'vue';
+import { ref, onMounted, computed, defineComponent } from 'vue';
 import { useStore } from 'vuex';
 import VueCollapsible from 'vue-height-collapsible/vue3';
 
@@ -205,7 +166,7 @@ import IconMenuUsers from '@/components/icon/menu/icon-menu-users.vue';
 import IconMenuPages from '@/components/icon/menu/icon-menu-pages.vue';
 import IconMenuAuthentication from '@/components/icon/menu/icon-menu-authentication.vue';
 import IconMenuDocumentation from '@/components/icon/menu/icon-menu-documentation.vue';
-import SidebarItem from './SidebarItem.vue';
+import SidebarItem from '../sidebar/SidebarItem.vue';
 
 const store = useStore();
 const activeDropdown: any = ref('');
@@ -213,8 +174,8 @@ const subActive: any = ref('');
 const permissionRouters = computed(() => store.getters.permission_routers);
 const sidebar = computed(() => store.getters.sidebar);
 const siteInfo = computed(() => store.getters.siteInfo);
-
-console.log(permissionRouters);
+const superMenu = computed(() => store.state.superMenu);
+console.log("superMenu:",superMenu);
 const isCollapse = computed(() => !sidebar.value.opened);
 onMounted(() => {
   const selector = document.querySelector('.sidebar ul a[href="' + window.location.pathname + '"]');

+ 105 - 0
src/components/sidebar/SidebarItem.vue

@@ -0,0 +1,105 @@
+<template>
+    <div v-if="!item.hidden && item.children" class="menu-wrapper">
+      <router-link v-if="hasOneShowingChild(item.children, item) && !onlyOneChild.children && !item.alwaysShow"
+        :to="resolvePath(onlyOneChild.path)">
+        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
+          <svg-icon v-if="onlyOneChild.meta && onlyOneChild.meta.icon" :icon-class="onlyOneChild.meta.icon"></svg-icon>
+          <span>{{ onlyOneChild.meta.title }}</span>
+        </el-menu-item>
+      </router-link>
+      <el-sub-menu v-else :index="item.name || item.path">
+        <template #title>
+          <svg-icon v-if="item.meta && item.meta.icon" :icon-class="item.meta.icon"></svg-icon>
+          <el-tooltip v-if="item.meta && item.meta.title" effect="dark"
+            :content="item.meta.title" :disabled="item.meta.title.length < 6"
+            placement="right">
+            <span>{{ item.meta.title }}</span>
+          </el-tooltip>
+        </template>
+        <!-- v-if="!child.hidden" -->
+        <template v-for="child in item.children" >
+          <sidebar-item v-if="child.children && child.children.length > 0" :key="child.path" is-nest class="nest-menu"
+            :item="child" :base-path="resolvePath(child.path)" />
+          <router-link v-else :to="resolvePath(child.path)" :key="child.name">
+            <el-menu-item :index="resolvePath(child.path)">
+              <svg-icon v-if="child.meta && child.meta.icon" :icon-class="child.meta.icon"></svg-icon>
+              <el-tooltip v-if="child.meta && child.meta.title" effect="dark"
+                :content="child.meta.title" :disabled="child.meta.title.length < 6"
+                placement="right">
+                <span class="item-child">{{ child.meta.title }}</span>
+              </el-tooltip>
+            </el-menu-item>
+          </router-link>
+        </template>
+      </el-sub-menu>
+    </div>
+  </template>
+  
+  <script lang="ts">
+  import { defineComponent, ref } from 'vue'
+  
+  export default defineComponent({
+    name: 'SidebarItem',
+    props: {
+      item: {
+        type: Object,
+        required: true
+      },
+      isNest: {
+        type: Boolean,
+        default: false
+      },
+      basePath: {
+        type: String,
+        default: ''
+      }
+    },
+    setup(props) {
+      const onlyOneChild = ref(null)
+  
+      const hasOneShowingChild = (children, item) => {
+        const showingChildren = children.filter(child => {
+          if (child.hidden) {
+            return false
+          } else {
+            onlyOneChild.value = child
+            return true
+          }
+        })
+        if (showingChildren.length === 1) {
+          if (item.redirect === 'dashboard' || item.name === 'dashboard') {
+            return true
+          } else {
+            return false
+          }
+        }
+        return false
+      }
+  
+      const resolvePath = (...paths) => {
+        return paths.join('/')
+      }
+  
+      return {
+        onlyOneChild,
+        hasOneShowingChild,
+        resolvePath,
+      }
+    }
+  })
+  </script>
+  
+  <style scoped>
+  span {
+    overflow: hidden;
+    text-overflow: ellipsis;
+    -o-text-overflow: ellipsis;
+    white-space: nowrap;
+    width: calc(100% - 50px);
+    display: inline-block;
+  }
+  
+  .item-child {
+    width: 100% !important;
+  }
+  </style>

+ 39 - 0
src/components/sidebar/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <div>
+    <div class="logo-container" :class="[isCollapse && 'collapse']">
+      <img v-if="isCollapse" src="../../../../assets/img/zoomLogo.jpg" alt="" width="30px" height="30px" />
+      <template v-else>
+        <img :src="siteInfo.logo" alt="" height="60px" />
+      </template>
+    </div>
+    <el-scrollbar wrap-class="scrollbar-wrapper">
+      <el-menu mode="vertical" :default-active="$route.path" :collapse="isCollapse">
+        <sidebar-item v-for="route in permissionRouters" :key="route.name" :item="route" :base-path="route.path"></sidebar-item>
+      </el-menu>
+    </el-scrollbar>
+  </div>
+</template>
+  
+  <script lang="ts">
+import { defineComponent, computed } from 'vue';
+import { useStore } from 'vuex';
+import SidebarItem from './SidebarItem.vue';
+
+export default defineComponent({
+  components: { SidebarItem },
+  setup() {
+    const store = useStore();
+    const permissionRouters = computed(() => store.getters.permission_routers);
+    const sidebar = computed(() => store.getters.sidebar);
+    const siteInfo = computed(() => store.getters.siteInfo);
+    const isCollapse = computed(() => !sidebar.value.opened);
+
+    return {
+      permissionRouters,
+      sidebar,
+      siteInfo,
+      isCollapse,
+    };
+  },
+});
+</script>

+ 1 - 0
src/layouts/app-layout.vue

@@ -69,6 +69,7 @@
 </template>
 <script setup lang="ts">
 import { ref, onMounted } from 'vue';
+//import Sidebar from '@/components/sidebar/index.vue'
 import Sidebar from '@/components/layout/Sidebar.vue';
 import Header from '@/components/layout/Header.vue';
 import Footer from '@/components/layout/Footer.vue';

+ 3 - 1
src/locales/zh.json

@@ -9,11 +9,13 @@
     "setting":"系统管理",
     "company":"公司管理",
     "roleManage":"权限管理",
-    
+    "branch":"部门管理",
     "package":"套餐管理",
     "packageList":"套餐列表",
     "packagePermissions":"套餐权限",
 
+    
+
     "sales": "销售量",
     "analytics": "分析",
     "apps": "应用",

+ 2 - 0
src/main.ts

@@ -21,6 +21,8 @@ app.use(router);
 // main app css
 import '@/assets/css/app.css';
 
+/* sidebar */
+import '@/assets/css/sidebar.css';
 // perfect scrollbar
 import PerfectScrollbar from 'vue3-perfect-scrollbar';
 app.use(PerfectScrollbar);

+ 20 - 28
src/router/index.ts

@@ -1,4 +1,4 @@
-import { createRouter, createWebHistory, RouteRecordRaw, createWebHashHistory, Router } from 'vue-router';
+import { createRouter, createWebHistory, RouteRecordRaw, createWebHashHistory } from 'vue-router';
 import { useStore } from 'vuex';
 import appSetting from '@/app-setting';
 import HomeView from '../views/index.vue';
@@ -6,11 +6,13 @@ import HomeView from '../views/index.vue';
 const constantRouterMap: RouteRecordRaw[] = [
     { path: '/login', component: () => import('@/views/auth/boxed-signin.vue'), meta: { layout: 'auth' } },
 ];
+
 const router = createRouter({
     history: createWebHashHistory(),
     scrollBehavior: () => ({ y: 0 }),
     routes: constantRouterMap
-})
+});
+
 const asyncRouterMap: RouteRecordRaw[] = [
     {
         path: '/',
@@ -25,25 +27,23 @@ const asyncRouterMap: RouteRecordRaw[] = [
         redirect: '/stock',
         name: 'stock',
         children: [
-            { path: 'warehouseList', component: () => import('@/views/stock/warehouseList.vue'), name: 'warehouseList', meta: { title: 'warehouseList', layout: 'app' } },
-            { path: 'goodsLend', component: () => import('@/views/stock/goodsLend.vue'), name: 'goodsLend', meta: { title: 'goodsLend', layout: 'app' } },
-            { path: 'goodsTransfer', component: () => import('@/views/stock/goodsTransfer.vue'), name: 'goodsTransfer', meta: { title: 'goodsTransfer', layout: 'app' } },
-            { path: 'goodsExchange', component: () => import('@/views/stock/warehousing.vue'), name: 'goodsExchange', meta: { title: 'goodsExchange' } },
-            { path: 'goodsOutBound', component: () => import('@/views/stock/outbound.vue'), name: 'goodsOutBound', meta: { title: 'goodsOutBound' } },
+            { path: 'warehouseList', component: () => import('@/views/stock/warehouseList.vue'), name: 'warehouseList', meta: { title: 'warehouseList', layout: 'app' }, hidden: true },
+            { path: 'goodsLend', component: () => import('@/views/stock/goodsLend.vue'), name: 'goodsLend', meta: { title: 'goodsLend', layout: 'app' }, hidden: true },
+            { path: 'goodsTransfer', component: () => import('@/views/stock/goodsTransfer.vue'), name: 'goodsTransfer', meta: { title: 'goodsTransfer', layout: 'app' }, hidden: true },
+            { path: 'goodsExchange', component: () => import('@/views/stock/warehousing.vue'), name: 'goodsExchange', meta: { title: 'goodsExchange' }, hidden: true },
+            { path: 'goodsOutBound', component: () => import('@/views/stock/outbound.vue'), name: 'goodsOutBound', meta: { title: 'goodsOutBound' }, hidden: true },
         ]
-    }, 
-    // 系统管理
+    },
     {
         path: '/package',
         redirect: '/package',
         name: 'package',
         children: [
-            { path: 'packageList', component: () => import('@/views/package/packageList.vue'), name: 'packageList', meta: { title: 'packageList',layout: 'app' } },
-            { path: 'packagePermissions', component: () => import('@/views/package/packagePermissions.vue'), name: 'packagePermissions', meta: { title: 'packagePermissions',layout: 'app' } },
-            { path: 'packageAdd', component: () => import('@/views/package/packageAdd.vue'), name: 'packageAdd', meta: { title: 'packageAdd',layout: 'app' } },
+            { path: 'packageList', component: () => import('@/views/package/packageList.vue'), name: 'packageList', meta: { title: 'packageList', layout: 'app' } },
+            { path: 'packagePermissions', component: () => import('@/views/package/packagePermissions.vue'), name: 'packagePermissions', meta: { title: 'packagePermissions', layout: 'app' } },
+            { path: 'packageAdd', component: () => import('@/views/package/packageAdd.vue'), name: 'packageAdd', meta: { title: 'packageAdd', layout: 'app' } },
         ]
     },
-    // 系统管理
     {
         path: '/setting',
         redirect: '/setting',
@@ -53,25 +53,17 @@ const asyncRouterMap: RouteRecordRaw[] = [
             icon: 'setting-manage'
         },
         children: [
-            { path: 'company', component: () => import('@/views/setting/company.vue'), name: 'company', meta: { title: 'company',layout: 'app' } },
-            { path: 'roleManage', component: () => import('@/views/setting/roleManage.vue'), name: 'roleManage', meta: { title: 'roleManage',layout: 'app' } },
-            { path: 'roleManageAdd', component: () => import('@/views/setting/roleManageAdd.vue'), name: 'roleManageAdd', meta: { title: 'roleManageAdd',layout: 'app' } },
+            { path: 'company', component: () => import('@/views/setting/company.vue'), name: 'company', meta: { title: 'company', layout: 'app' } },
+            { path: 'roleManage', component: () => import('@/views/setting/roleManage.vue'), name: 'roleManage', meta: { title: 'roleManage', layout: 'app' }, hidden: true },
+            { path: 'roleManageAdd', component: () => import('@/views/setting/roleManageAdd.vue'), name: 'roleManageAdd', meta: { title: 'roleManageAdd', layout: 'app' }, hidden: true },
+            { path: 'branch', component: () => import('@/views/setting/branch.vue'), name: 'branch', meta: { title: 'branch', layout: 'app' }, hidden: true },
         ]
     },
-]
+];
+
 asyncRouterMap.forEach(route => {
     router.addRoute(route);
 });
-/* router.beforeEach((to, from, next) => {package
-    const store = useStore();
-    //判断当前页面是否带有侧边栏及顶部
-    if (to?.meta?.layout == 'auth') {
-        store.dispatch("setMainLayout",'auth');
-    } else {
-        store.dispatch("setMainLayout",'app');
-    }
-    next(true);
-}); */
 
 export { constantRouterMap, asyncRouterMap };
-export default router;
+export default router;

+ 14 - 2
src/stores/index.ts

@@ -147,6 +147,7 @@ export interface State {
     languageList: Array<{ code: string; name: string }>;
     isShowMainLoader: boolean;
     semidark: boolean;
+    superMenu:string
 }
 
 // 创建 store
@@ -173,7 +174,8 @@ const store = createStore<State>({
             { code: 'en', name: 'English' },
         ],
         isShowMainLoader: true,
-        semidark: false
+        semidark: false,
+        superMenu:'super'
 
     },
     mutations: {
@@ -220,6 +222,14 @@ const store = createStore<State>({
             localStorage.setItem('semidark', payload);
             state.semidark = payload;
         },
+        /* 菜单控制 */
+        toggleSuperMenu(state,payload) {
+            payload = payload || state.superMenu;
+            localStorage.setItem('superMenu', payload);
+            state.superMenu = payload;
+        },
+
+
         toggleLocale(state, payload) {
             payload = payload || state.locale;
             i18n.global.locale.value = payload;
@@ -234,7 +244,6 @@ const store = createStore<State>({
         },
         toggleSidebar(state) {
             state.sidebar = !state.sidebar;
-            console.log(state);
         },
         toggleMainLoader(state) {
             state.isShowMainLoader = true;
@@ -268,6 +277,9 @@ const store = createStore<State>({
         toggleSemidark({ commit }, payload) {
             commit('toggleSemidark', payload);
         },
+        toggleSuperMenu({ commit }, payload) {
+            commit('toggleSuperMenu', payload);
+        },
         toggleLocale({ commit }, payload) {
             commit('toggleLocale', payload);
         },

+ 31 - 9
src/views/auth/boxed-signin.vue

@@ -53,15 +53,21 @@
                         </form> -->
             <!-- <el-button @click="goHome">测试</el-button> -->
             <el-form :model="loginForm" :rules="loginRules" ref="loginFormRef" class="login-input" label-width="120px">
-              <el-form-item label="公司名称:" prop="company_name">
-                <el-input v-model="loginForm.company_name" :placeholder="$t('company_name')" autofocus clearable>
+              <el-form-item label="登录类型:" prop="type">
+                 <el-select v-model="loginForm.type"  :placeholder="$t('company_name')" style="width: 240px" >
+                  <el-option  label="公司登录" value="com" />
+                  <el-option  label="平台登录" value="sys" />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="公司名称:" prop="company_id" v-if="loginForm.type=='com'">
+               <!--  <el-input v-model="loginForm.company_name" :placeholder="$t('company_name')" autofocus clearable>
                   <template v-slot:prefix>
                     <svg-icon class="el-input__icon" icon-class="user" />
                   </template>
-                </el-input>
-                <!--  <el-select v-model="loginForm.company_name" filterable :placeholder="$t('company_name')" style="width: 240px">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select> -->
+                </el-input> -->
+                 <el-select v-model="loginForm.company_id" filterable :placeholder="$t('company_name')" style="width: 240px" @input="getInput" @change="getCompany">
+                  <el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
+                </el-select>
               </el-form-item>
               <el-form-item label="账号:" prop="username">
                 <el-input v-model="loginForm.username" :placeholder="$t('username')" autofocus clearable>
@@ -143,14 +149,15 @@ const loginForm = reactive({
   password: '',
   scene: 'LOGIN',
   validcode: '',
-  company_name: '',
+  company_id: '',
+  type:'com'
 });
 const { t } = useI18n();
 const loginRules = reactive({
   username: [{ required: true, message: t('val_username'), trigger: 'blur' }],
   password: [{ required: true, message: t('val_password'), trigger: 'blur' }],
   validcode: [{ required: true, message: t('val_validcode'), trigger: 'blur' }],
-  company_name: [{ required: true, message: t('company_name'), trigger: 'blur' }],
+  company_id: [{ required: true, message: t('company_name'), trigger: 'blur' }],
 });
 // 验证信息
 const validateInFO: any = ref({});
@@ -176,7 +183,6 @@ const route = useRoute();
 const store = useStore();
 // multi language
 const i18n = reactive(useI18n());
-console.log(i18n);
 const changeLanguage = (item: any) => {
   i18n.locale = item.code;
   appSetting.toggleLanguage(item);
@@ -185,7 +191,22 @@ const currentFlag = computed(() => {
   return `/assets/images/flags/${i18n.locale.toUpperCase()}.svg`;
 });
 
+/* 查询公司 */
+const getCompany=(value:any)=>{
+
+}
+const getInput=(val)=>{
+  searchText=val.data
+}
+let searchText=ref('')
+const companyList=()=>{
+  API_common.getCompany(searchText.value).then(res=>{
+    options.value=res
+  })
+}
+
 onMounted(() => {
+  companyList()
   const uuids = Storage.getItem('admin_uuid');
   if (uuids) {
     uuid = uuids;
@@ -205,6 +226,7 @@ onMounted(() => {
       accountAfsSuccess.value = true;
     }
   });
+ // companyList()
 });
 
 /** 阿里云滑动验证 通过后的回调函数 **/

+ 2 - 2
src/views/package/packageList.vue

@@ -115,7 +115,7 @@ import { ref, onMounted, reactive } from 'vue';
 import { useStore } from 'vuex';
 import { ElMessageBox, FormInstance, ElMessage } from 'element-plus';
 import * as API_BasicSetting from '@/api/basicSetting';
-import * as API_Setting from '@/api/setting';
+import * as API_Auth from '@/api/auth';
 import * as API_Package from '@/api/package';
 import Storage from '@/utils/storage';
 import router from '@/router';
@@ -238,7 +238,7 @@ const GET_PackageList = () => {
 };
 /* 获取权限列表 */
 const GET_RoleList = () => {
-  API_Setting.getRoles({ page_no: 1, page_size: 10000 }).then((res) => {
+  API_Auth.getPackageRoleList({ page_no: 1, page_size: 10000 }).then((res) => {
     roleArray.value = res.data;
   });
 };

+ 1 - 1
src/views/package/packagePermissions.vue

@@ -96,7 +96,7 @@
   
   const GET_RoleList = () => {
     loading.value = true;
-    API_Auth.getRoleList(params.value)
+    API_Auth.getPackageRoleList(params.value)
       .then((response) => {
         loading.value = false;
         tableData.value = response;

+ 23 - 1
src/views/setting/branch.vue

@@ -123,9 +123,31 @@
     });
   };
   
+    /* 处理树形数据 */
+    let buildTree = function buildTree(list, parent_id) {
+    const tree = [];
+    for (let i = 0; i < list.length; i++) {
+      if (list[i].parent_id === parent_id) {
+        const node = {
+          id: list[i].id,
+          parent_id: list[i].parent_id,
+          name: list[i].name,
+          create_time: list[i].create_time,
+          remark: list[i].remark,
+          sn: list[i].sn,
+          sort: list[i].sort,
+          type: list[i].type,
+          region_ids: list[i].region_ids,
+          children: buildTree(list, list[i].id),
+        };
+        tree.push(node);
+      }
+    }
+    return tree;
+  };
   const GET_DeptList = () => {
     API_Setting.getDeptList().then(response => {
-      //deptList.value = Foundation.buildTree(response, '0');
+      deptList.value = buildTree(response, '0');
     });
   };
   

+ 8 - 0
src/views/setting/company.vue

@@ -26,6 +26,7 @@
 
         <el-table-column label="操作">
           <template #default="scope">
+            <el-button size="mini" v-if="checkPermission(['warehouse:update'])" @click="getBranch('super')">查看</el-button>
             <el-button size="mini" v-if="checkPermission(['warehouse:update'])" @click="handleEditWarehouse(scope.$index, scope.row)">编辑</el-button>
             <el-button size="mini" v-if="checkPermission(['warehouse:update'])" @click="handleRenew(scope.$index, scope.row)">续费</el-button>
           </template>
@@ -376,6 +377,13 @@ const adminName = (val: string[]) => {
   }
   return text;
 };
+
+/* 切换菜单 */
+
+const getBranch=(value)=>{
+  store.dispatch('toggleSuperMenu',value);
+}
+
 onMounted(() => {
   GET_CompanyList();
   GET_MarketingList();

+ 7 - 6
src/views/setting/roleManageAdd.vue

@@ -1,6 +1,6 @@
 <template>
     <div class="permission-container">
-      <el-form :model="permissionForm" :rules="permissionRules" ref="permissionForm" label-width="200px" class="demo-ruleForm">
+      <el-form :model="permissionForm" :rules="permissionRules" ref="permissionFormRef" label-width="200px" class="demo-ruleForm">
         <el-form-item label="角色名称" prop="role_name">
           <el-input v-model="permissionForm.role_name"></el-input>
         </el-form-item>
@@ -118,13 +118,14 @@
   };
   
   const checked = ref(true);
-  const deptList = ref([]);
+  const deptList = ref<any>([]);
   const oneDimensionalList = ref([]); // 源数据平铺成一级节点
   
   /** 权限 表单 */
   const permissionForm = reactive({
     data_scope: 'ALL',
     role_name: '',
+    dept_ids:"",
     role_describe: '',
   });
   
@@ -319,8 +320,9 @@
   };
   
   /** 保存角色权限 */
+  const permissionFormRef = ref();
   const saveRolePermission = () => {
-    permissionForm.validate((valid) => {
+    permissionFormRef.value.validate((valid) => {
       if (valid) {
         let params = {
           ...permissionForm,
@@ -342,9 +344,9 @@
         }
         const saveSuccess = () => {
           ElMessage.success('保存成功!');
-          router.push({ name: 'RoleList' });
+          router.push({ name: 'roleManage' });
         };
-        role_id.value === 0 ? API_Auth.addRole(params).then(() => saveSuccess()) : API_Auth.editRole(role_id.value, params).then(() => saveSuccess());
+        role_id.value === "0" ? API_Auth.addRole(params).then(() => saveSuccess()) : API_Auth.editRole(role_id.value, params).then(() => saveSuccess());
       } else {
         ElMessage.error('表单填写有误,请检查!');
         return false;
@@ -356,7 +358,6 @@
   const GET_RolePermission = () => {
     API_Menus.getMenusChildren().then((res) => {
       if (role_id.value !== '0') {
-        console.log(role_id.value !== 0);
         API_Auth.getRolePermission(role_id.value).then((response) => {
           role_id.value = response.role_id;
           permissionForm.data_scope = response.data_scope;