当前位置: 首页 > 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.lqws.cn/news/582031.html

相关文章:

  • Linux习题
  • 设计模式-观察者模式(发布订阅模式)
  • Redis 安装使用教程
  • RWKV-8 系列之 DeepEmbedAttention:精简 KV 缓存,尤其适合混合模型(RWKV-7s)
  • 使用pyflink进行kafka实时数据消费
  • 在 Vue3 + Element Plus 中实现 el-table 拖拽排序功能
  • mysql 小版本升级实战分享
  • 基于librdkafka开发的C++客户端,生产者生产发送数据失败问题处理
  • 百度文心大模型4.5系列正式开源,开源会给百度带来什么?
  • 网络安全2023—新安全新发展
  • MySQL (四):连接查询和索引
  • macos 安装 xcode
  • 【软考中级·软件评测师】下午题·面向对象测试之架构考点全析:分层、分布式、微内核与事件驱动
  • 基于C#的OPCServer应用开发,引用WtOPCSvr.dll
  • python | numpy小记(五):理解 NumPy 中的 `np.arccos`:反余弦函数
  • 卡片跳转到应用页面(router事件)
  • 一文详解Modbus协议原理、技术细节及软件辅助调试
  • 华为云Flexus+DeepSeek征文|​​华为云ModelArts Studio大模型 + WPS:AI智能PPT生成解决方案​
  • 基于时间策略+应用过滤的游戏防沉迷方案:技术实现与工具推荐
  • 本地服务器部署后外网怎么访问不了?内网地址映射互联网上无法连接问题的排查
  • 【Pandas】pandas DataFrame Flags
  • AR 学习:开启未来学习新视界​
  • Stable Diffusion 项目实战落地:从0到1 掌握ControlNet 第四篇 风格化字体大揭秘:从线稿到涂鸦,ControlNet让文字焕发新生
  • SQuirreL SQL:一个免费的通用数据库开发工具
  • OpenWrt | 使用 Docker 运行 iperf3
  • 2 大语言模型基础-2.2 生成式预训练语言模型GPT-2.2.2 有监督下游任务微调-Instruct-GPT强化学习奖励模型的结构改造与维度转换解析
  • AI行业深度观察:从资本竞逐到技术突破的全面解析
  • 38.docker启动python解释器,pycharm通过SSH服务直连
  • 物联网基础
  • 【Mars3d】支持的basemaps数组与layers数组的坐标系列举