【项目】用户管理系统

news2025/2/26 6:19:23

一、需求分析

完成一个简单的用户信息管理系统,超级管理员可以登录本系统,查询用户信息、实现用户的管理功能。

1.1功能:

主要操作和管理的对象:用户。

用户分为两类:超级管理员/普通用户。

  1. 登录功能(只针对超管有效,普通用户不能登录)

  1. 列表查询分页列表功能

  1. 添加用户(普通用户/超级管理员)

  1. 修改用户

  1. 删除用户(单条删除和多条删除)

1.2使用的技术

该系统主要选择了Java的SpringBoot框架技术进行开发,采用了分层的架构,每个层次在保持独立的同时具有一定松散性,这样可以实现系统开发结构的清晰性,从而提高了系统的开发效率和性能。集成Mybatis,后台数据库使用MySQL对数据进行存储,以及Spring MVC,还添加了拦截器/统一异常处理/统一数据返回。

二、项目准备

2.1创建数据库

drop database if exists usermanager;
create database usermanager character set 'utf8mb4';

create table userinfo(
uid int primary key auto_increment,
username varchar(250) not null,
loginname varchar(250) not null,
password varchar(65) not null,
sex varchar(2) default '男',
age int default 0,
address varchar(250) ,
qq varchar(250),
email varchar(250),
isadmin bit default 0,
state int default 1,
createtime datetime defalt now(),
updatetime datetime default noe()
)default charset = 'utf8mb4';

2.2搭建SMM项目

配置连接数据库字符串和mybatis xml保存路径

# 开发环境配置文件
# 配置数据库的连接字符串
spring:
  datasource:
    url: jdbc:mysql://127.0.0.1/usermanager?characterEncoding=utf8
    username: root
    password: 200177
    driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml
  configuration: # 配置打印 MyBatis 执行的 SQL
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2.3添加公共模块

(1)创建实体类

/**
 * 用户实体类
 */
@Data
public class UserInfo {
    private int uid;
    private String username;
    private String loginname;
    private String password;
    private String sex;
    private int age;
    private String address;
    private String qq;
    private String email;
    private boolean isadmin;
    private int state;
    private String createtime;
    private String updatetime;
}

(2)将工具类hutool添加项目中

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.12</version>
</dependency>

(3)添加统一异常的处理器/添加用户登录拦截器/添加统一返回格式

/**
 * 统一异常拦截处理类
 */
@RestControllerAdvice
public class MyExceptionAdvice {
    @ExceptionHandler(Exception.class)
    public Object exceptionAdvice(Exception e) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state", -1);
        result.put("msg", "程序出现异常:" + e.getMessage());
        result.put("data", "");
        return result;
    }
}

添加用户登录拦截器需要先创建自定义拦截器,然后将自定义拦截器加入到系统配置中,并且设置拦截规则,使用户必须先进入登录界面,不能先进入更新等界面。

/**
 * 全局变量
 */
public class ConstVariable {
    // session 中的用户 id
    public static final String USER_SESSION_KEY = "userinfo_session_key";
}
/**
 * 自定义用户拦截器
 */
@Component
public class LoginIntercept implements HandlerInterceptor {
    /**
     * true 表示用户已经登录,会继续访问目标方法
     * false 表示未登录,跳转到登录页面
     */
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute(ConstVariable.USER_SESSION_KEY) != null) {
            // 表示已经登录
            return true;
        }
        // 执行到此行表示未登录,跳转到登录页面
        response.sendRedirect("/login.html");
        return false;
    }
}
/**
 * 系统配置文件类
 */
@Configuration
public class AppConfig implements WebMvcConfigurer {
    @Autowired
    private LoginIntercept loginIntercept;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginIntercept).
                addPathPatterns("/**").
                excludePathPatterns("/login").
                excludePathPatterns("/css/**").
                excludePathPatterns("/fonts/**").
                excludePathPatterns("/images/**").
                excludePathPatterns("/js/**").
                excludePathPatterns("/**/login.html");
    }
}
/**
 * 返回统一的数据格式
 */
@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        HashMap<String, Object> result = new HashMap<>();
        result.put("state", 1);
        result.put("msg", "");
        result.put("data", body);
        return result;
    }
}

2.4创建密码工具

添加加密工具的目的主要是为了防止外部人员获取内部信息比如所有用户的密码。

在添加和更新时都要使用加密,在超级管理员登陆的时候需要使用解密才能登陆上。

2.4.1加密

    public static String encrypt(String password) {
        // 随机盐值
        String salt = IdUtil.simpleUUID();
        // 密码(md5(随机盐值+密码))
        String finalPassword = SecureUtil.md5(salt + password);
        return salt + "$" + finalPassword;
    }

2.4.2解密

    public static boolean decrypt(String password, String securePassword) {
        boolean result = false;
        if (StringUtils.hasLength(password) && StringUtils.hasLength(securePassword)) {
            if (securePassword.length() == 65 && securePassword.contains("$")) {
                String[] securePasswordArr = securePassword.split("\\$");
                // 盐值
                String slat = securePasswordArr[0];
                String finalPassword = securePasswordArr[1];
                // 使用同样的加密算法和随机盐值生成最终加密的密码
                password = SecureUtil.md5(slat + password);
                if (finalPassword.equals(password)) {
                    result = true;
                }
            }
        }
        return result;
    }

三、功能实现

3.1登录功能

3.1.1实现思路

3.1.2成果图

3.2列表功能

3.2.1实现思路

3.2.2成果图

3.3添加功能

3.3.1实现思路

在添加界面中,需要注意有两个名字,一个登录名,一个姓名,登录名是不可以重复的。

3.3.2成果图

3.4删除功能

3.4.1实现思路

3.4.2成果图

3.5修改功能

3.5.1实现思路

3.5.2成果图

3.6多选删除功能

3.6.1实现思路

3.6.2成果图

3.7分页功能

3.7.1实现思路

3.7.2成果图

3.8条件查询功能

3.8.1实现思路

在jsp中利用jQuery获取姓名、地址、邮件的值

然后getList()进行查询。

3.8.2成果图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/387056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解多进程

多进程 一、进程状态 二、创建子进程 - fork 1、函数接口 #include <unistd.h>pid_t fork(void);2、基本概述 成功后&#xff0c;子进程的 PID 在父进程中返回&#xff0c;在子进程中返回 0。 失败时&#xff0c;在父进程中返回 -1&#xff0c;不创建子进程&#xff0c…

MyBatis——进阶操作(2)

标签 if标签 当提交的表单中有些为非必填项&#xff0c;用户并没有上传这些属性的值&#xff0c;那么程序可以上传NUll&#xff0c;也可以用if标签判断用户有没有上传这个值 <if test"参数!null">操作 </if>其中test中填写一条语句&#xff0c;如果得…

uniapp实现地图点聚合功能

前言 在工作中接到的一个任务&#xff0c;在app端实现如下功能&#xff1a; 地图点聚合地图页面支持tab切换&#xff08;设备、劳务、人员&#xff09;支持人员搜索显示分布 但是uniapp原有的map标签不支持点聚合功能&#xff08;最新的版本支持了点聚合功能&#xff09;&am…

爬虫碎碎念

20230304 - &#xff08;非专业人士&#xff0c;简单记录自己的需求和思考&#xff09; 0. 引言 平时看到一些网站的照片什么的&#xff0c;有那种批量下载的需求&#xff0c;当然有些也是视频网站的图片介绍什么的&#xff0c;也即是说&#xff0c;我需要把这些网站的照片批…

剑指 Offer II 013. 二维子矩阵的和

题目链接 剑指 Offer II 013. 二维子矩阵的和 mid 题目描述 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的左上角为 (row1, col1)&#xff0c;右下角为 (row2, col2)。 实现 NumMatrix类&#xf…

测开:前端基础-css

一、CSS介绍和引用 1.1 css概述 层叠样式表&#xff0c;是一种样式表语言&#xff0c;用来描述HTML和XML文档的呈现。 CSS 用于简化HTML标签&#xff0c;把关于样式部分的内容提取出来&#xff0c;进行单独的控制&#xff0c;使结构与样式分离开发。 CSS 是以HTML为基础&…

docker环境下安装jenkins

前言 废话不多说&#xff0c;上来就是干&#xff0c;jenkins是干嘛用的&#xff0c;小白的话&#xff0c;自己去查&#xff0c;首先我的环境时centos7&#xff0c;自己在vmware建立的一套centos虚拟机环境。docker版本如图所示: 第一步 其实可以先查看一下又那些镜像jenkin…

DC-5 靶场学习

文章目录环境配置&#xff1a;信息搜集&#xff1a;漏洞测试&#xff1a;漏洞利用&#xff1a;提权&#xff1a;得到flag&#xff1a;下载地址&#xff1a;环境配置&#xff1a; 直接将其与攻击机放在同一网段。 信息搜集&#xff1a; arp-scan -l nmap -sP 192.168.28.0/24漏…

基于SSH的网上图书俱乐部的设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;网上图书俱乐部是一个虚拟的书友会&#xff0c;该平台是为了给那些爱好读书的人提供一个网上交流的场所。以服务广大读者朋友为主&#xff0c;强调互动性、知识性、趣味性&#xff0c;是读书、会友的好去处&#xff0c;读者可以在线…

【Spring学习】Spring自定义标签详细步骤

目录标题前言一、自定义标签步骤1、定义属性POJO2、定义XSD文件描述组件内容3、定义标签解析器4、注册标签解析器5、定义spring.handlers和spring.schemas文件6、user.xml文件配置7、测试类二、仓库位置总结前言 Spring中除了http://www.springframework.org/schema/beans命名…

pytorch-在竞赛中去摸索用法,用房价预测比赛了解数据处理流程

实战Kaggle比赛&#xff1a;房价预测 让我们动手实战一个Kaggle比赛&#xff1a;房价预测House Prices - Advanced Regression Techniques | Kaggle。本文将提供未经调优的数据的预处理、模型的设计和超参数的选择。通过动手操作、仔细观察实验现象、认真分析实验结果并不断调…

5分钟被美团面试官请出去,3年测试经验被这几个题问到心虚

5分钟前&#xff1a;“哥们我去美团面试了&#xff01;祝我好运~”5分钟后&#xff1a;“刚从美团走出来&#xff0c;被自动化测试的一些面试题难到了…”“越想越觉得可惜回想面试经过&#xff0c;在几个关键的问题没有给到面试官想要的答案。”“我不是不会&#xff0c;我都干…

工业互联网标识解析二节节点平台_能源管理工业互联网大数据平台

能源管理工业互联网大数据平台项目&#xff0c;是由吉佳通达负责建设的&#xff0c;通过建设形成能源管理的数字化产业基地&#xff0c;推动能源数字化转型升级&#xff0c;形成大数据运营平台。以能源管理与各个企业节点进行数据对接后&#xff0c;利用工业互联网唯一标识身份…

几个C语言容易忽略的问题

1 取模符号自增问题 我们不妨尝试写这样的程序 #include<stdio.h> int main(){int n,t5;printf("%d\n",7%(-3));//1printf("%d\n",(-7)%3);//-1while(--t)printf("%d\n",t);t5;while(t--)printf("%d\n",t);return 0; } 运行…

十、Spring IoC注解式开发

1 声明Bean的注解 负责声明Bean的注解&#xff0c;常见的包括四个&#xff1a; ComponentControllerServiceRepository Controller、Service、Repository这三个注解都是Component注解的别名。 也就是说&#xff1a;这四个注解的功能都一样。用哪个都可以。 只是为了增强程序…

CSS奇思妙想之-利用CSS裁剪(clip-path)完成各种图形

在日常开发当中&#xff0c;如果想要开发多边形&#xff0c;一般都需要多个盒子或者伪元素的帮助&#xff0c;有没有一直办法能只使用一个盒子实现呢&#xff1f; 有的&#xff1a;css裁剪 clip-path介绍 css裁剪&#xff08;clip-path&#xff09;这个属性平时率非常低。但是…

Submodule命令:android如何将自己项目中的某个Module作为gitlab中第三方公共库

一、创建远程公共库 1、Android Studio创建本地仓库 创建一个新的module 在新建module中添加代码(此处示例代码) 右击新建的module&#xff0c;打开新建module的命令行界面&#xff0c; 因为我们只上传这个module的代码&#xff0c;而不是整个项目的代码 命令行中输入以下命令…

2023年03月IDE流行度最新排名

点击查看最新IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年03月IDE流行度最新排名 顶级IDE排名是通过分析在谷歌上搜索IDE下载页面的频率而创建的 一个IDE被搜索的次数越多&#xff0c;这个IDE就被认为越受欢迎。原始数据来自谷歌Trends 如果您相信集体智慧&am…

【vue】环境安装与实例创建

vue是一套用于构建前端界面的框架。 文章目录1. vue环境安装2. 创建项目vue init创建项目Vite创建项目vue create创建项目vue ui创建项目3. 打包项目1. vue环境安装 首先安装nodejs并配置npm国内镜像&#xff1a;https://zhuanlan.zhihu.com/p/442215189 升级或安装cnpm并查看…

Java 字符编码

编码&#xff1a;数据存储进计算机中需要转换为二进制存储&#xff0c;这个过程就是编码。 解码&#xff1a;计算机读取数据并展示在页面上&#xff0c;需要将二进制转换为人类语言的过程&#xff0c;叫做解码。 乱码&#xff1a;如果编码和解码时使用的码表不一样&#xff0c;…