当前位置: 首页 > news >正文

demo01:基于 SpringMVC 的用户管理系统

要求:1.数据库需创建 users 表,包含 id、username、email、password 字段
     2.实现用户的增删改查功能
     3.添加用户登录认证功能
     4.实现密码加密存储
     5.编写controller接口,验证用户管理功能

实现后端功能即可,用apifox进行接口检验

数据库准备

CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL,email VARCHAR(100) NOT NULL,password VARCHAR(255) NOT NULL,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

pom依赖准备

  <properties> <maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-crypto</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-crypto</artifactId><version>5.6.8</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8080</port><path>/</path></configuration></plugin></plugins></build>

创建框架

 配置类编写

有SpringConfig\MybatisConfig\JdbcConfig\SpringMvcConfig\ServletConfig

@Configuration
@ComponentScan({"com.ywh.service"})
@PropertySource("classpath:jdbc.properties")
@Import({JdbcConfig.class,MybatisConfig.class})
public class SpringConfig {@Beanpublic BCryptPasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}  //密码加密用的
}
public class MybatisConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.ywh.pojo");//别名包Configuration configuration = new Configuration();configuration.setMapUnderscoreToCamelCase(true); //驼峰映射factoryBean.setConfiguration(configuration);return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.ywh.dao");return msc;}
}
public class JdbcConfig {@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}}
@Configuration
@ComponentScan("com.ywh.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer {//加载Spring配置类protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//加载SpringMVC配置类protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置SpringMVC请求地址拦截规则protected String[] getServletMappings() {return new String[]{"/"};}//设置post请求中文乱码过滤器@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("utf-8");return new Filter[]{filter};}
}

并编写jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/shixun?useUnicode=true&characterEncoding=utf8&useSSL=false
jdbc.username=root
jdbc.password=123456

pojo

@Data
@EqualsAndHashCode(callSuper = false)
@NoArgsConstructor
@AllArgsConstructor
public class Users {private Integer id;private String username;private String email;private String password;private Date createdAt;private Date updatedAt;
}

dao

@Mapper
public interface UserDao {// 插入用户(返回自增ID)@Insert("INSERT INTO users(username, email, password, created_at, updated_at) " +"VALUES(#{username}, #{email}, #{password}, NOW(), NOW())")@Options(useGeneratedKeys = true, keyProperty = "id")int insertUser(Users user);// 根据ID删除用户@Delete("DELETE FROM users WHERE id = #{id}")int deleteById(@Param("id") Integer id);// 更新用户信息@Update("UPDATE users SET username=#{username}, email=#{email}, updated_at=NOW() WHERE id=#{id}")int updateUser(Users users);// 根据用户名查询用户(用于登录验证)@Select("SELECT * FROM users WHERE username = #{username}")Users selectByUsername(@Param("username") String username);}

Service

public interface UserService {int register(Users user);// 删除用户int deleteUser(Integer id);// 更新用户信息int updateUser(Users user);// 用户登录验证Users login(String username, String password);// 根据用户名查询用户Users getUserByUsername(String username);
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate  UserDao userDao;@Autowiredprivate  BCryptPasswordEncoder passwordEncoder;@Overridepublic int register(Users user) {// 检查用户名是否已存在if (userDao.selectByUsername(user.getUsername()) != null) {throw new RuntimeException("用户名已存在");}// 加密密码String encodedPassword = passwordEncoder.encode(user.getPassword());user.setPassword(encodedPassword);return userDao.insertUser(user);}@Overridepublic int deleteUser(Integer id) {return userDao.deleteById(id);}@Overridepublic int updateUser(Users user) {// 更新时不修改密码user.setPassword(null);return userDao.updateUser(user);}@Overridepublic Users login(String username, String password) {if (!StringUtils.hasText(username) || !StringUtils.hasText(password)) {throw new RuntimeException("用户名和密码不能为空");}Users user = userDao.selectByUsername(username);if (user == null) {throw new RuntimeException("用户不存在");}// 验证密码if (!passwordEncoder.matches(password, user.getPassword())) {throw new RuntimeException("密码错误");}return user;}@Overridepublic Users getUserByUsername(String username) {return userDao.selectByUsername(username);}}

Controller 

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMapping("/register")public ResponseEntity<?> registerUser(@RequestBody Users user) {int result = userService.register(user);Map<String, Object> map = new HashMap<>();map.put("user",user);if (result > 0) {map.put("message", "注册成功");return ResponseEntity.ok(map);}map.put("message", "注册失败");return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(map);}@PostMapping("/login")public ResponseEntity<?> loginUser(@RequestBody Users user) {Map<String, Object> map = new HashMap<>();map.put("user",user);Users user1 = userService.login(user.getUsername(), user.getPassword());if (user1 != null) {map.put("message", "登录成功");return ResponseEntity.ok(map);}elsemap.put("message", "登录失败");return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(map);}@PostMapping("update")public ResponseEntity<?> updateUser( @RequestBody Users user) {Map<String, Object> map = new HashMap<>();map.put("user",user);int result = userService.updateUser(user);if (result > 0) {map.put("message", "用户更新成功");return ResponseEntity.ok(map);}map.put("message", "用户更新失败");return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(map);}@GetMapping("delete/{id}")public ResponseEntity<?> deleteUser(@PathVariable Integer id) {Map<String, Object> map = new HashMap<>();int result = userService.deleteUser(id);if (result > 0) {map.put("message", "用户删除成功");return ResponseEntity.ok(map);}map.put("message", "用户删除失败");return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(map);}@GetMapping("select/{username}")public ResponseEntity<?> getUserByUsername(@PathVariable String username) {Map<String, Object> map = new HashMap<>();Users user = userService.getUserByUsername(username);if (user != null) {map.put("user",user);return ResponseEntity.ok(map);}map.put("message", "用户不存在");return ResponseEntity.status(HttpStatus.NOT_FOUND).body(map);}
}

测试接口

编辑运行环境

然后使用Apifox进行接口测试

先注册用户 

然后登录用户

更新普通信息,根据id来更新

根据用户名查询用户

 删除用户

总结

     其实这个demo的有些逻辑并不是非常合理,主要是自己动手体验一下mvc的架构,并且多熟悉一下其中的注解和配置,我争取后续的demo中业务逻辑更加的完善一些 

http://www.dtcms.com/a/262813.html

相关文章:

  • AlpineLinux安装部署MongoDB
  • Clickhouse源码分析-TTL执行流程
  • 杂谈-架构时代演进
  • C语言常用转换函数实现原理
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ThemeClock(主题时钟)
  • Windows环境下Docker容器化的安装与设置指南
  • 【第二章:机器学习与神经网络概述】04.回归算法理论与实践 -(1)线性回归模型
  • AWS WebRTC:通过shell分析并发启动master后产生的日志文件
  • 御控助力打造物联网实训室,赋能职业教育高质量发展
  • 大模型-分布式推理简介
  • Linux基础环境开发工具apt、vim和gcc/g++
  • STC8H驱动两相四线步进电机
  • 基于llama-factory+ollama+vllm加速大模型训推生产
  • 大数据(4)-spark
  • Windows 开发环境部署指南:WSL、Docker Desktop、Podman Desktop 部署顺序与存储路径迁移指南
  • STM32-第一节-新建工程,GPIO,点亮LED,蜂鸣器
  • GC3910S:一款高性能双通道直流电机驱动芯片
  • 【Wireshark】高级过滤技巧精讲
  • Chromium 136 编译指南 Ubuntu篇:Python环境与开发工具配置(五)
  • 解决VSCode打开最近项目后终端shell不正常的问题
  • TCP 滑动窗口实现机制
  • 颠覆传统加密:微算法科技创新LSQb算法,提升量子图像处理速度
  • 芯谷科技--150KHz 3A PWM 降压型 DC/DC 转换器D1507
  • 【原创】【5】【视频二创工具发布】基于视觉模型+FFmpeg+MoviePy实现短视频自动化二次编辑+多赛道
  • UE5 一台电脑+双显示器 配置nDisplay裸眼3D效果
  • 【MCP服务】蓝耘元生代 | 蓝耘MCP平台来袭!DeepSeek MCP服务器玩转大模型集成
  • 【启发式算法】Dynamic A*(D*)算法详细介绍(Python)
  • 直播 APP 开发需要多少成本
  • 数据结构入门-图的基本概念与存储结构
  • 如何在Vue3中正确使用ref和reactive?