一、简介

abp vNext微服务框架中已经提供通用权限和用户角色管理模块,管理UI使用的是MVC模式,不适用于国内主打的MVVM开发模式。在前端框架选型后笔者决定改造abp vNext微服务框架中原有的管理UI,使用vue流行的后台管理框架Vue Element Admin进行替换。本篇将介绍abp vNext微服务的前后端分离和Vue Element Admin后台管理的页面开发。

二、开始前

abp vNext微服务框架十分复杂,所以开始前你可能需要以下准备工作。

准备一:abp vNext微服务开发环境搭建

准备二:abp vNext前后端分类指南

三、Vue Element Admin管理页面开发

step1:角色管理页面

在views目录下添加role文件夹

设计list显示页面

代码:

  1. <div class="app-container">
  2. <div class="filter-container">
  3. <el-input
  4. v-model="listQuery.name"
  5. placeholder="搜索..."
  6. style="width: 400px;"
  7. class="filter-item"
  8. @keyup.enter.native="handleFilter"
  9. />
  10. <el-button
  11. v-waves
  12. class="filter-item"
  13. type="primary"
  14. icon="el-icon-search"
  15. @click="handleFilter"
  16. >搜索</el-button>
  17. <router-link :to="'/system/roleCreate'">
  18. <el-button
  19. class="filter-item"
  20. style="margin-left: 10px;"
  21. type="primary"
  22. icon="el-icon-edit"
  23. v-permission="['AbpIdentity.Roles.Create']"
  24. >添加</el-button>
  25. </router-link>
  26.  
  27. </div>
  28.  
  29. <el-table
  30. v-loading="listLoading"
  31. :data="list"
  32. border
  33. fit
  34. highlight-current-row
  35. style="width: 100%;"
  36. >
  37. <el-table-column label="角色名" prop="name" align="center" width="400">
  38. <template slot-scope="scope">
  39. <span>{{ scope.row.name }}</span>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="操作" align="center" width="600" class-name="small-padding fixed-width">
  43. <template slot-scope="{row}">
  44. <el-button type="primary" size="mini" @click="handleUpdate(row)" v-permission="['AbpIdentity.Roles.Update']">编辑</el-button>
  45. <el-button type="danger" size="mini" @click="handleDelete(row)" :disabled="row.name==='admin'" v-permission="['AbpIdentity.Roles.Delete']">删除</el-button>
  46. </template>
  47. </el-table-column>
  48. </el-table>
  49.  
  50. <pagination
  51. v-show="totalCount>0"
  52. :total="totalCount"
  53. :page.sync="listQuery.page"
  54. :limit.sync="listQuery.limit"
  55. @pagination="getList"
  56. />
  57.  
  58. </div>

设计新增修改页面

代码:

  1. <div class="createPost-container">
  2. <el-form
  3. ref="postForm"
  4. label-position="left"
  5. label-width="70px"
  6. :model="postForm"
  7. :rules="rules"
  8. class="form-container"
  9. >
  10. <sticky :z-index="10" :class-name="'sub-navbar ' + stickyStatus">
  11. <el-button
  12. v-loading="loading"
  13. style="margin-left: 10px;"
  14. type="success"
  15. @click="submitForm"
  16. >保存</el-button>
  17. <el-button v-loading="loading" @click="jump" type="warning">返回</el-button>
  18. </sticky>
  19. <div class="createPost-main-container">
  20. <el-row>
  21. <el-col :span="24">
  22. <el-form-item label="角色名" style="margin-bottom: 40px;" prop="name">
  23. <el-input v-model="postForm.name" :disabled="roleDisable" />
  24. </el-form-item>
  25. </el-col>
  26. </el-row>
  27. <el-form-item label="选择权限">
  28. <el-tree
  29. ref="tree"
  30. default-expand-all
  31. :default-checked-keys="checkedPermission"
  32. :check-strictly="true"
  33. :data="permissionsData"
  34. :props="defaultProps"
  35. show-checkbox
  36. node-key="id"
  37. @check="checkNode"
  38. class="permission-tree"
  39. />
  40. </el-form-item>
  41. </div>
  42. </el-form>
  43. </div>

step2:用户管理页面

在views目录下添加user文件夹

设计list显示页面

代码:

  1. <div class="app-container">
  2. <div class="filter-container">
  3. <el-input
  4. v-model="listQuery.filter"
  5. placeholder="搜索..."
  6. style="width: 200px;"
  7. class="filter-item"
  8. @keyup.enter.native="handleFilter"
  9. />
  10. <el-button
  11. v-waves
  12. class="filter-item"
  13. type="primary"
  14. icon="el-icon-search"
  15. @click="handleFilter"
  16. >搜索</el-button>
  17. <router-link :to="'/system/userCreate'">
  18. <el-button
  19. class="filter-item"
  20. style="margin-left: 10px;"
  21. type="primary"
  22. icon="el-icon-edit"
  23. v-permission="['AbpIdentity.Users.Create']"
  24. >添加</el-button>
  25. </router-link>
  26. </div>
  27.  
  28. <el-table
  29. v-loading="listLoading"
  30. :data="list"
  31. border
  32. fit
  33. highlight-current-row
  34. style="width: 100%;"
  35. @sort-change="sortChange"
  36. >
  37. <el-table-column label="用户名" prop="userName" sortable="custom" align="center" width="150px">
  38. <template slot-scope="{row}">
  39. <span class="link-type" @click="handleUpdate(row)">{{row.userName}}</span>
  40. </template>
  41. </el-table-column>
  42. <el-table-column label="邮箱" prop="email" sortable="custom" align="center" width="200px">
  43. <template slot-scope="scope">
  44. <span>{{scope.row.email}}</span>
  45. </template>
  46. </el-table-column>
  47. <el-table-column label="电话" prop="phoneNumber" sortable="custom" align="center" width="200px">
  48. <template slot-scope="scope">
  49. <span>{{scope.row.phoneNumber}}</span>
  50. </template>
  51. </el-table-column>
  52. <el-table-column label="操作" align="center" width="230" class-name="small-padding fixed-width">
  53. <template slot-scope="{row}">
  54. <el-button type="primary" size="mini" @click="handleUpdate(row)" v-permission="['AbpIdentity.Users.Update']">编辑</el-button>
  55. <el-button
  56. type="danger"
  57. size="mini"
  58. @click="handleDelete(row)"
  59. :disabled="row.userName==='admin'"
  60. v-permission="['AbpIdentity.Users.Delete']"
  61. >删除</el-button>
  62. </template>
  63. </el-table-column>
  64. </el-table>
  65.  
  66. <pagination
  67. v-show="totalCount>0"
  68. :total="totalCount"
  69. :page.sync="page"
  70. :limit.sync="listQuery.MaxResultCount"
  71. @pagination="getList"
  72. />
  73. </div>

设计新增修改页面

代码:

  1. <div class="createPost-container">
  2. <el-form
  3. ref="postForm"
  4. label-position="left"
  5. label-width="70px"
  6. :model="postForm"
  7. :rules="rules"
  8. class="form-container"
  9. >
  10. <sticky :z-index="10" :class-name="'sub-navbar ' + stickyStatus">
  11. <el-button
  12. v-loading="loading"
  13. style="margin-left: 10px;"
  14. type="success"
  15. @click="submitForm"
  16. >保存</el-button>
  17. <el-button v-loading="loading" @click="jump" type="warning">返回</el-button>
  18. </sticky>
  19. <div class="createPost-main-container">
  20. <el-form-item label="用户名" prop="userName">
  21. <el-input id="userName" v-model="postForm.userName" :disabled="isEdit" />
  22. </el-form-item>
  23. <el-form-item label="邮箱" prop="email">
  24. <el-input v-model="postForm.email" ref="mailInput" />
  25. </el-form-item>
  26. <el-form-item label="密码" prop="password">
  27. <el-input type="password" v-model="postForm.password" :disabled="isEdit" />
  28. </el-form-item>
  29. <el-form-item label="名称" prop="name">
  30. <el-input v-model="postForm.name" />
  31. </el-form-item>
  32. <el-form-item label="姓氏" prop="surname">
  33. <el-input v-model="postForm.surname" />
  34. </el-form-item>
  35. <el-form-item label="电话" prop="phoneNumber">
  36. <el-input type="number" v-model="postForm.phoneNumber" />
  37. </el-form-item>
  38. <el-form-item label="角色" prop="roles" outline>
  39. <el-select v-model="checkedRoles" multiple placeholder="请选择" style="display:block">
  40. <el-option
  41. v-for="item in roleList"
  42. :key="item.value"
  43. :label="item.label"
  44. :value="item.value"
  45. ></el-option>
  46. </el-select>
  47. </el-form-item>
  48. </div>
  49. </el-form>
  50. </div>

step3:添加用户、角色动态路由

在router中添加代码:

  1. path: '/system',
  2. component: Layout,
  3. redirect: '/system/role',
  4. alwaysShow : true,
  5. name: 'SystemManagement',
  6. meta: {
  7. title: 'SystemManagement',
  8. icon: 'lock'
  9. },
  10. children: [{
  11. path: 'role',
  12. component: () => import('@/views/role/index'),
  13. name: 'RoleManagement',
  14. meta: {
  15. title: 'roleManagement',
  16. roles: ['AbpIdentity.Roles']
  17. }
  18. },
  19. {
  20. path: 'user',
  21. component: () => import('@/views/user/index'),
  22. name: 'UserManagement',
  23. meta: {
  24. title: 'userManagement',
  25. roles: ['AbpIdentity.Users']
  26. }
  27. }]

查看页面菜单

调用的接口:

  1. //用户列表接口
  2. this.$axios.gets("/api/identity/users", this.listQuery).then(response => {
  3. this.list = response.items;
  4. this.totalCount = response.totalCount;
  5. this.listLoading = false;
  6. });
  7.  
  8. //删除用户接口
  9. this.$axios.deletes("/api/identity/user/" + row.id).then(response => {
  10. const index = this.list.indexOf(row);
  11. this.list.splice(index, 1);
  12. this.$notify({
  13. title: "成功",
  14. message: "删除成功",
  15. type: "success",
  16. duration: 2000
  17. });
  18. });
  19.  
  20. //查找用户、用户角色接口
  21. this.$axios.gets("/api/identity/users/" + id).then(response => {
  22. this.postForm = response;
  23. this.postForm.password = "K2IN-a*kz.a2e4o";
  24. this.setTagsViewTitle();
  25. this.setPageTitle();
  26. this.checkedRoles = [];
  27. this.getAllRoles();
  28. this.$axios.gets("/api/identity/users/" + id + "/roles").then(data => {
  29. data.items.forEach(element => {
  30. this.checkedRoles.push(element.name);
  31. });
  32. });
  33. });
  34.  
  35. //获取角色接口
  36. this.$axios.gets("/api/identity/roles").then(response => {
  37. response.items.forEach(element => {
  38. let options = {};
  39. options.value = element.name;
  40. options.label = element.name;
  41. this.roleList.push(options);
  42. });
  43. });
  44.  
  45. //修改用户接口
  46. this.$axios
  47. .puts("/api/identity/users/" + this.postForm.id, this.postForm)
  48. .then(response => {
  49. this.loading = false;
  50. this.$notify({
  51. title: "成功",
  52. message: "更新成功",
  53. type: "success",
  54. duration: 2000
  55. });
  56. this.jump();
  57. });
  58.  
  59. //新增用户接口
  60. this.$axios
  61. .posts("/api/identity/users", this.postForm)
  62. .then(response => {
  63. this.$notify({
  64. title: "成功",
  65. message: "新增成功",
  66. type: "success",
  67. duration: 2000
  68. });
  69. this.jump();
  70. });
  71.  
  72. //角色列表接口
  73. this.$axios.gets('/api/identity/roles', params).then(response => {
  74. this.list = response.items
  75. //this.totalCount = response.totalCount
  76. this.listLoading = false
  77. })
  78.  
  79. //删除角色接口
  80. this.$axios.deletes('/api/identity/roles/'+row.id).then(response=>{
  81. const index = this.list.indexOf(row)
  82. this.list.splice(index, 1)
  83. this.$notify({
  84. title: '成功',
  85. message: '删除成功',
  86. type: 'success',
  87. duration: 2000
  88. })
  89. })
  90.  
  91. //获取角色、角色权限接口
  92. this.$axios.gets("/api/identity/roles/" + id).then(response => {
  93. this.postForm = response;
  94.  
  95. this.setTagsViewTitle();
  96. this.setPageTitle();
  97.  
  98. this.params.providerKey = this.postForm.name;
  99. this.$axios
  100. .getPermissions("/api/abp/permissions", this.params)
  101. .then(response => {
  102. this.permissionsData = [];
  103. this.checkedPermission = [];
  104. this.setTree(response.groups);
  105. });
  106. });
  107.  
  108. //修改角色、新增角色接口
  109. this.$axios
  110. .puts("/api/identity/roles/" + this.postForm.id, this.postForm)
  111. .then(response => {
  112. this.updatePermission(this.postForm.name);
  113. this.loading = false;
  114. });
  115. this.$axios
  116. .posts("/api/identity/roles", this.postForm)
  117. .then(response => {
  118. this.updatePermission(this.postForm.name);
  119. this.loading = false;
  120. });
  121.  
  122. //修改权限接口
  123. this.$axios
  124. .puts(
  125. "/api/abp/permissions?providerName=Role&providerKey=" + roleName,
  126. params
  127. )
  128. .then(response => {
  129. this.$notify({
  130. title: "成功",
  131. message: "更新成功",
  132. type: "success",
  133. duration: 2000
  134. });
  135. this.jump()
  136. });

移动端适应

四、总结

由于用户、角色权限管理业务十分复杂,因此以上代码无法完整展示所有功能,后续整理后我会单独开源出来方便参考。对于Vue Element Admin管理abp vNext微服务用户、角色、权限的方法已经介绍完了,喜欢折腾的小伙伴根据以上参考尽情研究吧。

文章目录:https://www.cnblogs.com/william-xu/p/12047529.html

[Abp vNext微服务实践] - vue-element-admin管理Identity的更多相关文章

  1. [Abp vNext微服务实践] - 文章目录

    简介 ABP vNext是volosoft的新一代框架,ABP(vNext)完全使用.NET CORE和DDD(领域驱动)打造,目前GitHub已有6K+次提交,发布版本超过40次,Nuget包下载量 ...

  2. [Abp vNext微服务实践] - 前后端分类

    一.前景 abp vNext是ABP 开源 Web应用程序框架,是abp的新一代开源web框架.框架完美的集成.net core.identity server4等开源框架,适用于构建web应用程序和 ...

  3. [Abp vNext微服务实践] - 业务开发

    前几篇分别介绍了abp vNext微服务框架.开发环境搭建和vue element admin前端框架接入,在vue element admin中实现用户角色管理基本功能后就可以开始进行业务开发了,本 ...

  4. [Abp vNext微服务实践] - 框架分析

    一.简介 abp vNext新框架的热度一直都很高,于是最近上手将vNext的微服务Demo做了一番研究.我的体验是,vNext的微服务架构确实比较成熟,但是十分难以上手,对于没有微服务开发经验的.n ...

  5. [Abp vNext微服务实践] - 租户登录

    简介 Abp vNext微服务授权验证基于ids4,实现租户登录需要在授权服务中获取token,和之前的介绍的登录方式一样,只是多了tenant参数.本篇将介绍在Abp vNext授权服务中启用多租户 ...

  6. [Abp vNext微服务实践] - 服务通讯

    简介 服务通讯是微服务架构中必不可少的功能,服务通讯的效率决定了微服务架构的优略.常用的微服务通讯策略有两种,分别是rpc.http,其中rpc以gRpc框架为代表使用者最多.abp vNext微服务 ...

  7. [Abp vNext微服务实践] - 添加中文语言

    简介 abp vNext中提供了多语言功能,默认语言是英文,没有提供中文语言包.在业务开发中,定义权限后需要用中文的备注提供角色选择,本篇将介绍如何在abp vNext中加入中文语言. step1:添 ...

  8. [Abp vNext微服务实践] - 启动流程

    前几篇分别介绍了abp vNext微服务框架和微服务CI/CD环境搭建,本篇开始介绍vNext微服务框架的开发环境搭建. 环境准备 官方介绍的系统架构图如下: 上图中身份服务和网关服务已经集成在系统中 ...

  9. [Abp vNext微服务实践] - vue-element-admin登录二

    简介: Vue Element Admin是基于vue.element ui开发的后台管理ui,abp vNext是abp新一代微服务框架.本篇将会介绍如何改造Vue Element Admin权限验 ...

随机推荐

  1. 初识MyBatis之HelloWorld

    1.先下载MyBatis相关Jar包. 2. 创建数据库和表 CREATE TABLE tbl_employee( id ) PRIMARY KEY AUTO_INCREMENT, last_name ...

  2. 蓝牙AT模式

      一.蓝牙AT模式设置方式 在通电前按住蓝牙模块黑色按钮,接电,当蓝牙指示灯按每隔两秒闪烁一次时进入AT模式: 有3种设置方式: 1.默认设置 模块工作角色:从模式    串口参数:38400bit ...

  3. DNS域名解析系统_1

    DNS服务概述: DNS的模式为C/S模式 DNS(Domain Name System)域名系统,在TCP/IP网络中有非常重要的地位,能够提供域名与ip地址的解析服务. DNS是一个分布式数据库, ...

  4. 添加学生信息(java wb)

    要求: 1.登录账号:要求由6到12位字母.数字.下划线组成,只有字母可以开头: 2.登录密码:要求显示“• ”或“*”表示输入位数,密码要求八位以上字母.数字组成: 3.性别:要求用单选框或下拉框实 ...

  5. find the mincost route【无向图最小环】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1599 Problem Description 杭州有N个景区,景区之间有一些双向的路来连接,现在860 ...

  6. Hadoop之HDFS介绍

    1. 概述 HDFS是一种分布式文件管理系统. HDFS的使用场景: 适合一次写入,多次读出的场景,且不支持文件的修改: 适合用来做数据分析,并不适合用来做网盘应用: 1.2 优缺点 优点: 高容错性 ...

  7. 【AtCoder】ARC067

    ARC067 C - Factors of Factorial 这个直接套公式就是,先求出来每个质因数的指数幂,然后约数个数就是 \((1 + e_{1})(1 + e_{2})(1 + e_{3}) ...

  8. gulp做简单的js压缩

    安装工具 全局安装npm install --global gulp 项目的依赖安装npm install --save-dev gulp npm install --save-dev gulp-re ...

  9. WMIC命令的利用技巧

    WMIC扩展WMI(Windows Management Instrumentation,Windows管理工具),提供了从命令行接口和批命令脚本执行系统管理的支持.在WMIC出现之前,如果要管理WM ...

  10. layui upload 在JS动态加载内容后, 点击按钮无反应

    /** * 根据用户选择的不同规格选项 * 返回 不同的输入框选项 */ function ajaxGetSpecInput2(spec_arr) { var goods_id = $('#goods ...