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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 基于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

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

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

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

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
3月前
|
SQL 前端开发 关系型数据库
如何开发一套研发项目管理系统?(附架构图+流程图+代码参考)
研发项目管理系统助力企业实现需求、缺陷与变更的全流程管理,支持看板可视化、数据化决策与成本优化。系统以MVP模式快速上线,核心功能包括需求看板、缺陷闭环、自动日报及关键指标分析,助力中小企业提升交付效率与协作质量。
|
2月前
|
数据采集 机器学习/深度学习 运维
量化合约系统开发架构入门
量化合约系统核心在于数据、策略、风控与执行四大模块的协同,构建从数据到决策再到执行的闭环工作流。强调可追溯、可复现与可观测性,避免常见误区如重回测轻验证、忽视数据质量或滞后风控。初学者应以MVP为起点,结合回测框架与实时风控实践,逐步迭代。详见相关入门与实战资料。
|
3月前
|
JSON 文字识别 BI
如何开发车辆管理系统中的加油管理板块(附架构图+流程图+代码参考)
本文针对中小企业在车辆加油管理中常见的单据混乱、油卡管理困难、对账困难等问题,提出了一套完整的系统化解决方案。内容涵盖车辆管理系统(VMS)的核心功能、加油管理模块的设计要点、数据库模型、系统架构、关键业务流程、API设计与实现示例、前端展示参考(React + Antd)、开发技巧与工程化建议等。通过构建加油管理系统,企业可实现燃油费用的透明化、自动化对账、异常检测与数据分析,从而降低运营成本、提升管理效率。适合希望通过技术手段优化车辆管理的企业技术人员与管理者参考。
|
3月前
|
消息中间件 缓存 JavaScript
如何开发ERP(离散制造-MTO)系统中的生产管理板块(附架构图+流程图+代码参考)
本文详解离散制造MTO模式下的ERP生产管理模块,涵盖核心问题、系统架构、关键流程、开发技巧及数据库设计,助力企业打通计划与执行“最后一公里”,提升交付率、降低库存与浪费。
|
2月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
3月前
|
数据采集 运维 数据可视化
AR 运维系统与 MES、EMA、IoT 系统的融合架构与实践
AR运维系统融合IoT、EMA、MES数据,构建“感知-分析-决策-执行”闭环。通过AR终端实现设备数据可视化,实时呈现温度、工单等信息,提升运维效率与生产可靠性。(238字)
|
3月前
|
人工智能 监控 测试技术
告别只会写提示词:构建生产级LLM系统的完整架构图​
本文系统梳理了从提示词到生产级LLM产品的八大核心能力:提示词工程、上下文工程、微调、RAG、智能体开发、部署、优化与可观测性,助你构建可落地、可迭代的AI产品体系。
513 51
|
2月前
|
机器学习/深度学习 人工智能 缓存
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
本文提出面向边缘通用智能的多大语言模型(Multi-LLM)系统,通过协同架构、信任机制与动态编排,突破传统边缘AI的局限。融合合作、竞争与集成三种范式,结合模型压缩、分布式推理与上下文优化技术,实现高效、可靠、低延迟的边缘智能,推动复杂场景下的泛化与自主决策能力。
241 3
面向边缘通用智能的多大语言模型系统:架构、信任与编排——论文阅读
|
2月前
|
人工智能 自然语言处理 安全
AI助教系统:基于大模型与智能体架构的新一代教育技术引擎
AI助教系统融合大语言模型、教育知识图谱、多模态交互与智能体架构,实现精准学情诊断、个性化辅导与主动教学。支持图文语音输入,本地化部署保障隐私,重构“教、学、评、辅”全链路,推动因材施教落地,助力教育数字化转型。(238字)
|
3月前
|
消息中间件 数据采集 NoSQL
秒级行情推送系统实战:从触发、采集到入库的端到端架构
本文设计了一套秒级实时行情推送系统,涵盖触发、采集、缓冲、入库与推送五层架构,结合动态代理IP、Kafka/Redis缓冲及WebSocket推送,实现金融数据低延迟、高并发处理,适用于股票、数字货币等实时行情场景。
313 3
秒级行情推送系统实战:从触发、采集到入库的端到端架构