基于SSM+MVC三层架构实现用户权限管理系统

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 基于SSM+MVC三层架构实现用户权限管理系统

基于SSM+MVC三层架构实现用户权限管理系统

前言

本周为大家带来一个简单的用户权限管理系统,该系统主要分为2个模块,用户管理与角色管理,角色可多选权限,用户可多选角色,逻辑稍微复杂,好了,下面步入主题

用户管理系统简介

系统支持防跳墙,用户不登录不可进入主页

  1. 角色模块,要求实现角色的增删改查,且角色可多选权限,实现复选框权限回显
  2. 用户模块,要求实现用户的增删改查,实现分页,分页要求实现前5后4,且用户可多选角色,实现复选框角色回显

效果图

在这里插入图片描述

数据表准备

t_user用户表

CREATE TABLE `t_user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户名称',
  `userpwd` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户密码',
  `realname` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '用户真实姓名',
  PRIMARY KEY (`id`)
) 

t_role角色表

CREATE TABLE `t_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rolename` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '角色名称',
  PRIMARY KEY (`id`)
)

t_user_role用户角色关联表

CREATE TABLE `t_user_role` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) DEFAULT NULL COMMENT '用户id',
  `role_id` int(11) DEFAULT NULL COMMENT '角色id',
  PRIMARY KEY (`id`)
) 

t_permission权限表

CREATE TABLE `t_permission` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `perm_code` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '权限码',
  `perm_name` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '权限名称',
  PRIMARY KEY (`id`)
) 

t_role_perm角色权限关联表

CREATE TABLE `t_role_perm` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `role_id` int(11) DEFAULT NULL COMMENT '角色id',
  `perm_code` varchar(128) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '权限码',
  PRIMARY KEY (`id`)
) 

项目结构

在这里插入图片描述

Java源码结构

在这里插入图片描述

配置文件

在这里插入图片描述

前端结构

在这里插入图片描述

pom依赖文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>SSM-UserPermissionManagerSystem</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>

        <!-- mybatis依赖的坐标 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.4</version>
        </dependency>

        <!-- java连接mysql的驱动坐标 -->
        <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/com.mchange/c3p0 -->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.4.RELEASE</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.9.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

</project>

搭建项目

以Maven方式创建Web项目

整合SSM

核心源码

RouteController,路由跳转类,主要用于跳转到指定jsp页面并携带数据进行渲染

package com.wanshi.controller;

import com.wanshi.bean.TPermission;
import com.wanshi.bean.TRole;
import com.wanshi.bean.TUser;
import com.wanshi.service.PermissionService;
import com.wanshi.service.RoleService;
import com.wanshi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

@Controller
@RequestMapping("/route")
public class RouteController {

    @Autowired
    private PermissionService permissionService;

    @Autowired
    private RoleService roleService;

    @Autowired
    private UserService userService;

    @RequestMapping("/index")
    public String index() {
        return "index";
    }

    @RequestMapping("/addRole")
    public String addRole(Model model) {
        List<TPermission> list = permissionService.list();
        model.addAttribute("permList", list);
        return "role/add";
    }

    @RequestMapping("/addUser")
    public String addUser(Model model) {
        List<TRole> list = roleService.list();
        model.addAttribute("roleList", list);
        return "user/add";
    }

    @RequestMapping("/updateRole")
    public String updateRole(HttpServletRequest request, Model model) {
        String id = request.getParameter("id");
        TRole role = roleService.getByRole(id);
        List<TPermission> list = permissionService.list();
        List<TPermission> byRolePermList = roleService.getByRolePermList(role.getId());
        List<String> permCodes = new ArrayList<String>();
        for (TPermission tPermission : byRolePermList) {
            permCodes.add(tPermission.getPerm_code());
        }
        model.addAttribute("permCodes", permCodes);
        model.addAttribute("permList", list);
        model.addAttribute("role", role);
        return "role/edit";
    }

    @RequestMapping("/updateUser")
    public String updateUser(HttpServletRequest request, Model model) {
        String id = request.getParameter("id");
        TUser user = userService.getByUser(id);
        List<TRole> userRoleList = userService.getByRoleList(user.getId());
        List<TRole> roleList = roleService.list();

        List<Integer> roleIds = new ArrayList<Integer>();
        for (TRole tRole : userRoleList) {
            roleIds.add(tRole.getId());
        }
        model.addAttribute("roleIds", roleIds);
        model.addAttribute("roleList", roleList);
        model.addAttribute("user", user);
        return "user/edit";
    }
}

RoleController,角色控制器类,用于编写角色的CRUD

package com.wanshi.controller;

import com.wanshi.bean.TRole;
import com.wanshi.service.PermissionService;
import com.wanshi.service.RoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

@Controller
@RequestMapping("/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    @RequestMapping("/list")
    public String list(Model model) {
        List<TRole> list = roleService.list();
        model.addAttribute("roleList", list);
        return "role/list";
    }

    @RequestMapping("addHandle")
    public String addHandle(TRole role, HttpServletRequest request) {
        String[] permCodes = request.getParameterValues("permCodes");
        roleService.insert(role, permCodes);
        return "redirect:/role/list";
    }

    @RequestMapping("/updateHandle")
    public String updateHandle(TRole role, HttpServletRequest request) {
        String[] permCodes = request.getParameterValues("permCodes");
        roleService.update(role, permCodes);
        return "redirect:/role/list";
    }

    @RequestMapping("/delete")
    public String delete(TRole role) {
        roleService.delete(role);
        return "redirect:/role/list";
    }
}

UserController,用户控制器类,用于编写用户的CRUD,分页,以及登录

package com.wanshi.controller;

import com.wanshi.bean.Page;
import com.wanshi.bean.TPermission;
import com.wanshi.bean.TRole;
import com.wanshi.bean.TUser;
import com.wanshi.service.PermissionService;
import com.wanshi.service.RoleService;
import com.wanshi.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;

@Controller
@RequestMapping("/user")
public class UserController {

    @Autowired
    private UserService userService;

    @Autowired
    private PermissionService permissionService;

    private static final Integer PageSize = 2;

    @RequestMapping("/login")
    public String login(TUser user, HttpServletRequest request) {
        TUser user1 = userService.exam(user);
        if (user1 != null) {
            request.getSession().setAttribute("user", user1);
            return "redirect:/route/index";
        }
        return "login";
    }


    @RequestMapping("/logout")
    public String logout(HttpServletRequest request) {
        request.getSession().invalidate();
        return "login";
    }

    @RequestMapping("/page")
    public String page(HttpServletRequest request, Model model) {
        String pageNumb = request.getParameter("pageNumb");
        Integer currPage = 1;
        if (pageNumb != null && !pageNumb.equals("")) {
            currPage = Integer.valueOf(pageNumb);
        }
        Page<TUser> page = userService.page(currPage, PageSize);
        model.addAttribute("pager", page);
        return "user/list";
    }

    @RequestMapping("/addHandle")
    public String addHandle(TUser user, HttpServletRequest request) {
        String[] roleIds = request.getParameterValues("roleIds");
        userService.insert(user, roleIds);
        return "redirect:/user/page";
    }

    @RequestMapping("/updateHandle")
    public String updateHandle(TUser user, HttpServletRequest request) {
        String[] roleIds = request.getParameterValues("roleIds");
        userService.update(user, roleIds);
        return "redirect:/user/page";
    }

    @RequestMapping("/delete")
    public String delete(HttpServletRequest request){
        String id = request.getParameter("id");
        userService.delete(id);
        return "redirect:/user/page";
    }

    @RequestMapping("/detail")
    public String detail(HttpServletRequest request, Model model) {
        String id = request.getParameter("id");
        TUser user = userService.getByUser(id);
        List<TRole> roleList = userService.getByRoleList(user.getId());
        List<Integer> roleIds = new ArrayList<Integer>();
        for (TRole tRole : roleList) {
            roleIds.add(tRole.getId());
        }
        Set<TPermission> permList = permissionService.getDetail(roleIds);

        model.addAttribute("user", user);
        model.addAttribute("roleList", roleList);
        model.addAttribute("permList", permList);
        return "user/detail";
    }

}

LoginInterceptor拦截器,用于拦截未登录的用户,若未登录,则不可访问主页,达到了安全的效果

package com.wanshi.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.对登录,注册,风格直接放行
        //获取请求的uri地址
        String uri = request.getRequestURI();
        if (uri.contains("login")) {
            return true;
        }

        //2.进行session验证
        Object user = request.getSession().getAttribute("user");
        if (user == null) {
            request.getRequestDispatcher("/WEB-INF/pages/login.jsp")
                    .forward(request, response);
            return false;
        }
        return true;
    }
}

结语

项目就到此结束了,若对本项目感兴趣的老铁,可在下方获取完整项目

完整项目链接用户权限管理系统

提取码: hbpj

有任何问题均可在评论区留言或私信我

只求您能留下您宝贵的足迹,等啥呢,都看到这啦,还不来个一键三连嘛==(收藏+关注+评论)==

感谢您的支持,我们下篇见~

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
3月前
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
6月前
|
设计模式 前端开发 数据库
哇塞!Rails 的 MVC 架构也太牛了吧!快来看看这令人惊叹的编程魔法,开启新世界大门!
【8月更文挑战第31天】《Rails中的MVC架构解析》介绍了Ruby on Rails框架核心的MVC设计模式,通过模型(Model)、视图(View)和控制器(Controller)三部分分离应用逻辑,利用Active Record进行数据库操作,ERB模板渲染视图,以及控制器处理用户请求与业务逻辑,使代码更易维护和扩展,提升团队开发效率。
100 0
|
5月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
532 37
|
5月前
|
机器学习/深度学习 存储 算法
Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系
通过探索大语言模型(LLM)架构之间的潜在联系,我们可能开辟新途径,促进不同模型间的知识交流并提高整体效率。尽管Transformer仍是主流,但Mamba等线性循环神经网络(RNN)和状态空间模型(SSM)展现出巨大潜力。近期研究揭示了Transformer、RNN、SSM和矩阵混合器之间的深层联系,为跨架构的思想迁移提供了可能。本文深入探讨了这些架构间的相似性和差异,包括Transformer与RNN的关系、状态空间模型在自注意力机制中的隐含作用以及Mamba在特定条件下的重写方式。
225 7
Transformer、RNN和SSM的相似性探究:揭示看似不相关的LLM架构之间的联系
|
5月前
|
设计模式 前端开发 数据库
理解mvc架构
mvc架构
53 4
|
6月前
|
设计模式 存储 前端开发
MVC革命:如何用一个设计模式重塑你的应用架构,让代码重构变得戏剧性地简单!
【8月更文挑战第22天】自定义MVC(Model-View-Controller)设计模式将应用分为模型、视图和控制器三个核心组件,实现关注点分离,提升代码可维护性和扩展性。模型管理数据和业务逻辑,视图负责数据显示与用户交互,控制器处理用户输入并协调模型与视图。通过示例代码展示了基本的MVC框架实现,可根据需求扩展定制。MVC模式灵活性强,支持单元测试与多人协作,但需注意避免控制器过度复杂化。
63 1
|
7月前
|
存储 前端开发 算法
MVC(Model-View-Controller)架构
MVC架构帮助开发者构建清晰、可维护和可扩展的Web应用程序。
57 2
|
7月前
|
存储 关系型数据库 测试技术
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)(2)
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)
128 1
|
8月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
156 1
|
7月前
|
Java 关系型数据库 测试技术
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)(1)
基于ssm+vue的校园驿站管理系统+(源码+部署说明+演示视频+源码介绍)
97 0