RBAC权限管理


一、SQL数据库操作

创建数据库,有五个基础的表,分别是用户表,角色表,用户角色表,菜单表,角色菜单表,他们是一对多的关系

一、API后台

在后台中安装依赖包

 安装完之后开始分配类库

 在对应的类库中写相关的操作   Model放在了SysDomain中,数据访问层写在了BaWei.RBACExam.Repository=》Repository

在Startup中操作

using BaWei.RBACExam.Config;
using BaWei.RBACExam.Repository.Repository;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;
using Microsoft.OpenApi.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaWei.RBACExam
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        // This method gets called by the runtime. Use this method to add services to the container.
        public void ConfigureServices(IServiceCollection services)
        {

            //原样输出
            services.AddControllers()
            .AddNewtonsoftJson(options => {
    // 忽略循环引用
    options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
    // 不使用驼峰
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
    // 设置时间格式
    options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
    // 如字段为 null 值,该字段不会返回到前端
    // options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
});
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "BaWei.RBACExam", Version = "v1" });
                c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme()
                {

                    Description = "在下框中输入请求头中需要添加Jwt授权Token:Bearer Token",
                    Name = "Authorization",
                    In = ParameterLocation.Header,
                    Type = SecuritySchemeType.ApiKey,
                    BearerFormat = "JWT",
                    Scheme = "Bearer"
                });
                c.AddSecurityRequirement(new OpenApiSecurityRequirement
                {
                    {
                        new OpenApiSecurityScheme
                        {
                            Reference = new OpenApiReference {
                                Type = ReferenceType.SecurityScheme,
                                Id = "Bearer"
                            }
                        },
                        new string[] { }
                    }
                });
            });
            //跨域:
            services.AddCors(option =>
            {
                option.AddDefaultPolicy(p => {
                    p.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });
            //配置 Redis
            services.AddStackExchangeRedisCache(options =>
            {
                options.Configuration = Configuration.GetSection("RedisConnectionStrings").Value;
                //options.InstanceName = "SampleInstance";
            });
            services.AddTransient();
            services.AddTransient();
            services.AddTransient();
            services.AddSingleton();

            //验证
            services
    .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 當驗證失敗時,回應標頭會包含 WWW-Authenticate 標頭,這裡會顯示失敗的詳細錯誤原因
        options.IncludeErrorDetails = true; // 預設值為 true,有時會特別關閉

        options.TokenValidationParameters = new TokenValidationParameters
        {
            // 透過這項宣告,就可以從 "sub" 取值並設定給 User.Identity.Name
            NameClaimType = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier",
            // 透過這項宣告,就可以從 "roles" 取值,並可讓 [Authorize] 判斷角色
            RoleClaimType = "http://schemas.microsoft.com/ws/2008/06/identity/claims/role",

            // 一般我們都會驗證 Issuer
            ValidateIssuer = true,
            ValidIssuer = Configuration.GetValue("JwtSettings:Issuer"),

            // 通常不太需要驗證 Audience
            ValidateAudience = false,
            //ValidAudience = "JwtAuthDemo", // 不驗證就不需要填寫

            // 一般我們都會驗證 Token 的有效期間
            ValidateLifetime = true,

            // 如果 Token 中包含 key 才需要驗證,一般都只有簽章而已
            ValidateIssuerSigningKey = false,

            // "1234567890123456" 應該從 IConfiguration 取得
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration.GetValue("JwtSettings:SignKey")))
        };
    });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "BaWei.RBACExam v1"));
            }

            app.UseRouting();

            app.UseCors();

            //验证
            app.UseAuthentication();
            //授权
            app.UseAuthorization();

            //静态文件 中间件使用
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(
            Path.Combine(env.ContentRootPath, "Images")),
                RequestPath = "/StaticFiles"
            });

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

  在appsettings中加入连接接数据库的操作

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "MsSqlServer": "Data Source=.;Initial Catalog=RBACDB;User ID=sa;pwd=123456;"
  },
  "RedisConnectionStrings": "127.0.0.1:6379",
  "JwtSettings": {
    "Issuer": "JwtAuthDemo",
    "SignKey": "12eqwewr212weq2eqe3223reewer122ewqr567d"
  }
}
  • 用户表的操作代码
using BaWei.RBACExam.Model.SysDomain;
using Dapper;
using Microsoft.Extensions.Configuration;
using Surpass.Model;
using Surpass.Model.Dto.ResponseDto.ResponseModel.ResultModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaWei.RBACExam.Repository.Repository
{
    public class UserRepository
    {
        private readonly IConfiguration _configuration;
        public UserRepository(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public List ShowUser(out int totalcount,int pageindex=1,int pagesize=3,string email="",string userName="")
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                //var list= conn.GetListPaged(pageindex, pagesize, "", "");
                //totalcount = conn.RecordCount();
                var sql = "select * from [User] where Deleted=1 ";
                if (!string.IsNullOrEmpty(userName))
                {
                    sql += " and UserName like '%" + userName + "%'";
                }
                if (!string.IsNullOrEmpty(email))
                {
                    sql += " and Email like '%" + email + "%'"; ;
                }
                var list = conn.Query(sql);
                totalcount = list.Count();
                list = list.OrderBy(m => m.UserId).Skip((pageindex - 1) * pagesize).Take(pagesize).ToList();
                return list.ToList();
            }
        }
        public int Del(int id)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = "update [User] set Deleted=0 where UserId='"+id+"'";
                var list= conn.Execute(sql);
                return list;
            }
        }
        public int DelAll(string id)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = "update [User] set Deleted=0 where UserId in (ids)";
                var list = conn.Execute(sql);
                return list;
            }
        }
        public int AddUser(UserModel userModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = ($"insert into [User] values('{userModel.UserId}','{userModel.UserName}','{userModel.PassWord}','{userModel.Email}','{userModel.Sex}',1,0,GETDATE(),0,GETDATE(),0,'')");
                conn.Execute(sql);
                return 1;
            }
        }
        public PageResponse FanUser(long userId)
        {
            var result = new PageResponse();
            using(IDbConnection conn=new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = $"select * from [User] where UserId={userId}";
                result.PageData = conn.Query(sql).ToList();
            }
            return result;
        }
        public int UpdateUser(UserModel userModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = $"update [User] set UserName='{userModel.UserName}',[PassWord]='{userModel.PassWord}',Email='{userModel.Email}',Sex='{userModel.Sex}' where UserId='{userModel.UserId}'";
                var list= conn.Execute(sql);
                return list;
            }
        }
        public int DelUR(long userId)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list = conn.Execute($"delete from URRelation where UserId='{userId}'");
                return list;
            }
        }
        public ResponseModel Login(string userName,string passWord)
        {
            ResponseModel responseModel = new ResponseModel();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                
                var list = conn.Query($"select * from [User] where UserName='{userName}' and [PassWord]='{passWord}'").FirstOrDefault();
                if(list!=null)
                {
                    return responseModel.Succeed(list);
                }
                else
                {
                    return responseModel.Fail(ResponseCode.LoginFail, "登录失败");
                }
                //if(list.PassWord!=passWord)
                //{
                //    return responseModel.Fail(ResponseCode.LoginFail, "密码不存在");
                //}
            }
        }
    }
}
  • 角色表代码
using BaWei.RBACExam.Model.Dto.Response.ResponseDtoModel.PermissionDtoModel;
using BaWei.RBACExam.Model.SysDomain;
using Dapper;
using Microsoft.Extensions.Configuration;
using Surpass.Model.Dto.ResponseDto.ResponseModel.ResultModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaWei.RBACExam.Repository.Repository
{
    public class RoleRepository
    {
        private readonly IConfiguration _configuration;
        public RoleRepository(IConfiguration configuration)
        {
            _configuration = configuration;
        }
        public PageResponse ShowRole(string roleName = "")
        {
            var result = new PageResponse();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = "select * from [Role] where Deleted=1 ";
                if(!string.IsNullOrWhiteSpace(roleName))
                {
                    sql += " and RoleName like '%" + roleName + "%'";
                }
                result.PageData = conn.Query(sql).ToList();
                return result;
            }
        }
        public PageResponse ShowRoles()
        {
            var result = new PageResponse();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = "select * from [Role] where Deleted=1 ";
                result.PageData = conn.Query(sql).ToList();
                return result;
            }
        }
       
        //public ResponseModel AddUR(UserRoleRelationDtoModel userRoleRelationDtoModel)
        //{
        //    var result = new ResponseModel();
        //    using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
        //    {
        //        var kk = conn.Execute($"delete URRelation where UserId='{userRoleRelationDtoModel.UserId}'");
        //        conn.Open();
        //        using (var begin = conn.BeginTransaction())
        //        {
        //            try
        //            {
                        
        //                if (kk>0)
        //                {
        //                    foreach (var item in userRoleRelationDtoModel.RoleIds.Split(','))
        //                    {
        //                        conn.Execute($"insert into URRelation values({userRoleRelationDtoModel.UserId},{item},1,0,GETDATE(),0,GETDATE(),0)", null, begin);
        //                    }
        //                }
        //                begin.Commit();
        //                return result.Succeed(true);
        //            }
        //            catch (Exception ex)
        //            {
        //                begin.Rollback();
        //                throw ex;
        //            }
        //        }

        //    }
        //}

        public PageResponse ShowRoless()
        {
            var result = new PageResponse();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = "select a.*,b.UserName,c.RoleName from URRelation a join[User] b on a.UserId = b.UserId join[Role] c on a.RoleId = c.RoleId where a.Deleted = 1 ";
                result.PageData = conn.Query(sql).ToList();
                return result;
            }
        }
        public PageResponse FanRole(long userId)
        {
            var result = new PageResponse();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                conn.Open();
                var sql = $"select * from URRelation where UserId={userId}";
                result.PageData = conn.Query(sql).ToList();
            }
            return result;
        }
        public int Del(int id)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list = conn.Execute($"update [Role] set Deleted=0 where RoleId='{id}'");
                return list;
            }
        }
        public int AddRole(RoleModel roleModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list = conn.Execute($"insert into [Role] values('{roleModel.RoleId}','{roleModel.RoleName}','{roleModel.RoleDesc}',1,GETDATE(),0,GETDATE(),0)");
                return list;
            }
        }
        public int UpdateRole(RoleModel roleModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list = conn.Execute($"update [Role] set RoleName='{roleModel.RoleName}',RoleDesc='{roleModel.RoleDesc}' where RoleId='{roleModel.RoleId}'");
                return list;
            }
        }
        public int AddUR(UserRoleRelationDtoModel userRoleRelationDtoModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                //var kk = conn.Execute($"delete URRelation where UserId='{userRoleRelationDtoModel.UserId}'");
                var list = 0;
                //if (kk > 0)
               // {
                    foreach (var item in userRoleRelationDtoModel.RoleIds.Split(','))
                    {
                        list = conn.Execute($"insert into URRelation values('{userRoleRelationDtoModel.UserId}','{item}',0,1,GETDATE(),0,GETDATE(),0)");
                    }
               // }
                return list;
            }
        }
        public int AddRM(RoleMenuRelationDtoModel roleMenuRelationDtoModel)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var kk = conn.Execute($"delete RMRelation where RoleId='{roleMenuRelationDtoModel.RoleId}'");
                var list = 0;
                if (kk>0)
                {
                    foreach (var item in roleMenuRelationDtoModel.MenuIds.Split(','))
                    {
                        list = conn.Execute($"insert into RMRelation values('{roleMenuRelationDtoModel.RoleId}','{item}',0,1,GETDATE(),0,GETDATE(),0)");
                    }
                }
                return list;
            }
        }
        public PageResponse FanMenu(long id)
        {
            var result = new PageResponse();
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                conn.Open();
                var sql = $"select * from RMRelation where RoleId={id}";
                result.PageData = conn.Query(sql).ToList();
            }
            return result;
        }
       
    }
}
  • 菜单表代码
using BaWei.RBACExam.Model.Dto.Response.ResponseDtoModel.MenuDtoModel;
using BaWei.RBACExam.Model.SysDomain;
using Dapper;
using Microsoft.Extensions.Caching.Distributed;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace BaWei.RBACExam.Repository.Repository
{
    public class MenuRepository
    {
        private readonly IConfiguration _configuration;
        private readonly IDistributedCache _cache;
        public MenuRepository(IConfiguration configuration,IDistributedCache cache)
        {
            _configuration = configuration;
            _cache = cache;
        }
        
        public List GetMenuss(string menuName = "", int orderIndex = 0)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = $"select * from Menu where Deleted=0 ";
                if(!string.IsNullOrEmpty(menuName))
                {
                    sql += " and MenuName like '%" + menuName + "%'";
                }
                if(orderIndex>0)
                {
                    sql += " and OrderIndex='" + orderIndex + "'";
                }
                var list = conn.Query(sql).ToList();
                return GetMenuResponsess(list);
            }
        }
        public List GetMenuResponsess(List menuModels, string parentMenuId = "")
        {
            return menuModels.Where(m => m.Type == Config.SysConstants.MenuType.Menu && m.Deleted == false && m.ParentMenuId == parentMenuId).Select(m => new MenuResponse
            {
                Icon = m.Icon,
                Level = m.Level,
                Type = m.Type,
                MenuId = m.MenuId,
                MenuName = m.MenuName,
                OrderIndex = m.OrderIndex,
                ParentMenuId = m.ParentMenuId,
                Url = m.Url,
                ChildMenus = GetMenuResponsess(menuModels, m.MenuId)
            }).ToList();
        }
        public int Del(string menuId)
        {
            using(IDbConnection conn=new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list= conn.Execute($"update Menu set Deleted=1 where MenuId='{menuId}'");
                return list;
            }
        }
        public List GetMenu(long userId)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var list = conn.Query($"select distinct a.MenuId,a.MenuName,a.Icon,a.ParentMenuId,a.Level,a.Url  from Menu a join RMRelation b on a.MenuId=b.MenuId join URRelation c on b.RoleId=c.RoleId where c.UserId='{userId}'").ToList();
                return list;
            }
        }
        public List CheckMenus(long? userId)
        {
            using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("MsSqlServer")))
            {
                var sql = $"select distinct a.MenuId,a.MenuName,a.Icon,a.ParentMenuId,a.Level,a.Url,a.Type from Menu a join RMRelation b on a.MenuId=b.MenuId join URRelation c on b.RoleId=c.RoleId where 1=1 ";
                if (userId != null)
                {
                    sql += $" and c.UserId={userId}";
                }
                var list = conn.Query(sql).ToList();
                return GetMenuResponsekk(list);
            }
        }
        public List GetMenuResponsekk(List menuModels, string parentMenuId = "")
        {
            return menuModels.Where(m => m.Type == Config.SysConstants.MenuType.Menu && m.Deleted == false && m.ParentMenuId == parentMenuId).Select(t => new MenuResponse
            {
                Icon = t.Icon,
                Level = t.Level,
                Type = t.Type,
                MenuId = t.MenuId,
                MenuName = t.MenuName,
                OrderIndex = t.OrderIndex,
                ParentMenuId = t.ParentMenuId,
                Url = t.Url,
                ChildMenus = GetMenuResponsekk(menuModels, t.MenuId).Count == 0 ? null:GetMenuResponsekk(menuModels, t.MenuId)
            }).ToList();
        }
    }
}

控制器操作

  • 用户表控制器
    using BaWei.RBACExam.Config;
    using BaWei.RBACExam.Model.SysDomain;
    using BaWei.RBACExam.Repository.Repository;
    using Microsoft.AspNetCore.Authorization;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace BaWei.RBACExam.Controllers
    {
        [Authorize]
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class UserController : ControllerBase
        {
            private readonly UserRepository _userRepository;
            private readonly JwtHelpers _jwtHelpers;
            public UserController(UserRepository userRepository,JwtHelpers jwtHelpers)
            {
                _userRepository = userRepository;
                _jwtHelpers = jwtHelpers;
            }
            [HttpGet]
            public IActionResult ShowUser(int pageindex=1, int pagesize=3, string email="", string userName="")
            {
                var totalcount = 0;
                var list = _userRepository.ShowUser(out totalcount,pageindex, pagesize, email, userName);
                return Ok(new { list, totalcount });
            }
            [HttpGet]
            public IActionResult Del(int id)
            {
                return Ok(_userRepository.Del(id));
            }
            [HttpGet]
            public IActionResult DelAll(string ids)
            {
                return Ok(_userRepository.DelAll(ids));
            }
            [HttpPost]
            public IActionResult AddUser(UserModel userModel)
            {
                return Ok(_userRepository.AddUser(userModel));
            }
            [HttpPost]
            public IActionResult UpdateUser(UserModel userModel)
            {
                return Ok(_userRepository.UpdateUser(userModel));
            }
            [HttpGet]
            public IActionResult FanUser(long userId)
            {
                return Ok(_userRepository.FanUser(userId));
            }
            [HttpGet]
            public IActionResult DelUR(long userId)
            {
                return Ok(_userRepository.DelUR(userId));
            }
            //任何请求都可以访问该方法
            [AllowAnonymous]
            [HttpPost]
            public IActionResult Login(string userName, string passWord)
            {
                var user = _userRepository.Login(userName, passWord);
                if (user.Success)
                {
                    var token = _jwtHelpers.GenerateToken(userName);
                    HttpContext.Response.Headers.Add("token", token);
                    HttpContext.Response.Headers["Access-Control-Expose-Headers"] = "token";
                    return Ok(user);
                }
                else
                {
                    return Ok(user);
                }
    
            }
        }
    }
    
  • 角色表控制器
    using BaWei.RBACExam.Model.Dto.Response.ResponseDtoModel.PermissionDtoModel;
    using BaWei.RBACExam.Model.SysDomain;
    using BaWei.RBACExam.Repository.Repository;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace BaWei.RBACExam.Controllers
    {
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class RoleController : ControllerBase
        {
            private readonly RoleRepository _roleRepository;
            public RoleController(RoleRepository roleRepository)
            {
                _roleRepository = roleRepository;
            }
            [HttpGet]
            public IActionResult ShowRoles()
            {
                return Ok(_roleRepository.ShowRoles());
            }
            
            [HttpGet]
            public IActionResult ShowRoless()
            {
                return Ok(_roleRepository.ShowRoless());
            }
            [HttpGet]
            public IActionResult FanRole(long userId)
            {
                return Ok(_roleRepository.FanRole(userId));
            }
            [HttpGet]
            public IActionResult Del(int id)
            {
                return Ok(_roleRepository.Del(id));
            }
            [HttpGet]
            public IActionResult ShowRole(string roleName = "")
            {
                return Ok(_roleRepository.ShowRole(roleName));
            }
            [HttpPost]
            public IActionResult AddRole(RoleModel roleModel)
            {
                return Ok(_roleRepository.AddRole(roleModel));
            }
            [HttpPost]
            public IActionResult UpdateRole(RoleModel roleModel)
            {
                return Ok(_roleRepository.UpdateRole(roleModel));
            }
            [HttpPost]
            public IActionResult AddUR(UserRoleRelationDtoModel userRoleRelationDtoModel)
            {
                return Ok(_roleRepository.AddUR(userRoleRelationDtoModel));
            }
            [HttpPost]
            public IActionResult AddRM(RoleMenuRelationDtoModel roleMenuRelationDtoModel)
            {
                return Ok(_roleRepository.AddRM(roleMenuRelationDtoModel));
            }
            [HttpGet]
            public IActionResult FanMenu(long id)
            {
                return Ok(_roleRepository.FanMenu(id));
            }
        }
    }
    
  • 菜单表控制器
    using BaWei.RBACExam.Repository.Repository;
    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Mvc;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    
    namespace BaWei.RBACExam.Controllers
    {
        [Route("api/[controller]/[action]")]
        [ApiController]
        public class MenuController : ControllerBase
        {
            private readonly MenuRepository _menuRepository;
            public MenuController(MenuRepository menuRepository)
            {
                _menuRepository = menuRepository;
            }
            
            [HttpGet]
            public IActionResult GetMenuss(string menuName = "", int orderIndex = 0)
            {
                return Ok(_menuRepository.GetMenuss(menuName, orderIndex));
            }
            [HttpGet]
            public IActionResult Del(string menuId)
            {
                return Ok(_menuRepository.Del(menuId));
            }
            [HttpGet]
            public IActionResult GetMenu(long userId)
            {
                return Ok(_menuRepository.GetMenu(userId));
            }
            [HttpGet]
            public IActionResult CheckMenus(long? userId)
            {
               //var kk=  _menuRepository.CheckMenus(userId);
                return Ok(_menuRepository.CheckMenus(userId));
            }
        }
    }
    

三、前台VsCode+VUE

  1. 安装axios,elemenut-ui等
  2. 创建一个文件夹,用来存储js文件
  3. 在main中引入,在index中去分配路径
    import Vue from 'vue'
    import App from './App.vue'
    import router from './router'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    import axios from './request/http'
    
    
    Vue.config.productionTip = false
    //Vue.prototype.$axios=axios
    Vue.use(ElementUI);
    Vue.prototype.$http=axios;
    
    new Vue({
      router,
      render: h => h(App)
    }).$mount('#app')
    
    
    
    import Vue from 'vue'
    import VueRouter from 'vue-router'
    import Home from '../views/Home.vue'
    
    Vue.use(VueRouter)
    
    const routes = [
      {
        path: '/',
        name: 'Home',
        component:Home,
        children:[{
          path: '',
          name: 'About',
          // route level code-splitting
          // this generates a separate chunk (about.[hash].js) for this route
          // which is lazy-loaded when the route is visited.
          component: () => import(/* webpackChunkName: "about" */ '../views/About.vue')
        },
        {
          path: '/menu',
          name: 'Menu',
          // route level code-splitting
          // this generates a separate chunk (about.[hash].js) for this route
          // which is lazy-loaded when the route is visited.
          component: () => import(/* webpackChunkName: "about" */ '../views/Menu.vue')
        },
        {
          path: '/role',
          name: 'Role',
          // route level code-splitting
          // this generates a separate chunk (about.[hash].js) for this route
          // which is lazy-loaded when the route is visited.
          component: () => import(/* webpackChunkName: "about" */ '../views/Role.vue')
        },
        {
          path: '/dept',
          name: 'Dept',
          // route level code-splitting
          // this generates a separate chunk (about.[hash].js) for this route
          // which is lazy-loaded when the route is visited.
          component: () => import(/* webpackChunkName: "about" */ '../views/Dept.vue')
        }]
      },
      {
        path: '/login',
        name: 'Login',
        // route level code-splitting
        // this generates a separate chunk (about.[hash].js) for this route
        // which is lazy-loaded when the route is visited.
        component: () => import(/* webpackChunkName: "about" */ '../views/Login.vue')
      }
    ]
    
    const router = new VueRouter({
      routes
    })
    
    export default router
    
  4. 写一个拦截的js文件
    import axios from 'axios';
    
    //初始化
    const $http=axios.create({
        baseURL:'http://localhost:4098/api/',
        timeout:8000  //超时时间
    })
    
    
    //请求拦截
    $http.interceptors.request.use(config=>{
        const token=localStorage.getItem('token');
        if(token){
            config.headers.Authorization='Bearer '+token;
        }
        return config;
    })
    
    //导出
    export default $http
    
  5. 登录页面
    
    
    
    
    
    
  6. 主体页面+左侧菜单+菜单组件
    
    
    
    
    
    
    
    
    
    
    
    
    
  7. 用户页面
    
    
    
    
    
    
  8. 角色页面
    
    
    
    
    
    
  9. 菜单页面
    
    
    
    
    
    

四、效果展示