13693261870
2024-11-29 3654d020769c0c637e7cb7fea88afdf6618b76e6
Merge branch 'master' of http://192.168.11.205:9000/r/se-cloud
已添加1个文件
已修改5个文件
458 ■■■■ 文件已修改
se-ui/src/layout/components/Navbar.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/permission.js 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/role/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/rolePower/index.vue 359 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/views/system/user/profile/userInfo.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
se-ui/src/layout/components/Navbar.vue
@@ -105,7 +105,7 @@
          this.$store.dispatch("LogOut").then(() => {
              console.log(process.env.NODE_ENV);
            if (process.env.NODE_ENV == "development") {
              window.location.href = "http://localhost:8080/login";
              window.location.href =  window.location.origin + "/login";
            } else if (process.env.NODE_ENV == "production") {
              window.location.href = window.location.origin + "/sso/login";
            }
se-ui/src/permission.js
@@ -1,73 +1,76 @@
import router from './router'
import store from './store'
import { Message } from 'element-ui'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth'
import { isRelogin } from '@/utils/request'
import router from "./router";
import store from "./store";
import { Message } from "element-ui";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import { getToken } from "@/utils/auth";
import { isRelogin } from "@/utils/request";
NProgress.configure({ showSpinner: false })
NProgress.configure({ showSpinner: false });
const whiteList = ['/login', '/register']
const whiteList = ["/login", "/register"];
router.beforeEach((to, from, next) => {
  NProgress.start()
  NProgress.start();
  if (getToken()) {
    to.meta.title && store.dispatch('settings/setTitle', to.meta.title)
    to.meta.title && store.dispatch("settings/setTitle", to.meta.title);
    /* has token*/
    if (to.path === '/login') {
      if (process.env.NODE_ENV == 'development') {
        window.location.href = 'http://localhost:8080/login'
      } else if (process.env.NODE_ENV == 'production') {
        window.location.href = window.location.origin + '/sso/login'
    if (to.path === "/login") {
      if (process.env.NODE_ENV == "development") {
        window.location.href = window.location.origin + "/login";
      } else if (process.env.NODE_ENV == "production") {
        window.location.href = window.location.origin + "/sso/login";
      }
      // next({ path: '/' })
      NProgress.done()
      NProgress.done();
    } else if (whiteList.indexOf(to.path) !== -1) {
      next()
      next();
    } else {
      if (store.getters.roles.length === 0) {
        isRelogin.show = true
        isRelogin.show = true;
        // åˆ¤æ–­å½“前用户是否已拉取完user_info信息
        store.dispatch('GetInfo').then(() => {
          isRelogin.show = false
          store.dispatch('GenerateRoutes').then(accessRoutes => {
        store
          .dispatch("GetInfo")
          .then(() => {
            isRelogin.show = false;
            store.dispatch("GenerateRoutes").then((accessRoutes) => {
            // æ ¹æ®roles权限生成可访问的路由表
            router.addRoutes(accessRoutes) // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
            next({ ...to, replace: true }) // hack方法 ç¡®ä¿addRoutes已完成
              router.addRoutes(accessRoutes); // åŠ¨æ€æ·»åŠ å¯è®¿é—®è·¯ç”±è¡¨
              next({ ...to, replace: true }); // hack方法 ç¡®ä¿addRoutes已完成
            });
          })
        }).catch(err => {
          store.dispatch('LogOut').then(() => {
            Message.error(err)
          .catch((err) => {
            store.dispatch("LogOut").then(() => {
              Message.error(err);
            console.log(process.env.NODE_ENV);
            if (process.env.NODE_ENV == 'development') {
              window.location.href = 'http://localhost:8080/login'
            } else if (process.env.NODE_ENV == 'production') {
              window.location.href = window.location.origin + '/sso/login'
              if (process.env.NODE_ENV == "development") {
                window.location.href = window.location.origin + "/login";
              } else if (process.env.NODE_ENV == "production") {
                window.location.href = window.location.origin + "/sso/login";
            }
            // next({ path: '/' })
          })
        })
            });
          });
      } else {
        next()
        next();
      }
    }
  } else {
    // æ²¡æœ‰token
    if (whiteList.indexOf(to.path) !== -1) {
      // åœ¨å…ç™»å½•白名单,直接进入
      next()
      next();
    } else {
      if (process.env.NODE_ENV == 'development') {
        window.location.href = 'http://localhost:8080/login'
      } else if (process.env.NODE_ENV == 'production') {
        window.location.href = window.location.origin + '/sso/login'
      if (process.env.NODE_ENV == "development") {
        window.location.href =  window.location.origin + "/login";
      } else if (process.env.NODE_ENV == "production") {
        window.location.href = window.location.origin + "/sso/login";
      }
      NProgress.done()
      NProgress.done();
    }
  }
})
});
router.afterEach(() => {
  NProgress.done()
})
  NProgress.done();
});
se-ui/src/utils/request.js
@@ -90,7 +90,7 @@
        store.dispatch('LogOut').then(() => {
          console.log(process.env.NODE_ENV);
          if (process.env.NODE_ENV == "development") {
            window.location.href = "http://localhost:8080/login";
            window.location.href =  window.location.origin + "/login";
          } else if (process.env.NODE_ENV == "production") {
            window.location.href = window.location.origin + "/sso/login";
se-ui/src/views/system/role/index.vue
@@ -206,7 +206,7 @@
              >{{dict.label}}</el-radio>
            </el-radio-group>
          </el-form-item>
          <el-form-item label="菜单权限">
          <el-form-item label="菜单权限" v-show="false">
            <el-checkbox
              v-model="menuExpand"
              @change="handleCheckedTreeExpand($event, 'menu')"
se-ui/src/views/system/rolePower/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,359 @@
<template>
    <div class="app-container">
        <div>
            <el-form :inline="true" :model="formInline" class="demo-form-inline">
                <el-form-item label="用户名称:">
                    <el-input v-model="formInline.roleName" ize="mini" placeholder="请输入用户名称"></el-input>
                </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>
        </div>
        <el-divider></el-divider>
        <div class="roleCotent">
            <div class="roleLeft roleBox">
                <div class="roleTable">
                    <el-table ref="roleTable" highlight-current-row :data="tableData" @row-click="handleRoleClick"
                        style="width: 100%" height="calc(100% - 1px)">
                        <el-table-column label="角色编号" prop="roleId" align="center" />
                        <el-table-column label="角色名称" prop="roleName" align="center" />
                        <el-table-column label="权限字符" prop="roleKey" align="center" />
                        <el-table-column label="显示顺序" prop="roleSort" align="center" />
                        <el-table-column label="创建时间" align="center" prop="createTime">
                            <template slot-scope="scope">
                                <span>{{ parseTime(scope.row.createTime) }}</span>
                            </template>
                        </el-table-column>
                    </el-table>
                </div>
                <div class="rolePage">
                    <pagination v-show="formInline.total > 0" :total="formInline.total" :page.sync="formInline.pageNum"
                        :limit.sync="formInline.pageSize" @pagination="getList" />
                </div>
            </div>
            <div class="roleRight roleBox">
                <el-form>
                    <el-form-item label="菜单权限" v-show="false">
                       <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-form-item>
                </el-form>
                <div class="roleTreeBox">
                    <div class="treeBox">
                        <el-tree ref="powerTree" class="tree-border" :data="menuOptions" show-checkbox node-key="id"
                            :check-strictly="!form.menuCheckStrictly" empty-text="加载中,请稍候"
                            :default-expanded-keys="expanded" :props="defaultProps"></el-tree>
                    </div>
                </div>
                <div class="roeleSubmit">
                    <el-button type="primary" icon="el-icon-upload2" size="mini" @click="handleUpload">提交</el-button>
                </div>
            </div>
        </div>
    </div>
</template>
<script>
import {
    addRole,
    listRole,
    getRole,
    updateRole,
} from "@/api/system/role";
import {
    treeselect as menuTreeselect,
    roleMenuTreeselect
} from "@/api/system/menu"
export default {
    data() {
        return {
            formInline: {
                roleName: '',
                total: 0,
                pageNum: 1,
                pageSize: 10,
            },
            tableData: [],
            checkRow: null,
            form: {},
            menuOptions: [],
            checkedKeys: [],
            defaultProps: {
                children: "children",
                label: "label"
            },
            menuExpand: false,
            menuNodeAll: false,
            menuIds: [],
            expanded: []
        }
    },
    mounted() {
        this.resetQuery();
    },
    methods: {
        // æœç´¢äº‹ä»¶
        handleQuery() {
            this.formInline.pageNum = 1
            this.getRoleData();
        },
        // é‡ç½®äº‹ä»¶
        resetQuery() {
            this.formInline = {
                roleName: '',
                total: 0,
                pageNum: 1,
                pageSize: 10,
            }
            this.$nextTick(() => {
                this.getRoleData();
            })
        },
        // åˆ†é¡µç‚¹å‡»äº‹ä»¶
        getList() {
            this.getRoleData();
        },
        // è¡¨æ ¼è¡Œç‚¹å‡»äº‹ä»¶
        handleRoleClick(row, column, event) {
            this.checkRow = row;
            this.getTreePower();
        },
        // èŽ·å–è§’è‰²åˆ—è¡¨æ•°æ®
        getRoleData() {
            listRole(this.formInline).then(response => {
                if (response.code != 200) {
                    return this.$message({
                        message: '角色列表查询失败',
                        type: 'warning'
                    });
                };
                this.formInline.total = response.total;
                var table_data = response.rows.filter(item => {
                    if (item.roleId != 1) {
                        return item
                    }
                })
                this.tableData = table_data;
                this.checkRow = this.tableData[0];
                this.getTreePower();
                this.$refs.roleTable.setCurrentRow(this.checkRow);
            })
        },
        // èŽ·å–èœå•æƒé™
        getTreePower() {
            this.menuExpand = false;
            this.menuNodeAll = false;
            this.menuOptions = [];
            this.checkedKeys = [];
            this.menuIds = [];
            roleMenuTreeselect(this.checkRow.roleId).then(response => {
                if (response.code != 200) {
                    return this.$message({
                        message: '菜单列表查询失败',
                        type: 'warning'
                    });
                }
                this.menuOptions = response.menus;
                this.menuIds = this.getMenuIds(this.menuOptions, [])
                this.checkedKeys = response.checkedKeys;
                this.expanded= [this.menuOptions[0].id]
                this.getRole()
            });
        },
        getMenuIds(node, ids) {
            for (var i in node) {
                const child = node[i];
                if (child.children) {
                    this.getMenuIds(child.children, ids)
                } else {
                    ids.push(node[i].id)
                }
            }
            return ids;
        },
        // æ ¹æ®id æŸ¥è¯¢è§’色
        getRole() {
            getRole(this.checkRow.roleId).then(response => {
                if (response.code != 200) {
                    return this.$message({
                        message: '角色信息获取失败',
                        type: 'warning'
                    });
                }
                this.form = response.data
                let checkedKeys = this.checkedKeys;
                checkedKeys.forEach(v => {
                    this.$nextTick(() => {
                        this.$refs.powerTree.setChecked(v, true, false);
                    });
                });
            })
        },
        isElTreeAllSelected(tree) {
            // å‡è®¾tree是el-tree的实例,可以通过Vue实例访问到
            const getAllNodes = (tree) => {
                let allNodes = [];
                const traverse = (node) => {
                    allNodes.push(node);
                    node.childNodes.forEach((child) => traverse(child));
                };
                traverse(tree);
                return allNodes;
            };
            const allNodes = getAllNodes(tree); // èŽ·å–æ‰€æœ‰èŠ‚ç‚¹
            return allNodes.every(node => node.checked); // æ£€æŸ¥æ¯ä¸ªèŠ‚ç‚¹æ˜¯å¦é€‰ä¸­
        },
        // æ ‘权限(全选/全不选)
        handleCheckedTreeNodeAll(value, type) {
            if (type == "menu") {
                this.$refs.powerTree.setCheckedNodes(value ? this.menuOptions : []);
            } else if (type == "dept") {
                this.$refs.dept.setCheckedNodes(value ? this.deptOptions : []);
            }
        },
        // æ ‘权限(展开/折叠)
        handleCheckedTreeExpand(value, type) {
            if (type == "menu") {
                let treeList = this.menuOptions;
                for (let i = 0; i < treeList.length; i++) {
                    this.$refs.powerTree.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;
                }
            }
        },
        // æ‰€æœ‰èœå•节点数据
        getMenuAllCheckedKeys() {
            // ç›®å‰è¢«é€‰ä¸­çš„菜单节点
            let checkedKeys = this.$refs.powerTree.getCheckedKeys();
            // åŠé€‰ä¸­çš„菜单节点
            let halfCheckedKeys = this.$refs.powerTree.getHalfCheckedKeys();
            checkedKeys.unshift.apply(checkedKeys, halfCheckedKeys);
            return checkedKeys;
        },
        //修改提交
        handleUpload() {
            if (this.form.roleId != undefined) {
                this.form.menuIds = this.getMenuAllCheckedKeys();
                updateRole(this.form).then(response => {
                    this.$modal.msgSuccess("修改成功");
                    this.getTreePower();
                });
            } else {
                this.form.menuIds = this.getMenuAllCheckedKeys();
                addRole(this.form).then(response => {
                    this.$modal.msgSuccess("新增成功");
                    this.getTreePower();
                });
            }
        }
    }
}
</script>
<style lang="scss" scoped>
.app-container {
    height: calc(100vh - 84px);
    width: 100%;
    position: absolute;
    display: flex;
    flex-direction: column;
    .roleCotent {
        flex: 1;
        display: flex;
    }
    .roleRight {
        flex: 1;
        padding: 10px;
        display: flex;
        flex-direction: column;
        .roeleSubmit {
            margin: 10px 0px;
            width: 100%;
            display: flex;
            justify-content: end;
        }
        .roleTreeBox {
            flex: 1;
            position: relative;
            .treeBox {
                // padding: 10px;
                overflow: auto;
                width: 100%;
                height: 100%;
                position: absolute;
                // border: 1px solid #e5e6e7;
                // background: #FFFFFF none;
                border-radius: 4px;
                ::v-deep .tree-border {
                    margin: 0;
                    border: transparent;
                }
            }
        }
    }
    .roleLeft {
        width: 60%;
        height: 100%;
        margin-right: 1%;
        position: relative;
        display: flex;
        flex-direction: column;
        .roleTable {
            flex: 1;
        }
        .rolePage {
            margin: 10px 20px 20px 0px;
        }
    }
    .roleBox {
        border: 1px solid #DCDFE6;
        box-shadow: 0px 0px 4px 0px rgba(14, 22, 32, 0.2);
        border-radius: 10px;
    }
    ::v-deep .el-divider--horizontal {
        margin: 0px 0px 22px 0px;
    }
}
</style>
se-ui/src/views/system/user/profile/userInfo.vue
@@ -1,6 +1,6 @@
<template>
  <el-form ref="form" :model="form" :rules="rules" label-width="80px">
    <el-form-item label="用户昵称" prop="nickName">
    <el-form-item label="用户姓名" prop="nickName">
      <el-input v-model="form.nickName" maxlength="30" />
    </el-form-item> 
    <el-form-item label="手机号码" prop="phonenumber">
@@ -37,7 +37,7 @@
      // è¡¨å•校验
      rules: {
        nickName: [
          { required: true, message: "用户昵称不能为空", trigger: "blur" }
          { required: true, message: "用户姓名不能为空", trigger: "blur" }
        ],
        email: [
          { required: true, message: "邮箱地址不能为空", trigger: "blur" },