主页

15.职位管理和职称管理功能介绍

职位管理和职称管理主要是表格的应用,考虑到这里数据量并不大,因此并未分页,效果如下: 15.1 职位管理 15.2 职称管理 两个表格其实差不多,但是有点小差异。职称管理中多了一个职称等级下拉框,其他基本都是一致的。 扫码关注微信公众号 江南一点雨,回复 2TB,获取超 2TB Java 学习教程~

阅读更多

14.Tree树形控件使用要点

树形控件主要使用了 ElementUI 中的控件,ElementUI 中树的加载可以通过 load 属性一个一个懒加载,在官方的案例中有这种用法,个人非常不推荐这种用法,很麻烦。我的主要思路如下: 在页面加载时,我在 mounted 方法中就去获取了所有的部门数据,然后直接加载到树上(这种方式比较省事,特别是处理后面动态添加删除时很方便,小伙伴在工作中可以根据实际情况选取合适的策略)。核心代码如下: this.getRequest("/system/basic/dep/-1").then(resp=> { _this.treeLoading = false; if (resp && resp.status == 200) { _...

阅读更多

13.递归查询与存储过程调用

后台程序也都是常规代码,我们重点关注两点: 递归调用 存储过程调用 13.1 递归调用 由于部门的层级不可控,因此如果我想要获取所有部门的完整 json 的话,就要采用递归调用,这里的递归调用我们可以利用 MyBatis 的 ResultMap 中的 collection 实现,核心代码如下: <resultMap id="BaseResultMap" type="org.sang.bean.Department"> <id property="id" column="id"/> <result column="name" property="name"/> <result column="paren...

阅读更多

12.部门数据库设计与存储过程编写

部门数据库整体来说还是比较简单,如下: 都是常规字段,脚本可以在项目中下载。depPath 是为了查询方便,isParent 表示该条是否是父部门。为了简化程序中的逻辑,depPath 的设置和 isParent 的设置我都在存储过程中完成。 12.1 添加部门存储过程 添加部门存储过程如下: DELIMITER $$ USE `vhr`$$ DROP PROCEDURE IF EXISTS `addDep`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `addDep`(in depName varchar(32),in parentId int,in enabled boolean,out result int,out...

阅读更多

11.用户角色关系管理

这个就是常规的增删改查。 11.1 用户展示 用户的展示使用了 ElementUI 的 Card 卡片 来实现。效果图如下: 11.2 角色展示 角色展示使用了ElementUI的 Tag 标签 来实现,角色后面有一个 more 按钮,点击之后是一个 Popover 弹出框,Popover 弹出框的里边是一个 Select 选择器,多选的,可以进行角色的分配。 扫码关注微信公众号 江南一点雨,回复 2TB,获取超 2TB Java 学习教程~

阅读更多

10.角色资源关系管理

这个主要是给不同角色分配不同的资源。 10.1 角色展示 角色的展示采用了 ElementUI 中的 Collapse 折叠面板,并且采用了手风琴模式,即一次只打开一个角色,如下图: 角色中资源的展示则采用了 ElementUI 中的树形控件,管理员可以直接直接点击勾选,然后点击修改按钮,进行资源的分配。 10.2 核心思路 核心代码如下: <el-collapse v-model="activeColItem" accordion style="width: 500px;" @change="collapseChange"> <el-collapse-item v-for="(item,index) in roles" :title="item.na...

阅读更多

09.登录成功后动态加载组件

在权限管理模块中,这算是前端的核心了。 9.1 核心思路 用户在登录成功之后,进入 home 主页之前,向服务端发送请求,要求获取当前的菜单信息和组件信息,服务端根据当前用户所具备的角色,以及角色所对应的资源,返回一个 json 字符串,格式如下: [ { "id": 2, "path": "/home", "component": "Home", "name": "员工资料", "iconCls": "fa fa-user-circle-o", "children": [ { "id": null, ...

阅读更多

08.登录状态的保存

当用户登录成功之后,需要将当前用户的登录信息保存在本地,方便后面使用。具体实现如下: 8.1 登录成功保存数据 在登录操作执行成功之后,通过commit操作将数据提交到 store 中,核心代码如下: this.postRequest('/login', { username: this.loginForm.username, password: this.loginForm.password }).then(resp=> { if (resp && resp.status == 200) { var data = resp.data; _this.$store.commit('login', data.msg); ...

阅读更多

07.将请求方法挂到Vue上

由于我对 axios 进行了封装,因此在每一个需要使用 axios 的地方,都需要导入相应的请求,略显麻烦,参考https://cn.vuejs.org/v2/guide/plugins.html,我将请求方法挂到 Vue 上,具体操作如下: 在 main.js 中导入所有的请求方法,如下: import {getRequest} from './utils/api' import {postRequest} from './utils/api' import {deleteRequest} from './utils/api' import {putRequest} from './utils/api' 把它们添加到 Vue.prototype 上,如下: ...

阅读更多

06.axios请求封装,请求异常统一处理

前端采用了 axios 来处理网络请求,为了避免在每次请求时都去判断各种各样的网络情况,比如连接超时、服务器内部错误、权限不足等等不一而足,我对 axios 进行了简单的封装,这里主要使用了 axios 中的拦截器功能。 封装后的网络请求工具 js 如下: import axios from 'axios' import {Message} from 'element-ui' axios.interceptors.request.use(config=> { return config; }, err=> { Message.error({message: '请求超时!'}); return Promise.resolve(err); }) axios.i...

阅读更多