Browse Source

项目管理模块接口完成

hzj18279462576@163.com 1 year ago
parent
commit
d8b15b51ee

+ 6 - 0
package-lock.json

@@ -24,6 +24,7 @@
         "hls.js": "^1.3.4",
         "jsencrypt": "^3.3.1",
         "lodash": "^4.17.21",
+        "nprogress": "^0.2.0",
         "qrcode.vue": "^3.4.1",
         "sass": "^1.58.0",
         "sass-loader": "^13.2.0",
@@ -3916,6 +3917,11 @@
       "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
       "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
     },
+    "node_modules/nprogress": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz",
+      "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz",

+ 1 - 0
package.json

@@ -25,6 +25,7 @@
     "hls.js": "^1.3.4",
     "jsencrypt": "^3.3.1",
     "lodash": "^4.17.21",
+    "nprogress": "^0.2.0",
     "qrcode.vue": "^3.4.1",
     "sass": "^1.58.0",
     "sass-loader": "^13.2.0",

File diff suppressed because it is too large
+ 1 - 0
src/assets/svgIcon/homePage.svg


+ 100 - 9
src/layout/sidebar/SidevarItem.vue

@@ -11,10 +11,16 @@
       <!-- :default-openeds="[34]" -->
       <div class="logo el-menu-item">
         <el-icon :size="20"
-          ><img src="@/assets/images/logo.png" style="width: 40px; height: 40px"
+          ><img
+            src="@/assets/images/logo.png"
+            style="width: 40px; height: 40px"
         /></el-icon>
       </div>
-      <el-menu-item :index="`/process/${item.name}`" v-for="item in roleList" :key="item.name">
+      <el-menu-item
+        :index="`/process/${item.name}`"
+        v-for="item in roleList"
+        :key="item.name"
+      >
         <div class="itemSon">
           <SvgIcon :icon="item.meta.icon" :size="22" />
           <span>{{ item.meta.title }}</span>
@@ -25,18 +31,21 @@
 </template>
 
 <script setup>
-import { ref, onBeforeMount, onMounted, watch, reactive } from "vue";
+import { ref, onBeforeMount, onMounted, watch, reactive, nextTick } from "vue";
+import axios from "axios";
 import { useStore } from "vuex";
-
 import { useRouter } from "vue-router";
+import { genFileId, ElMessage, ElMessageBox } from "element-plus";
 
 const store = useStore();
 const router = useRouter();
-const roleList = ref();
+const roleList = ref();// 菜单权限
+const btnList=ref() //按钮权限
 
 const menuClose = ref(false);
-const activeIndex = ref('/process/user');
+const activeIndex = ref("");
 const acitveItems = reactive({ list: [] });
+const api = ref();
 
 watch(
   () => store.state.user.collapse,
@@ -64,15 +73,97 @@ const handleSelect = (key, keyPath) => {
 
   activeIndex.value = key;
   store.commit("indexUp", key);
+  sessionStorage.setItem("sidevarItem", key);
   // if (activeIndex.value == 1) {
   //   router.push({
   //     path: `/jianguanCloud/order`,
   //   });
   // }
 };
+const roleChange = async () => {
+  nextTick(async () => {
+    let res = await axios({
+      method: "post",
+      url: api.value + "/api/sysUser/queryOwn",
+      headers: {
+        tokenP: sessionStorage.getItem("tokenP"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+    });
+    console.log(res, "获取个人信息");
+    if (res.data.code == 200) {
+      sessionStorage.setItem('id',res.data.data.id)
+      sessionStorage.setItem('userName',res.data.data.userName)
+      let data = new FormData();
+      data.append("roleId", res.data.data.roleId);
+      let role = await axios({
+        method: "post",
+        url: api.value + "/api/sysRole/queryMenuByRole",
+        headers: {
+          tokenP: sessionStorage.getItem("tokenP"),
+          user_head: sessionStorage.getItem("userhead"),
+        },
+        data: data,
+      });
+      console.log(role, "查询角色菜单权限");
+      if (role.data.code == 200) {
+        roleList.value = [];// 菜单权限
+        btnList.value=[]
+        let resdata=role.data.data
+        resdata=resdata.filter(i=>{
+          return i.state==1
+        })
+        resdata.forEach((item) => {
+          // let modules = import.meta.glob("../views/**/*.vue");
+          if (item.state == 1) {
+            let arr = {
+              path: item.url,
+              name: item.url,
+              meta: { title: item.menuName, icon: item.url },
+              component: () =>
+                import(`../../views/${item.url}/${item.url}.vue`),
+            };
+            // state[0].roleList.children.push(arr);
+            roleList.value.push(arr);
+          }
+          if(item.menuLists){
+            item.menuLists.forEach(i=>{
+            if(i.state==1){
+              btnList.value.push(i.url)
+            }
+          })
+          }
+        });
+        sessionStorage.setItem("roleList", JSON.stringify(resdata));
+        sessionStorage.setItem("btnList", JSON.stringify(btnList.value));
+        let roles = JSON.parse(sessionStorage.getItem("roleList"));
+        if (roles) {
+          store.commit("ROLELIST", "");
+        }
+      } else {
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: role.data.message,
+          center: true,
+        });
+      }
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: res.data.message,
+        center: true,
+      });
+    }
+  });
+};
 onBeforeMount(() => {
+  api.value = store.state.user.api;
+  roleChange();
   activeIndex.value = sessionStorage.getItem("sidevarItem");
-  roleList.value = store.state.user.roleList;
+  // roleList.value = sessionStorage.getItem("roleList");
+  // roleList.value = store.state.user.roleList;
 });
 </script>
 
@@ -118,8 +209,8 @@ onBeforeMount(() => {
     //   rgba(38, 151, 255, 1) 0%,
     //   rgba(102, 182, 255, 1) 100%
     // );
-    .svg-icon{
-      margin:0 15px;
+    .svg-icon {
+      margin: 0 15px;
     }
   }
   .el-sub-menu {

+ 10 - 0
src/main.js

@@ -22,6 +22,16 @@ for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
   app.component(key, component);
 }
 
+app.config.globalProperties.$filters = {
+  btnFlag(val) {
+    let btnList=JSON.parse(sessionStorage.getItem('btnList'))
+    let flag=btnList.some(i=>{
+      return i==val
+    })
+    return flag
+  },
+}
+
 app.use(ElementPlus, {
   locale: zhCn,
 });

+ 89 - 71
src/router/index.js

@@ -5,16 +5,23 @@ import {
 } from "vue-router";
 import Layout from "@/layout/index.vue";
 import store from "@/store";
-
+import NProgress from "nprogress";
+import "nprogress/nprogress.css";
 import { ElMessage, ElMessageBox } from "element-plus";
 const routes = [
+  // {
+  //   path: "/login",
+  //   component: () => import("@/views/login/index.vue"),
+  // },
+  // {
+  //   path: "/",
+  //   redirect: "/login",
+  // },
   {
-    path: "/login",
-    component: () => import("@/views/login/index.vue"),
-  },
-  {
-    path: "/",
-    redirect: "/login",
+    path: "/process/error",
+    name: "error",
+    component: () => import("@/views/error/error.vue"),
+    meta: { title: "无权限页面", icon: "error" },
   },
   {
     path: "/process",
@@ -24,78 +31,89 @@ const routes = [
       {
         path: "home",
         name: "home",
-        component: () => import("@/views/home/home.vue"),
-        meta: { title: "首页", icon: "home" },
-      },
-      {
-        path: "project",
-        name: "project",
-        component: () => import("@/views/project/project.vue"),
-        meta: { title: "项目管理", icon: "project" },
-      },
-      {
-        path: "role",
-        name: "role",
-        component: () => import("@/views/role/role.vue"),
-        meta: { title: "角色管理", icon: "role" },
-      },
-      {
-        path: "menu",
-        name: "menu",
-        component: () => import("@/views/menu/menu.vue"),
-        meta: { title: "菜单管理", icon: "menu" },
-      },
-      {
-        path: "user",
-        name: "user",
-        component: () => import("@/views/user/user.vue"),
-        meta: { title: "用户管理", icon: "user" },
+        component: () => import("@/views/homePage/home.vue"),
+        meta: { title: "获取token页面", icon: "home" },
       },
-      {
-        path: "system",
-        name: "system",
-        component: () => import("@/views/system/system.vue"),
-        meta: { title: "系统管理", icon: "system" },
-      },
-     
+      // {
+      //   path: "homePage",
+      //   name: "homePage",
+      //   component: () => import("@/views/homePage/homePage.vue"),
+      //   meta: { title: "首页", icon: "homePage" },
+      // },
+      // {
+      //   path: "project",
+      //   name: "project",
+      //   component: () => import("@/views/project/project.vue"),
+      //   meta: { title: "项目管理", icon: "project" },
+      // },
+      // {
+      //   path: "role",
+      //   name: "role",
+      //   component: () => import("@/views/role/role.vue"),
+      //   meta: { title: "角色管理", icon: "role" },
+      // },
+      // {
+      //   path: "menu",
+      //   name: "menu",
+      //   component: () => import("@/views/menu/menu.vue"),
+      //   meta: { title: "菜单管理", icon: "menu" },
+      // },
+      // {
+      //   path: "user",
+      //   name: "user",
+      //   component: () => import("@/views/user/user.vue"),
+      //   meta: { title: "用户管理", icon: "user" },
+      // },
+      // {
+      //   path: "system",
+      //   name: "system",
+      //   component: () => import("@/views/system/system.vue"),
+      //   meta: { title: "系统管理", icon: "system" },
+      // },
     ],
   },
-  {
-    path: "/process/error",
-    name: "error",
-    component: () => import("@/views/error/error.vue"),
-    meta: { title: "无权限页面", icon: "error" },
-  },
 ];
 
 const router = createRouter({
-  history: createWebHashHistory("/jgcloudManage"), // 发布地址
+  history: createWebHashHistory("/kpi"), // 发布地址
   routes: routes,
 });
-export default router;
+
 router.beforeEach(async (to, from, next) => {
-  const token = sessionStorage.setItem("tokenP",'VEdULTMxNTkyMy0xY08yOVRRRVlmYWN5b3dNSmt0RXM3a1l1UGNlSDdlckNRZGp5aERubmhVd2hFWHdKYi16ZnNvZnQuY29tIzEz');
-  const userhead = sessionStorage.getItem("userhead");
+  NProgress.start(); // 进度条开始
+
+  // const token = sessionStorage.setItem(
+  //   "tokenP",
+  //   "VEdULTMxNzUxNC1saG13TGdUNmFsWXl1aWpFNGU0c0xKTlJheGRiRjdzRDFNa2hESzJiemxaZGRIM05XWi16ZnNvZnQuY29tIzEz"
+  // );
   let hasRoutes = store.state.user.hasRoutes;
-  next()
-  // if (token && userhead) {
-  //   // next();
-  //   if (!hasRoutes) {
-  //     console.log("第一次登录也触发");
-  //     store.commit("SET_ROUTES_STATE", true);
-  //     store.commit("ROLELIST", "");
-  //     next({ ...to, replace: true });
-  //     // next({ path: "/index" });
-  //     // next({ ...to });
-  //   } else {
-  //     console.log("没刷新页面跳转");
-  //   }
-  //   next();
-  // } else {
-  //   if (to.path == "/login") {
-  //     next();
-  //   } else {
-  //     next(`/login`);
-  //   }
-  // }
+  // console.log(hasRoutes, "hasRoutes");
+
+  if (to.path == "/process/home") {
+    next();
+  } else {
+    if (sessionStorage.getItem("tokenP")) {
+      if (!hasRoutes) {
+        store.commit("SET_ROUTES_STATE", true);
+        store.commit("ROLELIST", "");
+        // console.log("当前有权限信息");
+        next({ ...to, replace: true });
+      } else {
+        // console.log("当前无权限信息");
+        next();
+      }
+    } else {
+      if (to.path == "/process/error") {
+        next();
+      } else {
+        next(`/process/error`);
+      }
+    }
+  }
 });
+
+router.afterEach(() => {
+  NProgress.done(); // 进度条结束
+});
+
+export default router;

+ 109 - 64
src/store/modules/user.js

@@ -1,6 +1,7 @@
 import axios from "axios";
 import router from "@/router";
 import Layout from "@/layout/index.vue";
+import { genFileId, ElMessage, ElMessageBox } from "element-plus";
 
 // 声明变量
 const state = {
@@ -11,46 +12,44 @@ const state = {
   api: "/kpi/template", // 线上
   // api: "/jgcloudApi/jgcloud/api", // 测试
   roleList: [
-    {
-      path: "home",
-      name: "home",
-      component: () => import("@/views/home/home.vue"),
-      meta: { title: "首页", icon: "home" },
-    },
-    {
-      path: "project",
-      name: "project",
-      component: () => import("@/views/project/project.vue"),
-      meta: { title: "项目管理", icon: "project" },
-    },
-    {
-      path: "role",
-      name: "role",
-      component: () => import("@/views/role/role.vue"),
-      meta: { title: "角色管理", icon: "role" },
-    },
-    {
-      path: "menu",
-      name: "menu",
-      component: () => import("@/views/menu/menu.vue"),
-      meta: { title: "菜单管理", icon: "menu" },
-    },
-    {
-      path: "user",
-      name: "user",
-      component: () => import("@/views/user/user.vue"),
-      meta: { title: "用户管理", icon: "user" },
-    },
-    {
-      path: "system",
-      name: "system",
-      component: () => import("@/views/system/system.vue"),
-      meta: { title: "系统管理", icon: "system" },
-    },
-  ],
-  roles: [
-    
+    // {
+    //   path: "homePage",
+    //   name: "homePage",
+    //   component: () => import("@/views/home/homePage.vue"),
+    //   meta: { title: "首页", icon: "homePage" },
+    // },
+    // {
+    //   path: "project",
+    //   name: "project",
+    //   component: () => import("@/views/project/project.vue"),
+    //   meta: { title: "项目管理", icon: "project" },
+    // },
+    // {
+    //   path: "role",
+    //   name: "role",
+    //   component: () => import("@/views/role/role.vue"),
+    //   meta: { title: "角色管理", icon: "role" },
+    // },
+    // {
+    //   path: "menu",
+    //   name: "menu",
+    //   component: () => import("@/views/menu/menu.vue"),
+    //   meta: { title: "菜单管理", icon: "menu" },
+    // },
+    // {
+    //   path: "user",
+    //   name: "user",
+    //   component: () => import("@/views/user/user.vue"),
+    //   meta: { title: "用户管理", icon: "user" },
+    // },
+    // {
+    //   path: "system",
+    //   name: "system",
+    //   component: () => import("@/views/system/system.vue"),
+    //   meta: { title: "系统管理", icon: "system" },
+    // },
   ],
+  roles: [],
   hasRoutes: false,
 };
 
@@ -86,35 +85,81 @@ const mutations = {
   passWord: (state, value) => {
     state.password = value;
   },
-  ROLELIST: (state, value) => {
-    const roleId = sessionStorage.getItem("roleId");
-    console.log(roleId);
-
-    if (roleId) {
-      state.roles.forEach((item) => {
-        if (item.roles == roleId) {
-          let modules = import.meta.glob("../views/**/*.vue");
-          router.addRoute({
-            path: "/jianguanCloud",
-            name: "jianguanCloud",
-            // component: modules[`../views/${item.name}/${item.name}.vue`],
-            component: Layout,
-            children: [],
+  ROLELIST: async (state, value) => {
+    let roleList = JSON.parse(sessionStorage.getItem("roleList"));
+    console.log(roleList, "roleList");
+    if (roleList) {
+      // let roleList = {
+      //   path: "homePage",
+      //   name: "homePage",
+      //   component: () => import("@/views/home/homePage.vue"),
+      //   meta: { title: "首页", icon: "homePage" },
+      // };
+      router.addRoute({
+        path: "/process",
+        name: "process",
+        // component: modules[`../views/${item.name}/${item.name}.vue`],
+        component: Layout,
+        children: [
+          {
+            path: "home",
+            name: "home",
+            component: () => import("@/views/homePage/home.vue"),
+            meta: { title: "获取token页面", icon: "home" },
+          },
+        ],
+      });
+      roleList.forEach((item) => {
+        let arr = {
+          path: item.url,
+          name: item.url,
+          meta: { title: item.menuName, icon: item.url },
+          component: () => import(`../../views/${item.url}/${item.url}.vue`),
+        };
+        router.addRoute("process", arr);
+      });
+      if (roleList) {
+        if(sessionStorage.getItem('sidevarItem')){
+          router.push({
+            path: `${sessionStorage.getItem('sidevarItem')}`,
           });
-          item.list.forEach((item) => {
-            let arr = {
-              path: item.name,
-              name: item.name,
-              // component: modules[`../views/${item.name}/${item.name}.vue`],
-              component: () =>
-                import(`../../views/${item.name}/${item.name}.vue`),
-            };
-            // state[0].roleList.children.push(arr);
-            router.addRoute("jianguanCloud", arr);
+        }else{
+          sessionStorage.setItem('sidevarItem',`/process/${roleList[0].url}`)
+          router.push({
+            path: `/process/${roleList[0].url}`,
           });
         }
-      });
+      }
     }
+
+    // const roleId = sessionStorage.getItem("roleId");
+    // console.log(roleId);
+
+    // if (roleId) {
+    //   state.roles.forEach((item) => {
+    //     if (item.roles == roleId) {
+    //       // let modules = import.meta.glob("../views/**/*.vue");
+    //       // router.addRoute({
+    //       //   path: "/jianguanCloud",
+    //       //   name: "jianguanCloud",
+    //       //   // component: modules[`../views/${item.name}/${item.name}.vue`],
+    //       //   component: Layout,
+    //       //   children: [],
+    //       // });
+    //       // item.list.forEach((item) => {
+    //       //   let arr = {
+    //       //     path: item.name,
+    //       //     name: item.name,
+    //       //     // component: modules[`../views/${item.name}/${item.name}.vue`],
+    //       //     component: () =>
+    //       //       import(`../../views/${item.name}/${item.name}.vue`),
+    //       //   };
+    //       //   // state[0].roleList.children.push(arr);
+    //       //   router.addRoute("jianguanCloud", arr);
+    //       // });
+    //     }
+    //   });
+    // }
   },
 };
 // mutations的值由actions传入(异步)

+ 2 - 2
src/views/error/error.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="content-box">
     <div class="noRole">
-        <span>无权限访问</span>
+      <span>无权限访问</span>
       <img src="../../assets/images/noRole.png" alt="" />
     </div>
   </div>
@@ -111,7 +111,7 @@ onUnmounted(() => {
     align-items: center;
     justify-content: center;
   }
-  span{
+  span {
     font-size: 28px;
     font-weight: 800;
     color: rgb(191, 212, 250);

+ 61 - 0
src/views/homePage/home.vue

@@ -0,0 +1,61 @@
+<template>
+  <div class="content-box"></div>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  nextTick,
+  onMounted,
+  watch,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import COS from "cos-js-sdk-v5";
+import { useRouter } from "vue-router";
+import { genFileId, ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import { dayjs } from "element-plus";
+import lodash, { reduce } from "lodash";
+import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const router = useRouter();
+
+const api = ref();
+onMounted(() => {
+  api.value = store.state.user.api;
+  if (router.currentRoute.value.query.token) {
+    let tokenP = router.currentRoute.value.query.token;
+    sessionStorage.setItem("tokenP", tokenP);
+    // let roleList = JSON.parse(sessionStorage.getItem("roleList"));
+    // if (roleList) {
+    //   router.push({
+    //     path: `/process/${roleList[0].url}`,
+    //   });
+    // }
+  } else {
+    router.push({
+      path: `/process/error`,
+    });
+  }
+});
+onUnmounted(() => {
+  // document.removeEventListener("keyup", Enters);
+});
+</script>
+
+<style scoped lang="scss">
+.content-box {
+  min-width: 1050px;
+  width: calc(100vw - 260px);
+  height: calc(100vh - 105px);
+  margin: 20px auto;
+  background-color: #fff;
+  // color: #fff;
+  display: flex;
+  flex-direction: column;
+  box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
+}
+</style>

File diff suppressed because it is too large
+ 2811 - 0
src/views/homePage/homePage copy.vue


File diff suppressed because it is too large
+ 2830 - 0
src/views/homePage/homePage.vue


+ 1 - 1
src/views/menu/menu.vue

@@ -98,7 +98,7 @@
         >
           <el-table-column prop="menuName" label="名称" />
           <el-table-column prop="sort" label="排序号" />
-          <el-table-column prop="url" label="菜单URL" />
+          <el-table-column prop="url" label="标识" />
           <el-table-column align="center" label="操作" width="220">
             <template #default="scope">
               <div class="options">

File diff suppressed because it is too large
+ 691 - 117
src/views/project/project.vue


+ 356 - 134
src/views/role/role.vue

@@ -10,7 +10,7 @@
           <span>角色名称 </span>
           <el-input
             clearable
-            v-model="searchInput.pname"
+            v-model="searchInput.roleName"
             @clear="searchBtn"
             class="w-50 m-2"
             placeholder="请输入角色名称"
@@ -41,21 +41,21 @@
           @click="searchBtn"
           >查询</el-button
         >
-        <el-button
+        <!-- <el-button
           style="margin-left: 20px"
           class="reset"
           @click="resetSearchBtn"
           >重置</el-button
-        >
+        > -->
       </div>
       <!-- 按钮列表 -->
       <div class="gongneng">
-        <el-button @click="addProjectbtn" class="add"
+        <el-button @click="addProjectbtn(1)" class="add"
           ><el-icon> <CirclePlus /> </el-icon><span>创建角色</span></el-button
         >
-        <el-button @click="projectImportBtn" class="imp"
+        <!-- <el-button @click="projectImportBtn" class="imp"
           ><el-icon><Upload /></el-icon><span>批量导入</span></el-button
-        >
+        > -->
         <!-- <el-button @click="projectExportBtn" class="add"
           ><el-icon><Download /></el-icon><span>项目导出</span></el-button
         > -->
@@ -81,14 +81,16 @@
             label="序号"
             width="80"
           />
-          <el-table-column align="center" prop="roleLevel" label="角色级别" />
-          <el-table-column align="center" prop="pname" label="父级角色" />
+          <!-- <el-table-column align="center" prop="roleLevel" label="角色级别" /> -->
+          <!-- <el-table-column align="center" prop="pname" label="父级角色" /> -->
           <el-table-column align="center" prop="roleName" label="角色名称" />
           <el-table-column align="center" prop="createTime" label="创建时间" />
           <el-table-column align="center" label="操作" width="220">
             <template #default="scope">
               <div class="options">
-                <div class="reset" @click="reset(scope.row)">添加</div>
+                <!-- <div class="reset" @click="addProjectbtn(2, scope.row)">
+                  添加
+                </div> -->
                 <div class="look" @click="edit(scope.row)">编辑</div>
                 <el-popconfirm
                   width="220"
@@ -96,8 +98,8 @@
                   cancel-button-text="取消"
                   :icon="InfoFilled"
                   icon-color="#f89626"
-                  title="是否删除此数据?"
-                  @confirm="del(scope.row)"
+                  title="是否删除此角色?"
+                  @confirm="delRoles(scope.row)"
                   @cancel="cancelEvent"
                 >
                   <template #reference>
@@ -133,18 +135,46 @@
       width="900"
       :before-close="cancelAddRoles"
     >
-      <div class="rolesNames">
-        <span>角色名称: &nbsp;&nbsp;</span>
-        <el-input
-          :clearable="true"
-          v-model.trim="addRoleName"
-          class="w-50 m-2"
-          style="width: 450px"
-          placeholder="请输入角色名称"
-        />
-      </div>
-      <div class="rolesName">
-        <div>
+      <el-form
+        v-loading="addRolesLoading"
+        ref="addRoleRef"
+        :model="addRoleRuleForm"
+        :rules="addRoleRules"
+        class="demo-ruleForm"
+        label-width="110px"
+        :size="formSize"
+        label-position="right"
+        status-icon
+      >
+        <!-- <el-form-item v-if="addRoleFlag == 2" label="父级角色名称" prop="pname">
+          <el-input
+            :clearable="true"
+            v-model.trim="addRoleRuleForm.pname"
+            class="w-50 m-2"
+            style="width: 450px"
+            :disabled="addRoleFlag == 2"
+            placeholder="请输入父级角色名称"
+          />
+        </el-form-item> -->
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input
+            :clearable="true"
+            v-model.trim="addRoleRuleForm.roleName"
+            class="w-50 m-2"
+            style="width: 450px"
+            placeholder="请输入角色名称"
+          />
+        </el-form-item>
+        <!-- <el-form-item label="角色级别" prop="roleLevel">
+          <el-input
+            :clearable="true"
+            v-model.trim="addRoleRuleForm.roleLevel"
+            class="w-50 m-2"
+            style="width: 450px"
+            placeholder="请输入角色级别"
+          />
+        </el-form-item> -->
+        <el-form-item label="权限" prop="treeSel">
           <el-tree
             ref="treeRef"
             style="max-width: 600px"
@@ -154,102 +184,42 @@
             node-key="id"
             highlight-current
             :props="defaultProps"
+            @check-change="handleCheckChange"
+            check-strictly
           />
-          <!-- <el-table
+        </el-form-item>
+        <el-form-item>
+          <div class="options">
+            <div class="btn">
+              <el-button
+                color="rgba(41, 109, 227, 1)"
+                class="queding"
+                type="primary"
+                @click="confirmRoles(addRoleRef)"
+              >
+                确定
+              </el-button>
+              <el-button @click="cancelAddRoles">取消</el-button>
+            </div>
+          </div>
+        </el-form-item>
+      </el-form>
+      <!-- <div class="rolesName">
+        <div>
+          <el-tree
+            ref="treeRef"
+            style="max-width: 600px"
             :data="addtableData.list"
-            @selection-change="handleSelectionChange"
-            :header-cell-style="{
-              background: 'rgba(240, 243, 247, 1)',
-              height: '45px',
-              border: 0,
-            }"
-            row-key="id"
-            :tree-props="{ children: 'menuLists', hasChildren: 'hasChildren' }"
-          >
-            <el-table-column prop="menuName" label="名称" />
-            <el-table-column prop="sort" label="排序号" />
-            <el-table-column label="权限">
-              <template #default="scope">
-                <el-switch
-                  v-model="scope.row.isRead"
-                  active-text="可读"
-                  inactive-text="不可读"
-                  active-value="1"
-                  inactive-value="0"
-                />
-                <br />
-                <el-switch
-                  v-model="scope.row.isWrite"
-                  active-text="可写"
-                  inactive-text="不可写"
-                  active-value="1"
-                  inactive-value="0"
-                />
-              </template>
-            </el-table-column>
-            <el-table-column prop="url" label="菜单URL" />
-          </el-table> -->
-
-          <!-- <table cellspacing="0" border-collapse="collapse">
-                <tr align="center">
-                  <td>一级</td>
-                  <td>二级</td>
-                  <td>功能</td>
-                </tr>
-                <tr align="center">
-                  <td>房态管理</td>
-                  <td>/</td>
-                  <td>
-                    <el-tree
-                      ref="addRolesData1"
-                      style="max-width: 600px"
-                      :data="addRolesList1.three"
-                      show-checkbox
-                      node-key="id"
-                      :props="defaultProps"
-                      default-expand-all
-                      @check="
-                        (data, nodes) =>
-                          editMemberCheckChange(data, nodes, addRolesList1.one)
-                      "
-                    />
-                  </td>
-                </tr>
-                <tr align="center">
-                  <td :rowspan="4">房间管理</td>
-                  <td>楼栋单元管理</td>
-                  <td>
-                    <el-tree
-                      ref="addRolesData2"
-                      style="max-width: 600px"
-                      :data="addRolesList2.three"
-                      show-checkbox
-                      node-key="id"
-                      :props="defaultProps"
-                      default-expand-all
-                      @check="
-                        (data, nodes) =>
-                          editMemberCheckChange(data, nodes, addRolesList2.two)
-                      "
-                    />
-                  </td>
-                </tr>
-              </table> -->
-        </div>
-      </div>
-      <div class="options">
-        <div class="btn">
-          <el-button
-            color="rgba(41, 109, 227, 1)"
-            class="queding"
-            type="primary"
-            @click="confirmEdit"
-          >
-            确定
-          </el-button>
-          <el-button @click="cancelAddRoles">取消</el-button>
+            show-checkbox
+            default-expand-all
+            node-key="id"
+            highlight-current
+            :props="defaultProps"
+            @check-change="handleCheckChange"
+            check-strictly
+          />
         </div>
-      </div>
+      </div> -->
     </el-dialog>
 
     <!-- 项目导入 -->
@@ -330,7 +300,7 @@ const tableData = reactive({
 });
 
 const searchInput = reactive({
-  pname: "", // 项目名称
+  roleName: "", // 项目名称
   createTime: "", // 创建时间
 }); // 搜索按钮数据
 
@@ -345,15 +315,36 @@ const api = ref("");
 // 新增角色 (--------------------------------------------------------)
 const addRolesVisible = ref(false);
 const addRolesTitle = ref();
-const addRoleName = ref();
+const addRolesLoading = ref(false);
+
+const treeRef = ref();
 const addtableData = reactive({
   list: [],
 });
+const treeSelData = ref();
 const defaultProps = {
   children: "menuLists",
   label: "menuName",
 };
 
+const addRoleRef = ref();
+const addRoleFlag = ref();
+const addRoleRuleForm = reactive({
+  pid: "", // 父级角色ID,最高级为0
+  pname: "", // 父级角色名称
+  roleName: "", // 角色名称
+  roleLevel: "", // 角色级别
+  treeSel: [],
+  id: "",
+});
+// 更新进度验证
+const addRoleRules = reactive({
+  pname: [{ required: true, message: "父级角色名称不能为空", trigger: "blur" }],
+  roleName: [{ required: true, message: "角色名称不能为空", trigger: "blur" }],
+  roleLevel: [{ required: true, message: "角色级别不能为空", trigger: "blur" }],
+  treeSel: [{ required: true, message: "权限不能为空", trigger: "blur" }],
+});
+
 // 项目导入
 const projectImportVisible = ref(false);
 const projectRef = ref();
@@ -362,14 +353,17 @@ const projectFile = ref();
 // 获取账户列表
 const getList = async () => {
   loading.value = true;
-  let data = {
+  let params = {
     page: currentPage.value, // 当前页
     rows: pageSize.value, // 一页数据条数
   };
-  // if (searchInput.createTime) {
-  //   data.startDate = searchInput.createTime[0];
-  //   data.endDate = searchInput.createTime[1];
-  // }
+  let data = {
+    roleName: searchInput.roleName,
+  };
+  if (searchInput.createTime) {
+    data.createBy = searchInput.createTime[0];
+    data.updateBy = searchInput.createTime[1];
+  }
   let res = await axios({
     method: "post",
     url: api.value + "/api/sysRole/queryPageSysRole",
@@ -377,10 +371,8 @@ const getList = async () => {
       tokenP: sessionStorage.getItem("tokenP"),
       user_head: sessionStorage.getItem("userhead"),
     },
-    params: data,
-    data: {
-      pname: searchInput.pname,
-    },
+    params: params,
+    data:data
   });
   console.log(res, "查询角色分页数据");
   if (res.data.code == 200) {
@@ -403,10 +395,7 @@ const searchBtn = lodash.debounce(async () => {
   getList();
 }, 300);
 
-// 角色新增
-const addProjectbtn = async () => {
-  addRolesVisible.value = true;
-  addRolesTitle.value = "角色新增";
+const menuList = async () => {
   let res = await axios({
     method: "post",
     url: api.value + "/api/sysMenu/QueryMenuTreeRecords",
@@ -427,19 +416,252 @@ const addProjectbtn = async () => {
     });
   }
 };
+// 角色新增
+const addProjectbtn = async (flag, row) => {
+  addRolesVisible.value = true;
+  addRolesTitle.value = "角色新增";
+  treeSelData.value = [];
+  addRoleFlag.value = flag; // 判断是 父级添加  还是 子级添加
+  console.log(flag, row);
+
+  if (flag == 1) {
+    addRoleRuleForm.pid = 0; // 父级角色ID
+    addRoleRuleForm.pname = "/"; // 父级角色名称
+    addRoleRuleForm.roleName = ""; // 角色名称
+    addRoleRuleForm.roleLevel = "T0"; // 角色级别
+  } else if (flag == 2) {
+    addRoleRuleForm.pid = row.id;
+    addRoleRuleForm.pname = row.roleName;
+    addRoleRuleForm.roleName = "";
+    addRoleRuleForm.roleLevel = "";
+  }
+  menuList();
+};
+// 勾选权限
+const handleCheckChange = (data, checked, indeterminate) => {
+  // console.log(treeRef.value.getCheckedNodes());
+  addtableData.list.forEach((i) => {
+    i.state = 0;
+    if (i.menuLists) {
+      i.menuLists.forEach((item) => {
+        item.state = 0;
+      });
+    }
+  });
+  if (treeRef.value.getCheckedNodes().length) {
+    treeSelData.value = [];
+    treeRef.value.getCheckedNodes().forEach((i) => {
+      // 菜单权限
+      if (i.pid == 0) {
+        addtableData.list.forEach((item) => {
+          if (i.id == item.id) {
+            item.state = 1;
+          }
+        });
+      }
+      // 按钮权限
+      else {
+        // 将勾选的数据的state状态变为1
+        addtableData.list.forEach((item) => {
+          if (item.menuLists) {
+            item.menuLists.forEach((row) => {
+              if (row.id == i.id) {
+                row.state = 1;
+              }
+            });
+          }
+        });
+      }
+    });
+
+    addRoleRuleForm.treeSel = [];
+    addtableData.list.forEach((i) => {
+      addRoleRuleForm.treeSel.push({
+        id: i.id,
+        state: i.state,
+      });
+      if (i.menuLists) {
+        i.menuLists.forEach((item) => {
+          addRoleRuleForm.treeSel.push({
+            id: item.id,
+            state: item.state,
+          });
+        });
+      }
+    });
+    // console.log(addtableData.list, "菜单数据");
+    // console.log(addRoleRuleForm.treeSel, "勾选的菜单");
+  }
+};
+// 确定编辑角色权限
+const confirmRoles = (formEl) => {
+  if (!formEl) return;
+  formEl.validate(async (valid, fields) => {
+    if (valid) {
+      addRolesLoading.value = true;
+      let res = "";
+      let data = {
+        sysRole: {
+          // pid: addRoleRuleForm.pid, // 父级角色ID,最高级为0
+          // pname: addRoleRuleForm.pname, // 父级角色名称
+          roleName: addRoleRuleForm.roleName, // 父级角色名称
+          // roleLevel: addRoleRuleForm.roleLevel, // 角色级别
+        },
+        list: addRoleRuleForm.treeSel,
+      };
+      // 判断是否有id存在,有则是修改账号
+      if (addRoleRuleForm.id) {
+        data.sysRole.id = addRoleRuleForm.id;
+        res = await axios({
+          method: "post",
+          url: api.value + "/api/sysRole/update",
+          headers: {
+            tokenP: sessionStorage.getItem("tokenP"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+      } else {
+        // 最大级添加
+        // if (addRoleFlag.value == 1) {
+        // } else if (addRoleFlag.value == 2) {
+        // }
+        res = await axios({
+          method: "post",
+          url: api.value + "/api/sysRole/add",
+          headers: {
+            tokenP: sessionStorage.getItem("tokenP"),
+            user_head: sessionStorage.getItem("userhead"),
+          },
+          data: data,
+        });
+      }
+      console.log(data, "添加参数");
+      console.log(res, "新增账号数据");
+      if (res.data.code == 200) {
+        addRolesVisible.value = false;
+        addRolesLoading.value = false;
+        getList();
+        ElMessage({
+          type: "success",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      } else {
+        addRolesLoading.value = false;
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.message,
+          center: true,
+        });
+      }
+    }
+  });
+};
 // 取消角色新增
 const cancelAddRoles = () => {
   addRolesVisible.value = false;
+  addRoleRuleForm.pid = "";
+  addRoleRuleForm.pname = "";
+  addRoleRuleForm.roleName = "";
+  addRoleRuleForm.roleLevel = "";
+  addRoleRef.value.resetFields();
 };
 
 //编辑项目
 const edit = (row) => {
   addRolesVisible.value = true;
   addRolesTitle.value = "角色编辑";
+  addRoleRuleForm.id = row.id;
+  // addRoleRuleForm.pid = row.pid;
+  // addRoleRuleForm.pname = row.pname;
+  addRoleRuleForm.roleName = row.roleName;
+  addRoleRuleForm.roleLevel = row.roleLevel;
+  menuList();
+  nextTick(async () => {
+    // console.log(row);
+    let data = new FormData();
+    data.append("roleId", row.id);
+    let role = await axios({
+      method: "post",
+      url: api.value + "/api/sysRole/queryMenuByRole",
+      headers: {
+        tokenP: sessionStorage.getItem("tokenP"),
+        user_head: sessionStorage.getItem("userhead"),
+      },
+      data: data,
+    });
+    console.log(role, "查询角色菜单权限");
+    if (role.data.code == 200) {
+      // addtableData.list=role.data.data
+      treeSelData.value = [];
+      addRoleRuleForm.treeSel = [];
+      role.data.data.forEach((i) => {
+        addRoleRuleForm.treeSel.push({
+          id: i.id,
+          state: i.state,
+        });
+        if (i.menuLists) {
+          i.menuLists.forEach((item) => {
+            addRoleRuleForm.treeSel.push({
+              id: item.id,
+              state: item.state,
+            });
+          });
+        }
+      });
+      // console.log(addtableData.list, "菜单数据");
+      // console.log(addRoleRuleForm.treeSel, "勾选的菜单");
+      let arr = [];
+      addRoleRuleForm.treeSel.forEach((i) => {
+        if (i.state == 1) {
+          arr.push(i.id);
+        }
+      });
+      treeRef.value.setCheckedKeys(arr);
+    } else {
+      ElMessage({
+        type: "error",
+        showClose: true,
+        message: role.data.message,
+        center: true,
+      });
+    }
+  });
+};
+
+const delRoles = async (row) => {
   console.log(row);
+  let data = new FormData();
+  data.append("id", row.id);
+  let res = await axios({
+    method: "post",
+    url: api.value + "/api/sysRole/del",
+    headers: {
+      tokenP: sessionStorage.getItem("tokenP"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+  });
+  if (res.data.code == 200) {
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
 };
-// 删除pdf文件 (装配式相关附件)
-const pdfDel = (value, uid) => {};
 
 // 导入项目
 const projectImportConfirm = async () => {
@@ -591,7 +813,7 @@ onUnmounted(() => {
     }
 
     .gongneng {
-      margin: 10px 0;
+      margin: 8px 0;
 
       // .el-button {
       //   color: #fff;

+ 125 - 24
src/views/system/system.vue

@@ -8,30 +8,24 @@
       <div class="roles">考核规则</div>
       <div class="filter">
         <!-- <el-checkbox v-model="checked1" label="提醒次数扣分" size="large" /> -->
-        <el-input
-          v-model="accountRuleForm.contacts"
-          placeholder="请输入次数"
-          clearable
-        />
+        <span style="font-size: 14px; margin-right: 10px">提醒次数扣分</span>
+        <el-input @blur="updateRemind" v-model="remind" placeholder="请输入次数" clearable />
         <span class="grade">分/次</span>
       </div>
       <div class="filter">
         <!-- <el-checkbox v-model="checked1" label="预警次数扣分" size="large" /> -->
-        <el-input
-          v-model="accountRuleForm.contacts"
-          placeholder="请输入次数"
-          clearable
-        />
+        <span style="font-size: 14px; margin-right: 10px">预警次数扣分</span>
+        <el-input @blur="updateWarn" v-model="warning" placeholder="请输入次数" clearable />
         <span class="grade">分/次</span>
       </div>
       <div class="roles">考核维度管理</div>
       <!-- 按钮列表 -->
-      <div class="gongneng">
+      <!-- <div class="gongneng">
         <el-button @click="addProjectbtn" class="add"
           ><el-icon> <CirclePlus /> </el-icon
           ><span>添加考核维度</span></el-button
         >
-      </div>
+      </div> -->
     </div>
     <div class="scroll">
       <div class="footer" v-loading="loading">
@@ -54,7 +48,7 @@
             <template #default="scope">
               <div class="options">
                 <div class="look" @click="edit(scope.row)">编辑</div>
-                <el-popconfirm
+                <!-- <el-popconfirm
                   width="150"
                   confirm-button-text="确认"
                   cancel-button-text="取消"
@@ -67,13 +61,13 @@
                   <template #reference>
                     <div class="del">删除</div>
                   </template>
-                </el-popconfirm>
+                </el-popconfirm> -->
               </div>
             </template>
           </el-table-column>
         </el-table>
 
-        <div class="gongneng">
+        <!-- <div class="gongneng">
           <el-button @click="addProjectbtn" class="add"
             ><span>修改</span></el-button
           >
@@ -83,7 +77,7 @@
           <el-button @click="addProjectbtn" class="add"
             ><span>保存</span></el-button
           >
-        </div>
+        </div> -->
         <!-- 添加考核维度 -->
         <el-dialog
           class="account"
@@ -107,6 +101,7 @@
           >
             <el-form-item label="维度名称" prop="configKey">
               <el-input
+                disabled
                 v-model="accountRuleForm.configKey"
                 placeholder="请输入维度名称"
                 clearable
@@ -125,8 +120,8 @@
               />
             </el-form-item>
             <el-form-item label="是否属于进度" prop="isSpeed">
-              <el-radio-group v-model="accountRuleForm.isSpeed">
-                <el-radio :value="0" size="large">非进度</el-radio>
+              <el-radio-group disabled v-model="accountRuleForm.isSpeed">
+                <el-radio :value="0" size="large">质量</el-radio>
                 <el-radio :value="1" size="large">进度</el-radio>
               </el-radio-group>
             </el-form-item>
@@ -183,6 +178,11 @@ import { useStore } from "vuex";
 const store = useStore();
 const router = useRouter();
 
+const remind = ref();
+const remindList = ref();
+const warning = ref();
+const warningList = ref();
+
 const tableData = reactive({
   list: [{}],
 });
@@ -212,10 +212,12 @@ const accountRules = reactive({
 
 // 获取账户列表
 const getList = async () => {
-  let data = {
+  let params = {
     page: currentPage.value, // 当前页
     rows: pageSize.value, // 一页数据条数
   };
+  let data = new FormData();
+  data.append("name", "");
   let res = await axios({
     method: "post",
     url: api.value + "/api/sysConfig/queryPage",
@@ -223,11 +225,110 @@ const getList = async () => {
       tokenP: sessionStorage.getItem("tokenP"),
       user_head: sessionStorage.getItem("userhead"),
     },
-    params:data
+    params: params,
+    data,
   });
   console.log(res, "考核维度管理");
   if (res.data.code == 200) {
-    tableData.list = res.data.data.rows;
+    remind.value = res.data.data.rows[0].configValue;
+    remindList.value = res.data.data.rows[0];
+    warning.value = res.data.data.rows[1].configValue;
+    warningList.value = res.data.data.rows[1];
+    tableData.list = [res.data.data.rows[2], res.data.data.rows[3]];
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+
+// 修改扣分项
+const updateRemind = async () => {
+  if(!remind.value){
+    getList()
+    ElMessage({
+      type: "warning",
+      showClose: true,
+      message: '提醒次数扣分不能为空',
+      center: true,
+    });
+    return 
+  }
+  let data = {
+    configKey: remindList.value.configKey,
+    isSpeed: remindList.value.isSpeed, // 是否属于进度
+    configValue: remind.value,
+    remark: "",
+    id: remindList.value.id,
+  };
+  // 判断是否有id存在,有则是修改账号
+  let res = await axios({
+    method: "post",
+    url: api.value + "/api/sysConfig/update",
+    headers: {
+      tokenP: sessionStorage.getItem("tokenP"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+  });
+  console.log(res, "修改扣分项");
+  if (res.data.code == 200) {
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  } else {
+    ElMessage({
+      type: "error",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
+  }
+};
+const updateWarn = async () => {
+  if(!warning.value){
+    getList()
+    ElMessage({
+      type: "warning",
+      showClose: true,
+      message: '预警次数扣分不能为空',
+      center: true,
+    });
+    return 
+  }
+  let data = {
+    configKey: warningList.value.configKey,
+    isSpeed: warningList.value.isSpeed, // 是否属于进度
+    configValue: warning.value,
+    remark: "",
+    id: warningList.value.id,
+  };
+  // 判断是否有id存在,有则是修改账号
+  let res = await axios({
+    method: "post",
+    url: api.value + "/api/sysConfig/update",
+    headers: {
+      tokenP: sessionStorage.getItem("tokenP"),
+      user_head: sessionStorage.getItem("userhead"),
+    },
+    data: data,
+  });
+  console.log(res, "修改扣分项");
+  if (res.data.code == 200) {
+    getList();
+    ElMessage({
+      type: "success",
+      showClose: true,
+      message: res.data.message,
+      center: true,
+    });
   } else {
     ElMessage({
       type: "error",
@@ -331,8 +432,8 @@ const confirmAccount = (formEl) => {
 
 // 删除考核维度
 const del = async (row) => {
-  let data=new FormData();
-  data.append('id',row.id)
+  let data = new FormData();
+  data.append("id", row.id);
   let res = await axios({
     method: "post",
     url: api.value + "/api/sysConfig/del",
@@ -340,7 +441,7 @@ const del = async (row) => {
       tokenP: sessionStorage.getItem("tokenP"),
       user_head: sessionStorage.getItem("userhead"),
     },
-    data:data
+    data: data,
   });
   if (res.data.code == 200) {
     getList();

+ 120 - 30
src/views/user/user.vue

@@ -24,12 +24,13 @@
             placeholder="请选择角色"
             style="width: 250px"
             @change="searchBtn"
+            clearable
           >
             <el-option
               v-for="item in roleData"
               :key="item.id"
               :label="item.roleName"
-              :value="item.id"
+              :value="item.roleName"
             />
           </el-select>
         </div>
@@ -51,19 +52,36 @@
           />
         </div>
         <div class="condition">
-          <span>部门 </span>
+          <span>所属部门 </span>
           <el-select
             v-model="searchInput.department"
             placeholder="请选择部门"
             style="width: 220px"
             clearable
-            @clear="searchBtn"
+            @change="searchBtn"
           >
             <el-option
               v-for="item in departmentData"
-              :key="item.value"
+              :key="item.oname"
               :label="item.oname"
-              :value="item.id"
+              :value="item.oname"
+            />
+          </el-select>
+        </div>
+        <div class="condition">
+          <span>分管部门 </span>
+          <el-select
+            v-model="searchInput.manageDepartment"
+            placeholder="请选择部门"
+            style="width: 220px"
+            clearable
+            @change="searchBtn"
+          >
+            <el-option
+              v-for="item in departmentData"
+              :key="item.oname"
+              :label="item.oname"
+              :value="item.oname"
             />
           </el-select>
         </div>
@@ -80,9 +98,9 @@
         <el-button @click="addProjectbtn" class="add"
           ><el-icon> <CirclePlus /> </el-icon><span>创建用户</span></el-button
         >
-        <el-button @click="projectImportBtn" class="imp"
+        <!-- <el-button @click="projectImportBtn" class="imp"
           ><span>更新</span></el-button
-        >
+        > -->
         <!-- <el-button @click="projectExportBtn" class="add"
           ><el-icon><Download /></el-icon><span>项目导出</span></el-button
         > -->
@@ -110,9 +128,22 @@
           />
           <el-table-column align="center" prop="userName" label="姓名" />
           <el-table-column align="center" prop="userCode" label="正方工号" />
-          <el-table-column align="center" prop="cardNumber" label="微校卡号" />
+          <!-- <el-table-column align="center" prop="cardNumber" label="微校卡号" /> -->
           <el-table-column align="center" prop="roleName" label="角色" />
-          <el-table-column align="center" prop="department" label="部门" />
+          <el-table-column
+            align="center"
+            prop="department"
+            label="所属部门"
+            width="300"
+            tooltip-effect
+          />
+          <el-table-column
+            align="center"
+            prop="manageDepartment"
+            label="分管部门"
+            width="300"
+            tooltip-effect
+          />
           <el-table-column align="center" prop="mobile" label="手机号码" />
           <el-table-column align="center" prop="createTime" label="创建时间" />
           <el-table-column align="center" label="操作" width="220">
@@ -178,14 +209,14 @@
                 style="width: 220px"
               />
             </el-form-item>
-            <el-form-item label="微校卡号" prop="cardNumber">
+            <!-- <el-form-item label="微校卡号" prop="cardNumber">
               <el-input
                 v-model="accountRuleForm.cardNumber"
                 placeholder="请输入微校卡号"
                 clearable
                 style="width: 220px"
               />
-            </el-form-item>
+            </el-form-item> -->
             <el-form-item label="手机号码" prop="mobile">
               <el-input
                 v-model="accountRuleForm.mobile"
@@ -199,7 +230,6 @@
                 v-model="accountRuleForm.roleId"
                 placeholder="请选择"
                 style="width: 220px"
-                @change="roleChange"
               >
                 <el-option
                   v-for="item in roleData"
@@ -209,12 +239,27 @@
                 />
               </el-select>
             </el-form-item>
-            <el-form-item label="部门" prop="department">
+            <el-form-item label="所属部门" prop="department">
               <el-select
                 v-model="accountRuleForm.department"
                 placeholder="请选择"
                 style="width: 220px"
-                @change="roleChange"
+              >
+                <el-option
+                  v-for="item in departmentData"
+                  :key="item.id"
+                  :label="item.oname"
+                  :value="item.oname"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="分管部门">
+              <el-select
+                v-model="accountRuleForm.manageDepartment"
+                placeholder="请选择"
+                style="width: 220px"
+                collapse-tags
+                multiple
               >
                 <el-option
                   v-for="item in departmentData"
@@ -333,7 +378,8 @@ const tableData = reactive({
 const searchInput = reactive({
   name: "", // 名称
   role: "", // 角色
-  department: "", // 部门
+  manageDepartment: "", //分管部门
+  department: "", // 所属部门
   createTime: "", // 创建时间
 }); // 搜索按钮数据
 const departmentData = ref(); // 部门数据
@@ -342,6 +388,7 @@ const roleData = ref(); // 角色数据
 const currentPage = ref(1); // 当前页
 const pageSize = ref(10);
 const total = ref(40); // 当前总数
+
 const selectData = reactive({
   list: [],
 }); // 多选框选择的数据
@@ -358,7 +405,8 @@ const accountRuleForm = reactive({
   cardNumber: "", // 微校卡号
   roleId: "", // 角色
   mobile: "", // 联系电话
-  department: "", // 部门
+  manageDepartment: "", // 分管部门
+  department: "", // 所属部门
   id: "",
 });
 // 新增账号表单验证
@@ -370,7 +418,12 @@ const accountRules = reactive({
   ],
   roleId: [{ required: true, message: "角色不能为空", trigger: "blur" }],
   mobile: [{ required: true, message: "手机号码不能为空", trigger: "blur" }],
-  department: [{ required: true, message: "部门不能为空", trigger: "blur" }],
+  manageDepartment: [
+    { required: true, message: "分管部门不能为空", trigger: "blur" },
+  ],
+  department: [
+    { required: true, message: "所属部门不能为空", trigger: "blur" },
+  ],
 });
 
 // 项目导入
@@ -381,15 +434,20 @@ const projectFile = ref();
 // 获取账户列表
 const getList = async () => {
   loading.value = true;
-  let data = {
+  let params = {
     page: currentPage.value, // 当前页
     rows: pageSize.value, // 一页数据条数
   };
-
-  // if (searchInput.createTime) {
-  //   data.startDate = searchInput.createTime[0];
-  //   data.endDate = searchInput.createTime[1];
-  // }
+  let data = {
+    userName: searchInput.name, // 姓名
+    roleName: searchInput.role, // 角色名称
+    manageDepartment: searchInput.manageDepartment, // 部门
+    department: searchInput.department, // 部门
+  };
+  if (searchInput.createTime) {
+    data.createBy = searchInput.createTime[0];
+    data.updateBy = searchInput.createTime[1];
+  }
   let res = await axios({
     method: "post",
     url: api.value + "/api/sysUser/queryPage",
@@ -397,10 +455,8 @@ const getList = async () => {
       tokenP: sessionStorage.getItem("tokenP"),
       user_head: sessionStorage.getItem("userhead"),
     },
-    params: data,
-    data: {
-      userName: searchInput.name,
-    },
+    params: params,
+    data: data,
   });
   console.log(res, "用户管理数据");
   if (res.data.code == 200) {
@@ -438,9 +494,35 @@ const departmentList = async () => {
       center: true,
     });
   }
+
+  // let res = await axios({
+  //   method: "post",
+  //   url: api.value + "/api/sysUser/queryOwn",
+  //   headers: {
+  //     tokenP: sessionStorage.getItem("tokenP"),
+  //     user_head: sessionStorage.getItem("userhead"),
+  //   },
+  // });
+  // console.log(res, "部门数据");
+  // if (res.data.code == 200) {
+  //   let arr = [];
+  //   res.data.data.manageDepartment.split(",").forEach((i) => {
+  //     arr.push({
+  //       oname: i,
+  //     });
+  //   });
+  //   departmentData.value = arr;
+  // } else {
+  //   ElMessage({
+  //     type: "error",
+  //     showClose: true,
+  //     message: res.data.message,
+  //     center: true,
+  //   });
+  // }
 };
 
-// 部门数据
+// 角色数据
 const roleList = async () => {
   let res = await axios({
     method: "post",
@@ -451,7 +533,7 @@ const roleList = async () => {
     },
     params: {
       page: 1, // 当前页
-      rows: 100, // 一页数据条数
+      rows: 500, // 一页数据条数
     },
     data: {
       pname: "",
@@ -484,6 +566,7 @@ const addProjectbtn = () => {
   accountRuleForm.cardNumber = "";
   accountRuleForm.roleId = "";
   accountRuleForm.mobile = "";
+  accountRuleForm.manageDepartment = "";
   accountRuleForm.department = "";
   accountRuleForm.id = "";
 };
@@ -496,6 +579,7 @@ const cancelAccount = () => {
   accountRuleForm.cardNumber = "";
   accountRuleForm.roleId = "";
   accountRuleForm.mobile = "";
+  accountRuleForm.manageDepartment = "";
   accountRuleForm.department = "";
   accountRuleForm.id = "";
 };
@@ -510,6 +594,7 @@ const confirmAccount = (formEl) => {
         userCode: accountRuleForm.userCode,
         cardNumber: accountRuleForm.cardNumber,
         roleId: accountRuleForm.roleId,
+        manageDepartment: accountRuleForm.manageDepartment.join(","),
         department: accountRuleForm.department,
         mobile: accountRuleForm.mobile,
       };
@@ -568,6 +653,11 @@ const edit = (row) => {
   accountRuleForm.cardNumber = row.cardNumber;
   accountRuleForm.roleId = row.roleId;
   accountRuleForm.mobile = row.mobile;
+  if(row.manageDepartment){
+    accountRuleForm.manageDepartment = row.manageDepartment.split(",");
+  }else{
+    row.manageDepartment=null
+  }
   accountRuleForm.department = row.department;
   accountRuleForm.id = row.id;
   console.log(row);
@@ -715,7 +805,7 @@ onUnmounted(() => {
     }
 
     .gongneng {
-      margin: 10px 0;
+      margin: 8px 0;
 
       .el-button {
         color: #fff;

File diff suppressed because it is too large
+ 96 - 0
vite.config.js.timestamp-1734483881723.mjs