Просмотр исходного кода

解决重新登录后页面空白页问题

xusl 2 лет назад
Родитель
Сommit
7eba4fa576

+ 2 - 1
ui/src/layout/components/Navbar.vue

@@ -48,6 +48,7 @@ import { mapGetters } from 'vuex'
 import Breadcrumb from '@/components/Breadcrumb'
 import Breadcrumb from '@/components/Breadcrumb'
 import TopNav from '@/components/TopNav'
 import TopNav from '@/components/TopNav'
 import Hamburger from '@/components/Hamburger'
 import Hamburger from '@/components/Hamburger'
+import {removeToken} from "@/utils/auth";
 // import Screenfull from '@/components/Screenfull'
 // import Screenfull from '@/components/Screenfull'
 // import SizeSelect from '@/components/SizeSelect'
 // import SizeSelect from '@/components/SizeSelect'
 // import Search from '@/components/HeaderSearch'
 // import Search from '@/components/HeaderSearch'
@@ -93,7 +94,7 @@ export default {
       this.$store.dispatch('app/toggleSideBar')
       this.$store.dispatch('app/toggleSideBar')
     },
     },
     async logout() {
     async logout() {
-      sessionStorage.removeItem("token")
+      removeToken()
       //注销返回自己的登录页
       //注销返回自己的登录页
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
       // this.$confirm('确定注销并退出系统吗?', '提示', {
       // this.$confirm('确定注销并退出系统吗?', '提示', {

+ 16 - 7
ui/src/permission.js

@@ -11,7 +11,7 @@ NProgress.configure({ showSpinner: false }) // NProgress Configuration
 
 
 const whiteList = ['/login'] // no redirect whitelist
 const whiteList = ['/login'] // no redirect whitelist
 
 
-router.beforeEach(async(to, from, next) => {
+router.beforeEach(async (to, from, next) => {
   // start progress bar
   // start progress bar
   NProgress.start()
   NProgress.start()
 
 
@@ -24,15 +24,24 @@ router.beforeEach(async(to, from, next) => {
       next({ path: '/' })
       next({ path: '/' })
       NProgress.done()
       NProgress.done()
     } else {
     } else {
-      store.dispatch('GenerateRoutes').then(accessRoutes => {
-        // 根据roles权限生成可访问的路由表
-        router.addRoutes(accessRoutes) // 动态添加可访问路由表
-        // next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
-      })
+      // 登录成功时将路由置空
+      if (store.getters.permission_routes.length==0) {
+        await store.dispatch('GenerateRoutes').then(accessRoutes => {
+          // 根据roles权限生成可访问的路由表
+          router.addRoutes(accessRoutes) // 动态添加可访问路由表
+          next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+        }).catch(err => {
+          store.dispatch('changeRouters',[])
+          console.log('生成路由异常,输出routes:'+store.getters.permission_routes.length)
+          next({ path: '/' })
+        })
+      }
+
       // 验证初始密码是否修改了或者超过30天
       // 验证初始密码是否修改了或者超过30天
       if (to.path !=='/dashboard' && to.path !=='/user/profile'){
       if (to.path !=='/dashboard' && to.path !=='/user/profile'){
         // 用户信息解密
         // 用户信息解密
-        let decryptUserInfo = userinfoDecrypt(store.getters.userinfo)
+        // let decryptUserInfo = userinfoDecrypt(store.getters.userinfo)
+        let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
         let user = JSON.parse(decryptUserInfo)
         let user = JSON.parse(decryptUserInfo)
         if (user.lastUpdatePwdTime==null){
         if (user.lastUpdatePwdTime==null){
           Message({
           Message({

+ 37 - 30
ui/src/router/index.js

@@ -52,35 +52,35 @@ export const constantRoutes = [
       meta: {title: '首页', icon: 'dashboard', affix: true}
       meta: {title: '首页', icon: 'dashboard', affix: true}
     }]
     }]
   },
   },
-  {
-    path: '/sysManager',
-    component: Layout,
-    redirect: '/sysManager',
-    meta: {
-      title: '系统管理'
-    },
-    children: [
-      {
-      path: 'userManager',
-      name: '用户管理',
-      component: () => import('@/views/sysManager/userManager/index'),
-      meta: {title: '用户管理'}
-    },
-      {
-        path: 'sysParameter',
-        name: '参数管理',
-        component: () => import('@/views/sysManager/sysParameter/index'),
-        meta: {title: '参数管理'}
-      }
-      ,
-      {
-        path: 'sysMenu',
-        name: '菜单管理',
-        component: () => import('@/views/sysManager/sysMenu/index'),
-        meta: {title: '菜单管理'}
-      }
-    ]
-  },
+  // {
+  //   path: '/sysManager',
+  //   component: Layout,
+  //   redirect: '/sysManager',
+  //   meta: {
+  //     title: '系统管理'
+  //   },
+  //   children: [
+  //     {
+  //     path: 'userManager',
+  //     name: '用户管理',
+  //     component: () => import('@/views/sysManager/userManager/index'),
+  //     meta: {title: '用户管理'}
+  //   },
+  //     {
+  //       path: 'sysParameter',
+  //       name: '参数管理',
+  //       component: () => import('@/views/sysManager/sysParameter/index'),
+  //       meta: {title: '参数管理'}
+  //     }
+  //     ,
+  //     {
+  //       path: 'sysMenu',
+  //       name: '菜单管理',
+  //       component: () => import('@/views/sysManager/sysMenu/index'),
+  //       meta: {title: '菜单管理'}
+  //     }
+  //   ]
+  // },
   {
   {
     path: '/404',
     path: '/404',
     component: () => import('@/views/404'),
     component: () => import('@/views/404'),
@@ -108,7 +108,7 @@ export const dynamicRoutes = [
 ]
 ]
 
 
 const createRouter = () => new Router({
 const createRouter = () => new Router({
-  // mode: 'history', // require service support
+  mode: 'history', // require service support
   scrollBehavior: () => ({y: 0}),
   scrollBehavior: () => ({y: 0}),
   routes: constantRoutes
   routes: constantRoutes
 })
 })
@@ -121,4 +121,11 @@ export function resetRouter() {
   router.matcher = newRouter.matcher // reset router
   router.matcher = newRouter.matcher // reset router
 }
 }
 
 
+const originalPush = Router.prototype.push
+Router.prototype.push = function push(location, onResolve, onReject) {
+  if (onResolve || onReject)
+    return originalPush.call(this, location, onResolve, onReject)
+  return originalPush.call(this, location).catch((err) => err)
+}
+
 export default router
 export default router

+ 9 - 9
ui/src/store/index.js

@@ -18,15 +18,15 @@ const store = new Vuex.Store({
     tagsView,
     tagsView,
     permission
     permission
   },
   },
-  getters,
-  plugins:[
-    createPersistedState({
-      storage:window.sessionStorage,
-      paths:["user"]
-
-    })
-
-  ]
+  getters
+  // plugins:[
+  //   createPersistedState({
+  //     storage:window.sessionStorage,
+  //     // 给状态管理器赋值,需要解开下方注释
+  //     // paths:["user","permission"]
+  //
+  //   })
+  // ]
 })
 })
 
 
 export default store
 export default store

+ 9 - 3
ui/src/store/modules/permission.js

@@ -27,11 +27,14 @@ const permission = {
     SET_SIDEBAR_ROUTERS: (state, routes) => {
     SET_SIDEBAR_ROUTERS: (state, routes) => {
       state.sidebarRouters = routes
       state.sidebarRouters = routes
     },
     },
+    SET_R: (state, routes) => {
+      state.routes = routes
+    }
   },
   },
   actions: {
   actions: {
     // 生成路由
     // 生成路由
     GenerateRoutes({ commit }) {
     GenerateRoutes({ commit }) {
-      return new Promise(resolve => {
+      return new Promise((resolve,reject) => {
         // 向后端请求路由数据
         // 向后端请求路由数据
         request.get('/getRouters').then((res) => {
         request.get('/getRouters').then((res) => {
           const sdata = JSON.parse(JSON.stringify(res.data))
           const sdata = JSON.parse(JSON.stringify(res.data))
@@ -40,7 +43,7 @@ const permission = {
           const rewriteRoutes = filterAsyncRouter(rdata, false, true)
           const rewriteRoutes = filterAsyncRouter(rdata, false, true)
           const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
           const asyncRoutes = filterDynamicRoutes(dynamicRoutes);
           rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
           rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
-          router.addRoutes(asyncRoutes);
+          // router.addRoutes(asyncRoutes);
           commit('SET_ROUTES', rewriteRoutes)
           commit('SET_ROUTES', rewriteRoutes)
           commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
           commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
           commit('SET_DEFAULT_ROUTES', sidebarRoutes)
           commit('SET_DEFAULT_ROUTES', sidebarRoutes)
@@ -48,7 +51,10 @@ const permission = {
           resolve(rewriteRoutes)
           resolve(rewriteRoutes)
         })
         })
       })
       })
-    }
+    },
+    changeRouters({ commit }, routers) {
+      commit('SET_ROUTES', routers)
+    },
   }
   }
 }
 }
 
 

+ 2 - 0
ui/src/utils/auth.js

@@ -1,5 +1,6 @@
 import Cookies from 'js-cookie'
 import Cookies from 'js-cookie'
 
 
+
 const TokenKey = 'vue_admin_template_token'
 const TokenKey = 'vue_admin_template_token'
 
 
 export function getToken() {
 export function getToken() {
@@ -12,4 +13,5 @@ export function setToken(token) {
 
 
 export function removeToken() {
 export function removeToken() {
   sessionStorage.removeItem('token')
   sessionStorage.removeItem('token')
+  sessionStorage.removeItem('userinfo')
 }
 }

+ 1 - 1
ui/src/utils/request.js

@@ -136,7 +136,6 @@ service.interceptors.response.use(
             type: 'error',
             type: 'error',
             duration: 5 * 1000
             duration: 5 * 1000
           })
           })
-          return
           break
           break
         case 500:
         case 500:
           Message({
           Message({
@@ -150,6 +149,7 @@ service.interceptors.response.use(
           break
           break
         case 504:
         case 504:
           console.log('服务器关闭了!')
           console.log('服务器关闭了!')
+          removeToken()
           resetRouter()
           resetRouter()
           break
           break
         case 410:
         case 410:

+ 7 - 7
ui/src/views/dashboard/index.vue

@@ -9,11 +9,11 @@ import {mapGetters} from "vuex";
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 
 
 export default {
 export default {
-  computed: {
-    ...mapGetters([
-      'userinfo'
-    ])
-  },
+  // computed: {
+  //   ...mapGetters([
+  //     'userinfo'
+  //   ])
+  // },
   name: "User",
   name: "User",
   data() {
   data() {
     return{
     return{
@@ -28,8 +28,8 @@ export default {
       this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
       this.$axios.get('/sysUserController/getCurrentUser').then((res) => {
         // 用户信息加密存储
         // 用户信息加密存储
         let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
         let encryptUserInfo = userinfoEncrypt(JSON.stringify(res.data))
-        this.$store.dispatch('user/changeSetting',encryptUserInfo)
-        alert('首页加密用户信息存储')
+        // this.$store.dispatch('user/changeSetting',encryptUserInfo)
+        sessionStorage.setItem('userinfo',encryptUserInfo)
         var user = res.data
         var user = res.data
         if (user.lastUpdatePwdTime==null){
         if (user.lastUpdatePwdTime==null){
             this.$message({
             this.$message({

+ 3 - 4
ui/src/views/login/index.vue

@@ -81,6 +81,8 @@
 
 
 <script>
 <script>
 
 
+import store from "@/store";
+
 export default {
 export default {
   name: 'Login',
   name: 'Login',
   data() {
   data() {
@@ -238,11 +240,8 @@ export default {
             mailbox: this.loginForm.mailbox
             mailbox: this.loginForm.mailbox
           }
           }
           this.$axios.post('/user/login', param).then((res) => {
           this.$axios.post('/user/login', param).then((res) => {
-            // sessionStorage.setItem('token', data)
-            // document.cookie = "token=" + data;
-            // document.cookie = "user=".concat(this.loginForm.username)
             sessionStorage.setItem('token', res.data)
             sessionStorage.setItem('token', res.data)
-            // console.log('login user is :' + this.loginForm.username)
+            store.commit('SET_R', [])
             this.$router.push('/')
             this.$router.push('/')
             this.loading = false
             this.loading = false
           }).catch((error) => {
           }).catch((error) => {

+ 629 - 0
ui/src/views/sysManager/roleManager/index.vue

@@ -0,0 +1,629 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
+      <el-form-item label="角色名称" prop="roleName">
+        <el-input
+          v-model="queryParams.roleName"
+          placeholder="请输入角色名称"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="权限字符" prop="roleKey">
+        <el-input
+          v-model="queryParams.roleKey"
+          placeholder="请输入权限字符"
+          clearable
+          style="width: 240px"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select
+          v-model="queryParams.status"
+          placeholder="角色状态"
+          clearable
+          style="width: 240px"
+        >
+          <el-option
+            v-for="item in statusOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+        >修改
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+        >删除
+        </el-button>
+      </el-col>
+    </el-row>
+    <div style="padding-top: 10px">
+      <vxe-table
+        ref="xTable"
+        align="center"
+        :loading="loading"
+        class="mytable-style"
+        auto-resize
+        border
+        resizable
+        export-config
+        highlight-current-row
+        show-overflow
+        max-height="700"
+        :data="roleList"
+        :radio-config="{trigger: 'row'}"
+      >
+        <vxe-column type="radio" width="60"/>
+        <vxe-table-column field="roleId" title="角色编号"/>
+        <vxe-table-column field="roleName" title="角色名称"/>
+        <vxe-table-column field="roleKey" title="权限字符"/>
+        <vxe-table-column field="roleSort" title="显示顺序"/>
+        <vxe-table-column field="status" title="状态" :formatter="statusFormat"/>
+        <vxe-table-column title="操作" width="320">
+        </vxe-table-column>
+      </vxe-table>
+      <vxe-pager
+        v-show="showTable"
+        perfect
+        :current-page.sync="currentPage"
+        :page-size.sync="pageSize"
+        :total="total"
+        :page-sizes="[10,50,100]"
+        :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
+        @page-change="handlePageChange"
+      >
+      </vxe-pager>
+    </div>
+    <!-- 添加或修改角色配置对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="角色名称" prop="roleName">
+          <el-input v-model="form.roleName" placeholder="请输入角色名称"/>
+        </el-form-item>
+        <el-form-item prop="roleKey">
+          <span slot="label">
+            <el-tooltip content="控制器中定义的权限字符,如:@PreAuthorize(`@ss.hasRole('admin')`)" placement="top">
+              <i class="el-icon-question"></i>
+            </el-tooltip>
+            权限字符
+          </span>
+          <el-input v-model="form.roleKey" placeholder="请输入权限字符"/>
+        </el-form-item>
+        <el-form-item label="角色顺序" prop="roleSort">
+          <el-input-number v-model="form.roleSort" controls-position="right" :min="0"/>
+        </el-form-item>
+        <el-form-item label="状态">
+          <el-select
+            v-model="form.status"
+            placeholder="请选择用户状态"
+            clearable
+            style="width: 240px"
+          >
+            <el-option
+              v-for="item in statusOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="菜单权限">
+          <el-checkbox v-model="menuExpand" @change="handleCheckedTreeExpand($event, 'menu')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="menuNodeAll" @change="handleCheckedTreeNodeAll($event, 'menu')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.menuCheckStrictly" @change="handleCheckedTreeConnect($event, 'menu')">父子联动
+          </el-checkbox>
+          <el-tree
+            class="tree-border"
+            :data="menuOptions"
+            show-checkbox
+            ref="menu"
+            node-key="id"
+            :check-strictly="!form.menuCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 分配角色数据权限对话框 -->
+    <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
+      <el-form :model="form" label-width="80px">
+        <el-form-item label="角色名称">
+          <el-input v-model="form.roleName" :disabled="true"/>
+        </el-form-item>
+        <el-form-item label="权限字符">
+          <el-input v-model="form.roleKey" :disabled="true"/>
+        </el-form-item>
+        <el-form-item label="权限范围">
+          <el-select v-model="form.dataScope" @change="dataScopeSelectChange">
+            <el-option
+              v-for="item in dataScopeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="数据权限" v-show="form.dataScope == 2">
+          <el-checkbox v-model="deptExpand" @change="handleCheckedTreeExpand($event, 'dept')">展开/折叠</el-checkbox>
+          <el-checkbox v-model="deptNodeAll" @change="handleCheckedTreeNodeAll($event, 'dept')">全选/全不选</el-checkbox>
+          <el-checkbox v-model="form.deptCheckStrictly" @change="handleCheckedTreeConnect($event, 'dept')">父子联动
+          </el-checkbox>
+          <el-tree
+            class="tree-border"
+            :data="deptOptions"
+            show-checkbox
+            default-expand-all
+            ref="dept"
+            node-key="id"
+            :check-strictly="!form.deptCheckStrictly"
+            empty-text="加载中,请稍候"
+            :props="defaultProps"
+          ></el-tree>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitDataScope">确 定</el-button>
+        <el-button @click="cancelDataScope">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+// import { listRole, getRole, delRole, addRole, updateRole, dataScope, changeRoleStatus, deptTreeSelect } from "@/api/system/role";
+// import { treeselect as menuTreeselect, roleMenuTreeselect } from "@/api/system/menu";
+import {debounce} from "lodash";
+
+export default {
+  name: "Role",
+  dicts: ['sys_normal_disable'],
+  data() {
+    return {
+      statusOptions: [
+        {value: '0', label: '正常'},
+        {value: '1', label: '停用'}
+      ],
+      showTable: true,
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      currentPage: 1,
+      pageSize: 10,
+      // 总条数
+      total: 0,
+      // 角色表格数据
+      roleList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 是否显示弹出层(数据权限)
+      openDataScope: false,
+      menuExpand: false,
+      menuNodeAll: false,
+      deptExpand: true,
+      deptNodeAll: false,
+      // 日期范围
+      dateRange: [],
+      // 数据范围选项
+      dataScopeOptions: [
+        {
+          value: "1",
+          label: "全部数据权限"
+        },
+        {
+          value: "2",
+          label: "自定数据权限"
+        },
+        {
+          value: "3",
+          label: "本部门数据权限"
+        },
+        {
+          value: "4",
+          label: "本部门及以下数据权限"
+        },
+        {
+          value: "5",
+          label: "仅本人数据权限"
+        }
+      ],
+      // 菜单列表
+      menuOptions: [],
+      // 部门列表
+      deptOptions: [],
+      // 查询参数
+      queryParams: {
+        roleName: undefined,
+        roleKey: undefined,
+        status: undefined
+      },
+      // 表单参数
+      form: {},
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
+      // 表单校验
+      rules: {
+        roleName: [
+          {required: true, message: "角色名称不能为空", trigger: "blur"}
+        ],
+        roleKey: [
+          {required: true, message: "权限字符不能为空", trigger: "blur"}
+        ],
+        roleSort: [
+          {required: true, message: "角色顺序不能为空", trigger: "blur"}
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询角色列表 */
+    getList: debounce(function () {
+      this.loading = true;
+      var searchParams = {
+        currentPage: this.currentPage,
+        pageSize: this.pageSize,
+        roleName: this.queryParams.roleName,
+        roleKey: this.queryParams.roleKey,
+        status: this.queryParams.status
+      }
+      this.$axios.get('/sysRoleController/getAll',
+        {params: searchParams}).then((res) => {
+        this.roleList = res.data.records
+        this.total = res.data.total
+        if (res.data.records == '') {
+          this.showTable = false
+        } else {
+          this.showTable = true
+        }
+        this.loading = false
+      }).catch((error) => {
+        // this.$message.error('获取数据出错' + error)
+      })
+    }, 500),
+    handlePageChange({currentPage, pageSize}) {
+      this.currentPage = currentPage
+      this.pageSize = pageSize
+      this.getList()
+    },
+    // 列表状态格式化
+    statusFormat({cellValue}) {
+      let belongTo = '未知的类型'
+      for (let i = 0; i < this.statusOptions.length; i++) {
+        if (cellValue == "0") {
+          belongTo = "正常"
+        } else if (cellValue == "1") {
+          belongTo = "停用"
+        }
+      }
+      return belongTo
+    },
+    /** 查询菜单树结构 */
+    getMenuTreeselect() {
+      this.$axios.get('/sysMenuController/treeselect').then((res) => {
+        this.menuOptions = res.data
+      }).catch((error) => {
+        // this.$message.error('获取数据出错' + error)
+      })
+    },
+    // 所有菜单节点数据
+    getMenuAllCheckedKeys() {
+      // 目前被选中的菜单节点
+      let checkedKeys = this.$refs.menu.getCheckedKeys();
+      // 半选中的菜单节点
+      let halfCheckedKeys = this.$refs.menu.getHalfCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    // 所有部门节点数据
+    getDeptAllCheckedKeys() {
+      // 目前被选中的部门节点
+      let checkedKeys = this.$refs.dept.getCheckedKeys();
+      // 半选中的部门节点
+      let halfCheckedKeys = this.$refs.dept.getHalfCheckedKeys();
+      checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
+      return checkedKeys;
+    },
+    /** 根据角色ID查询菜单树结构 */
+    getRoleMenuTreeselect(roleId) {
+      return roleMenuTreeselect(roleId).then(response => {
+        this.menuOptions = response.menus;
+        return response;
+      });
+    },
+    /** 根据角色ID查询部门树结构 */
+    getDeptTree(roleId) {
+      return deptTreeSelect(roleId).then(response => {
+        this.deptOptions = response.depts;
+        return response;
+      });
+    },
+    // 角色状态修改
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "启用" : "停用";
+      this.$modal.confirm('确认要"' + text + '""' + row.roleName + '"角色吗?').then(function () {
+        return changeRoleStatus(row.roleId, row.status);
+      }).then(() => {
+        this.$modal.msgSuccess(text + "成功");
+      }).catch(function () {
+        row.status = row.status === "0" ? "1" : "0";
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 取消按钮(数据权限)
+    cancelDataScope() {
+      this.openDataScope = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      if (this.$refs.menu != undefined) {
+        this.$refs.menu.setCheckedKeys([]);
+      }
+      this.menuExpand = false,
+        this.menuNodeAll = false,
+        this.deptExpand = true,
+        this.deptNodeAll = false,
+        this.form = {
+          roleId: undefined,
+          roleName: undefined,
+          roleKey: undefined,
+          roleSort: 0,
+          status: "0",
+          menuIds: [],
+          deptIds: [],
+          menuCheckStrictly: true,
+          deptCheckStrictly: true,
+          remark: undefined
+        };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.dateRange = [];
+      this.resetForm("queryForm");
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.roleId)
+      this.single = selection.length != 1
+      this.multiple = !selection.length
+    },
+    // 更多操作触发
+    handleCommand(command, row) {
+      switch (command) {
+        case "handleDataScope":
+          this.handleDataScope(row);
+          break;
+        case "handleAuthUser":
+          this.handleAuthUser(row);
+          break;
+        default:
+          break;
+      }
+    },
+    // 树权限(展开/折叠)
+    handleCheckedTreeExpand(value, type) {
+      if (type == 'menu') {
+        let treeList = this.menuOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.menu.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      } else if (type == 'dept') {
+        let treeList = this.deptOptions;
+        for (let i = 0; i < treeList.length; i++) {
+          this.$refs.dept.store.nodesMap[treeList[i].id].expanded = value;
+        }
+      }
+    },
+    // 树权限(全选/全不选)
+    handleCheckedTreeNodeAll(value, type) {
+      if (type == 'menu') {
+        this.$refs.menu.setCheckedNodes(value ? this.menuOptions : []);
+      } else if (type == 'dept') {
+        this.$refs.dept.setCheckedNodes(value ? this.deptOptions : []);
+      }
+    },
+    // 树权限(父子联动)
+    handleCheckedTreeConnect(value, type) {
+      if (type == 'menu') {
+        this.form.menuCheckStrictly = value ? true : false;
+      } else if (type == 'dept') {
+        this.form.deptCheckStrictly = value ? true : false;
+      }
+    },
+    /** 新增按钮操作 */
+    handleAdd: debounce(function () {
+      this.reset();
+      this.getMenuTreeselect();
+      this.open = true;
+      this.title = "添加角色";
+    }, 500),
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const roleId = row.roleId || this.ids
+      const roleMenu = this.getRoleMenuTreeselect(roleId);
+      getRole(roleId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.$nextTick(() => {
+          roleMenu.then(res => {
+            let checkedKeys = res.checkedKeys
+            checkedKeys.forEach((v) => {
+              this.$nextTick(() => {
+                this.$refs.menu.setChecked(v, true, false);
+              })
+            })
+          });
+        });
+        this.title = "修改角色";
+      });
+    },
+    /** 选择角色权限范围触发 */
+    dataScopeSelectChange(value) {
+      if (value !== '2') {
+        this.$refs.dept.setCheckedKeys([]);
+      }
+    },
+    /** 分配数据权限操作 */
+    handleDataScope(row) {
+      this.reset();
+      const deptTreeSelect = this.getDeptTree(row.roleId);
+      getRole(row.roleId).then(response => {
+        this.form = response.data;
+        this.openDataScope = true;
+        this.$nextTick(() => {
+          deptTreeSelect.then(res => {
+            this.$refs.dept.setCheckedKeys(res.checkedKeys);
+          });
+        });
+        this.title = "分配数据权限";
+      });
+    },
+    /** 分配用户操作 */
+    handleAuthUser: function (row) {
+      const roleId = row.roleId;
+      this.$router.push("/system/role-auth/user/" + roleId);
+    },
+    /** 提交按钮 */
+    submitForm: debounce(function () {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.roleId != undefined) {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+            updateRole(this.form).then(response => {
+              this.$modal.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            this.form.menuIds = this.getMenuAllCheckedKeys();
+
+            this.$axios.post('/sysRoleController', this.form).then((res) => {
+              if (res.code == 0) {
+                this.$message.success('新增成功')
+                this.open = false;
+                this.reset();
+                this.getList();
+              }
+              if (res.code == 1) {
+                this.$message.error(res.data)
+              }
+              this.loading = false
+            }).catch((error) => {
+              // this.$message.error(error)
+              this.loading = false
+            })
+          }
+        }
+      });
+    }, 500),
+    /** 提交按钮(数据权限) */
+    submitDataScope: function () {
+      if (this.form.roleId != undefined) {
+        this.form.deptIds = this.getDeptAllCheckedKeys();
+        dataScope(this.form).then(response => {
+          this.$modal.msgSuccess("修改成功");
+          this.openDataScope = false;
+          this.getList();
+        });
+      }
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const roleIds = row.roleId || this.ids;
+      this.$modal.confirm('是否确认删除角色编号为"' + roleIds + '"的数据项?').then(function () {
+        return delRole(roleIds);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      this.download('system/role/export', {
+        ...this.queryParams
+      }, `role_${new Date().getTime()}.xlsx`)
+    }
+  }
+};
+</script>
+
+<style scoped>
+/* tree border */
+.tree-border {
+  margin-top: 5px;
+  border: 1px solid #e5e6e7;
+  background: #FFFFFF none;
+  border-radius:4px;
+}
+</style>

+ 13 - 12
ui/src/views/sysManager/userManager/index.vue

@@ -24,18 +24,18 @@
           </el-form-item>
           </el-form-item>
           <el-form-item label="用户状态" prop="status">
           <el-form-item label="用户状态" prop="status">
             <el-select
             <el-select
-              v-model="queryParams.status"
-              placeholder="请选择用户状态"
-              clearable
-              style="width: 240px"
-            >
-              <el-option
-                v-for="item in statusOptions"
-                :key="item.value"
-                :label="item.label"
-                :value="item.value">
-              </el-option>
-            </el-select>
+            v-model="queryParams.status"
+            placeholder="请选择用户状态"
+            clearable
+            style="width: 240px"
+          >
+            <el-option
+              v-for="item in statusOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
           </el-form-item>
           </el-form-item>
           <el-form-item>
           <el-form-item>
             <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
             <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@@ -285,6 +285,7 @@ export default {
     },
     },
     /** 查询用户列表 */
     /** 查询用户列表 */
     getList:debounce(function(){
     getList:debounce(function(){
+      console.log("==============查询用户列表===================")
       this.loading = true;
       this.loading = true;
       var searchParams = {
       var searchParams = {
         currentPage: this.currentPage,
         currentPage: this.currentPage,

+ 1 - 7
ui/src/views/sysManager/userManager/profile/index.vue

@@ -43,14 +43,8 @@
 <script>
 <script>
 
 
 import resetPwd from "./resetPwd";
 import resetPwd from "./resetPwd";
-import { mapGetters } from 'vuex'
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 export default {
 export default {
-  computed: {
-    ...mapGetters([
-      'userinfo'
-    ])
-  },
   name: "Profile",
   name: "Profile",
   components: {  resetPwd },
   components: {  resetPwd },
   data() {
   data() {
@@ -60,7 +54,7 @@ export default {
   },
   },
   created() {
   created() {
     // 用户信息解密
     // 用户信息解密
-    let decryptUserInfo = userinfoDecrypt(this.userinfo)
+    let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
     this.user = JSON.parse(decryptUserInfo)
     this.user = JSON.parse(decryptUserInfo)
   },
   },
   methods: {
   methods: {

+ 6 - 6
ui/src/views/sysManager/userManager/profile/resetPwd.vue

@@ -21,11 +21,11 @@ import { mapGetters } from 'vuex'
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 import {doEncrypt, doDecryptStr,doSign,doVerifySignature,userinfoEncrypt,userinfoDecrypt} from '@/utils/smutil'
 import { debounce } from 'lodash'
 import { debounce } from 'lodash'
 export default {
 export default {
-  computed: {
-    ...mapGetters([
-      'userinfo'
-    ])
-  },
+  // computed: {
+  //   ...mapGetters([
+  //     'userinfo'
+  //   ])
+  // },
   data() {
   data() {
     const equalToPassword = (rule, value, callback) => {
     const equalToPassword = (rule, value, callback) => {
       if (this.pwd.newPassword !== value) {
       if (this.pwd.newPassword !== value) {
@@ -116,7 +116,7 @@ export default {
             return
             return
           }
           }
           // 用户信息解密
           // 用户信息解密
-          let decryptUserInfo = userinfoDecrypt(this.userinfo)
+          let decryptUserInfo = userinfoDecrypt(sessionStorage.getItem('userinfo'))
           this.user = JSON.parse(decryptUserInfo)
           this.user = JSON.parse(decryptUserInfo)
           const param = {
           const param = {
             id: this.user.id,
             id: this.user.id,

+ 1 - 1
ui/vue.config.js

@@ -24,7 +24,7 @@ module.exports = {
    * In most cases please use '/' !!!
    * In most cases please use '/' !!!
    * Detail: https://cli.vuejs.org/config/#publicpath
    * Detail: https://cli.vuejs.org/config/#publicpath
    */
    */
-  publicPath: './',
+  publicPath: '/',
   outputDir: 'dist',
   outputDir: 'dist',
   assetsDir: 'assets',
   assetsDir: 'assets',
   // lintOnSave: process.env.NODE_ENV === 'development',
   // lintOnSave: process.env.NODE_ENV === 'development',