# eduDemo **Repository Path**: ws8089/edu-showcase ## Basic Information - **Project Name**: eduDemo - **Description**: 根据已有代码完成deepseekAPI的调用 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-28 - **Last Updated**: 2025-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # webblog - 综合实践实验报告 ## 特别说明 本报告基于webblog项目编写,该项目是一个基于Spring Boot的现代化博客系统。报告详细介绍了项目的设计、实现和测试过程,重点展示了数据库技术的应用,包括ORM映射、事务管理、缓存机制等核心技术点。本报告遵循软件工程规范,按照需求分析、设计、实现、测试的流程进行撰写,旨在全面展示项目的技术实现和实验成果。 ## 目录 1. [项目概述](#项目概述) 2. [需求分析与功能建模](#需求分析与功能建模) 3. [业务分析与行为建模](#业务分析与行为建模) 4. [数据建模](#数据建模) 5. [主要数据表](#主要数据表) - [用户表(user)](#用户表user) - [博客表(blog)](#博客表blog) - [分类表(category)](#分类表category) - [评论表(comment)](#评论表comment) - [点赞表(blog_like)](#点赞表blog_like) - [分享表(blog_share)](#分享表blog_share) - [关注表(follow)](#关注表follow) - [角色表(role)](#角色表role) - [权限表(permission)](#权限表permission) - [用户角色关联表(user_role)](#用户角色关联表user_role) - [角色权限关联表(role_permission)](#角色权限关联表role_permission) 6. [界面设计](#界面设计) 7. [项目结构](#项目结构) 8. [核心代码解析](#核心代码解析) - [1. User实体类](#1-user实体类) - [2. Blog实体类](#2-blog实体类) - [3. UserMapper接口](#3-usermapper接口) - [4. BlogMapper.xml映射文件](#4-blogmapperxml映射文件) - [5. UserService接口与实现](#5-userservice接口与实现) - [6. UserController控制器](#6-usercontroller控制器) 9. [项目功能特点](#项目功能特点) 10. [主要接口详解](#主要接口详解) - [1. 获取所有用户](#1-获取所有用户) - [2. 根据ID获取用户](#2-根据id获取用户) - [3. 根据用户名获取用户](#3-根据用户名获取用户) - [4. 添加用户](#4-添加用户) - [5. 更新用户](#5-更新用户) - [6. 根据ID删除用户](#6-根据id删除用户) - [7. 分页查询用户](#7-分页查询用户) - [8. 获取所有博客](#8-获取所有博客) - [9. 添加博客](#9-添加博客) - [10. 博客点赞](#10-博客点赞) 11. [项目技术栈](#项目技术栈) 12. [项目运行步骤](#项目运行步骤) - [1. 环境要求](#1-环境要求) - [2. 数据库配置](#2-数据库配置) - [3. 运行项目](#3-运行项目) 13. [接口测试指南](#接口测试指南) - [测试获取所有用户接口](#测试获取所有用户接口) - [测试根据ID获取用户接口](#测试根据id获取用户接口) - [测试根据用户名获取用户接口](#测试根据用户名获取用户接口) - [测试添加用户接口](#测试添加用户接口) - [测试更新用户接口](#测试更新用户接口) - [测试根据ID删除用户接口](#测试根据id删除用户接口) - [测试分页查询用户接口](#测试分页查询用户接口) 14. [实验总结](#实验总结) - [实验成果](#实验成果) - [项目中遇到的问题及解决方案](#项目中遇到的问题及解决方案) - [实验心得](#实验心得) - [项目后续优化方向](#项目后续优化方向) ## 项目概述 webblog是一个基于Spring Boot框架开发的现代化博客系统,旨在为用户提供一个简洁、高效的博客创作和分享平台。系统支持用户注册登录、个人信息管理、博客发布与管理、评论互动、点赞分享、关注用户等核心功能。 项目采用分层架构设计,包括数据访问层、业务逻辑层和表现层,实现了代码的高内聚低耦合。在数据库技术方面,系统使用MySQL作为主数据库,Redis作为缓存数据库,结合MyBatis实现ORM映射,Spring Transaction实现事务管理,展示了现代Web应用中数据库技术的综合应用。 ## 需求分析与功能建模 ### 功能需求 1. **用户管理**:用户注册、登录、个人信息管理(昵称、头像、个性签名)、密码修改。 2. **博客管理**:博客发布、编辑、删除、分类、搜索、阅读量统计。 3. **社交功能**:评论、点赞、分享、关注用户。 4. **文件管理**:图片上传、附件上传。 5. **系统功能**:权限管理、数据统计、缓存优化。 ### 非功能需求 1. **性能需求**:页面加载时间小于2秒,系统并发数支持100+。 2. **安全需求**:用户密码加密存储,支持JWT认证,权限控制。 3. **可靠性需求**:数据持久化,事务一致性保障。 4. **可扩展性需求**:模块化设计,支持功能扩展。 ### 功能模块划分 1. **用户模块**:处理用户注册、登录、信息管理等功能。 2. **博客模块**:处理博客发布、编辑、删除、查询等功能。 3. **评论模块**:处理博客评论的发布、查询、删除等功能。 4. **社交模块**:处理点赞、分享、关注等社交功能。 5. **文件模块**:处理图片和附件的上传、下载等功能。 6. **系统模块**:处理权限管理、数据统计等系统功能。 ## 业务分析与行为建模 ### 主要业务流程 1. **用户注册流程**: - 用户填写注册信息(用户名、密码、邮箱) - 系统验证信息合法性 - 密码加密存储 - 创建用户账户 - 返回注册结果 2. **博客发布流程**: - 用户登录后进入发布页面 - 填写博客标题、内容、选择分类 - 上传封面图片(可选) - 提交发布请求 - 系统保存博客信息 - 返回发布结果 3. **评论流程**: - 用户浏览博客 - 填写评论内容 - 提交评论请求 - 系统保存评论信息 - 更新博客评论数 - 返回评论结果 4. **点赞流程**: - 用户浏览博客 - 点击点赞按钮 - 系统检查是否已点赞 - 更新点赞状态和计数 - 返回点赞结果 ## 数据建模 ### 数据模型设计原则 1. **遵循三大范式**:确保数据的完整性和一致性。 2. **合理的表关系**:使用外键建立表之间的关联关系。 3. **适当的冗余**:在不影响数据一致性的前提下,适当增加冗余字段提高查询效率。 4. **索引设计**:为频繁查询的字段添加索引,提高查询性能。 ### 实体关系图(ER图) 主要实体包括:用户(User)、博客(Blog)、分类(Category)、评论(Comment)、点赞(BlogLike)、分享(BlogShare)、关注(Follow)、角色(Role)、权限(Permission)等。实体之间的关系如下: - 用户与博客:一对多关系(一个用户可以发布多篇博客) - 用户与评论:一对多关系(一个用户可以发表多条评论) - 博客与分类:多对一关系(多篇博客可以属于一个分类) - 博客与评论:一对多关系(一篇博客可以有多条评论) - 博客与点赞:一对多关系(一篇博客可以有多个点赞) - 博客与分享:一对多关系(一篇博客可以被分享多次) - 用户与关注:多对多关系(用户可以关注多个用户,也可以被多个用户关注) - 用户与角色:多对多关系(一个用户可以有多个角色,一个角色可以分配给多个用户) - 角色与权限:多对多关系(一个角色可以有多个权限,一个权限可以分配给多个角色) ## 主要数据表 ### 用户表(user) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 用户ID | | username | VARCHAR(50) | UNIQUE, NOT NULL | 用户名 | | password | VARCHAR(255) | NOT NULL | 密码(加密存储) | | nickname | VARCHAR(50) | | 昵称 | | email | VARCHAR(100) | UNIQUE, NOT NULL | 邮箱 | | avatar | VARCHAR(255) | | 头像URL | | signature | VARCHAR(255) | | 个性签名 | | create_time | DATETIME | NOT NULL | 创建时间 | | update_time | DATETIME | NOT NULL | 更新时间 | ### 角色表(role) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 角色ID | | name | VARCHAR(50) | UNIQUE, NOT NULL | 角色名称 | | description | VARCHAR(255) | | 角色描述 | ### 权限表(permission) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 权限ID | | name | VARCHAR(50) | UNIQUE, NOT NULL | 权限名称 | | description | VARCHAR(255) | | 权限描述 | | url | VARCHAR(255) | | 权限URL | ### 用户角色关联表(user_role) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | user_id | BIGINT | PRIMARY KEY, FOREIGN KEY | 用户ID | | role_id | BIGINT | PRIMARY KEY, FOREIGN KEY | 角色ID | ### 角色权限关联表(role_permission) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | role_id | BIGINT | PRIMARY KEY, FOREIGN KEY | 角色ID | | permission_id | BIGINT | PRIMARY KEY, FOREIGN KEY | 权限ID | ### 博客表(blog) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 博客ID | | title | VARCHAR(100) | NOT NULL | 博客标题 | | content | TEXT | NOT NULL | 博客内容 | | cover_image | VARCHAR(255) | | 封面图片URL | | user_id | BIGINT | FOREIGN KEY, NOT NULL | 作者ID | | category_id | BIGINT | FOREIGN KEY | 分类ID | | views | INT | DEFAULT 0 | 阅读量 | | comment_count | INT | DEFAULT 0 | 评论数 | | like_count | INT | DEFAULT 0 | 点赞数 | | share_count | INT | DEFAULT 0 | 分享数 | | original_blog_id | BIGINT | FOREIGN KEY | 原始博客ID(用于转发) | | original_username | VARCHAR(50) | | 原始博客作者用户名 | | original_avatar | VARCHAR(255) | | 原始博客作者头像 | | card_style | VARCHAR(50) | DEFAULT 'default' | 卡片样式 | | create_time | DATETIME | NOT NULL | 创建时间 | | update_time | DATETIME | NOT NULL | 更新时间 | ### 分类表(category) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 分类ID | | name | VARCHAR(50) | UNIQUE, NOT NULL | 分类名称 | | description | VARCHAR(255) | | 分类描述 | ### 评论表(comment) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 评论ID | | content | TEXT | NOT NULL | 评论内容 | | user_id | BIGINT | FOREIGN KEY, NOT NULL | 评论用户ID | | blog_id | BIGINT | FOREIGN KEY, NOT NULL | 博客ID | | parent_id | BIGINT | FOREIGN KEY | 父评论ID(用于回复) | | create_time | DATETIME | NOT NULL | 创建时间 | ### 点赞表(blog_like) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 点赞ID | | user_id | BIGINT | FOREIGN KEY, NOT NULL | 用户ID | | blog_id | BIGINT | FOREIGN KEY, NOT NULL | 博客ID | | create_time | DATETIME | NOT NULL | 点赞时间 | ### 分享表(blog_share) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 分享ID | | user_id | BIGINT | FOREIGN KEY, NOT NULL | 用户ID | | blog_id | BIGINT | FOREIGN KEY, NOT NULL | 博客ID | | share_platform | VARCHAR(50) | NOT NULL | 分享平台 | | create_time | DATETIME | NOT NULL | 分享时间 | ### 关注表(follow) | 字段名 | 数据类型 | 约束 | 描述 | |-------|---------|-----|-----| | id | BIGINT | PRIMARY KEY, AUTO_INCREMENT | 关注ID | | user_id | BIGINT | FOREIGN KEY, NOT NULL | 关注者ID | | follow_user_id | BIGINT | FOREIGN KEY, NOT NULL | 被关注者ID | | create_time | DATETIME | NOT NULL | 关注时间 | ## 界面设计 系统界面采用简洁现代的设计风格,主要包括以下页面: 1. **首页**:展示热门博客、最新博客、分类导航等。 2. **登录页**:用户登录界面。 3. **注册页**:用户注册界面。 4. **博客详情页**:展示博客内容、评论、点赞分享等功能。 5. **个人中心**:用户个人信息管理、博客管理、关注列表等。 6. **写博客页**:博客发布和编辑界面。 7. **设置页**:用户个人设置界面。 界面设计遵循响应式设计原则,支持不同设备访问。 ## 项目结构 项目采用标准的Spring Boot分层架构,清晰地分离了数据访问层、业务逻辑层和表现层,便于维护和扩展。 webPlog/ ├── src/ │ ├── main/ │ │ ├── java/com/example/webPlog/ │ │ │ ├── config/ # 配置类(缓存、安全、事务等) │ │ │ ├── controller/ # 控制器层(API接口) │ │ │ ├── mapper/ # 数据访问层(MyBatis映射接口) │ │ │ ├── model/entity/ # 实体类(数据库表映射) │ │ │ ├── service/ # 业务逻辑层(服务接口) │ │ │ ├── service/impl/ # 业务逻辑实现 │ │ │ ├── util/ # 工具类(JWT、密码加密等) │ │ │ └── WebPlogApplication.java # 应用启动类 │ │ └── resources/ │ │ ├── *.xml # MyBatis XML映射文件 │ │ ├── static/ # 静态资源(HTML、CSS、JS) │ │ └── application.properties # 应用配置文件 │ └── test/ # 单元测试代码 ├── uploads/ # 文件上传目录 ├── pom.xml # Maven依赖配置 └── Dockerfile # Docker部署配置 ## 核心代码解析 ### 1. User实体类 ```java package com.example.webPlog.model.entity; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.util.Date; import java.util.List; @Data public class User { private Long id; private String username; private String password; private String nickname; private String email; private String avatar; private String signature; private Date createTime; private Date updateTime; // 用户关联的角色列表 - JSON序列化时忽略 @JsonIgnore private List roles; // 用户关联的角色ID列表 private List roleIds; } ``` **解析**:User实体类是用户表的映射,使用Lombok的@Data注解简化getter和setter方法的编写。实体类包含用户的基本信息(ID、用户名、密码、昵称、邮箱、头像、个性签名、创建时间、更新时间),以及与角色的关联关系(角色列表和角色ID列表)。使用@JsonIgnore注解忽略角色列表的JSON序列化,避免循环引用问题。 ### 2. Blog实体类 ```java package com.example.webPlog.model.entity; import lombok.Data; import lombok.Getter; import lombok.Setter; import java.util.Date; @Data public class Blog { private Long id; private String title; private String content; private String coverImage; private Long userId; private Long categoryId; // 添加categoryName的getter和setter方法 private String categoryName; // 添加username的getter和setter方法 private String username; private Integer views = 0; private Integer commentCount = 0; private Integer likeCount = 0; // 点赞数,初始化为0 private Integer shareCount = 0; // 转发数,初始化为0 private Long originalBlogId; // 原始博客ID,用于标识转发的博客 // 原始博客作者信息 private String originalUsername; private String originalAvatar; private Date createTime; private Date updateTime; private String avatar; private String cardStyle = "default"; // 卡片样式,默认值为"default" } ``` **解析**:Blog实体类是博客表的映射,包含博客的基本信息(ID、标题、内容、封面图片、作者ID、分类ID、阅读量、评论数、点赞数、分享数、创建时间、更新时间),以及转发相关信息(原始博客ID、原始博客作者用户名、原始博客作者头像)。实体类还包含一些非数据库字段(如分类名称、用户名、作者头像),用于在查询时直接返回关联数据,提高查询效率。 ### 3. UserMapper接口 ```java package com.example.webPlog.mapper; import com.example.webPlog.model.entity.User; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; @Mapper public interface UserMapper { User findByUsername(String username); void save(User user); void update(User user); List getAllUsers(@Param("offset") Integer offset, @Param("pageSize") Integer pageSize, @Param("keyword") String keyword); Integer getUserCount(@Param("keyword") String keyword); Integer deleteUser(Long userId); } ``` **解析**:UserMapper接口是用户数据访问层的核心,使用@Mapper注解标记为MyBatis映射接口。接口定义了用户数据的基本操作:根据用户名查询用户、保存用户、更新用户、获取用户列表(分页、关键词搜索)、获取用户总数、删除用户。使用@Param注解指定参数名称,便于在XML映射文件中引用。 ### 4. BlogMapper.xml映射文件 ```xml INSERT INTO blog(title, content, cover_image, user_id, category_id, views, comment_count, create_time, update_time, original_blog_id, original_username, original_avatar, card_style) VALUES (#{title}, #{content}, #{coverImage}, #{userId}, #{categoryId}, #{views}, #{commentCount}, #{createTime}, #{updateTime}, #{originalBlogId}, #{originalUsername}, #{originalAvatar}, #{cardStyle}) UPDATE blog SET like_count = like_count + #{increment} WHERE id = #{blogId} ``` **解析**:BlogMapper.xml是博客数据访问的映射文件,定义了SQL语句和结果映射规则。主要包括: 1. **ResultMap定义**:定义了BlogWithCategoryResultMap结果映射,用于将查询结果映射到Blog实体类,包括基本字段和关联表字段。 2. **查询操作**:getById查询博客详情,使用LEFT JOIN关联分类表和用户表,获取博客的完整信息;getList查询博客列表,支持分类筛选和分页。 3. **插入操作**:insert插入博客信息,使用useGeneratedKeys和keyProperty获取自动生成的ID。 4. **更新操作**:updateLikeCount更新博客点赞数,支持增加或减少点赞数。 ### 5. UserService接口与实现 ```java // UserService接口 public interface UserService { User findByUsername(String username); User save(User user); boolean updateUserWithRoles(User user, List roleIds); boolean updateUserInfo(User user); List getAllUsers(Integer offset, Integer pageSize, String keyword); Integer getUserCount(String keyword); boolean deleteUser(Long userId); } // UserServiceImpl实现 @Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; @Autowired private UserRoleMapper userRoleMapper; @Override @Cacheable(value = "userCache", key = "'user:info:' + #username", unless = "#result == null") public User findByUsername(String username) { // 先查询用户基本信息 User user = userMapper.findByUsername(username); if (user != null) { // 查询用户角色信息 List roleIds = userRoleMapper.findRoleIdsByUserId(user.getId()); user.setRoleIds(roleIds); } return user; } @Override @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) @CacheEvict(value = "userCache", key = "'user:info:' + #user.username") public User save(User user) { try { // 设置创建时间和更新时间 Date now = new Date(); if (user.getCreateTime() == null) { user.setCreateTime(now); } if (user.getUpdateTime() == null) { user.setUpdateTime(now); } userMapper.save(user); // 保存用户角色关联 if (user.getRoleIds() != null && !user.getRoleIds().isEmpty()) { List userRoles = new ArrayList<>(); for (Long roleId : user.getRoleIds()) { UserRole userRole = new UserRole(); userRole.setUserId(user.getId()); userRole.setRoleId(roleId); userRoles.add(userRole); } userRoleMapper.saveBatch(userRoles); } // 保存成功后,重新查询用户以确保返回的是数据库中的实际数据 return userMapper.findByUsername(user.getUsername()); } catch (Exception e) { e.printStackTrace(); return null; } } } ``` **解析**:UserService是用户业务逻辑层的核心,提供了用户管理的业务逻辑实现。主要特点包括: 1. **缓存优化**:使用@Cacheable注解缓存用户信息,提高查询效率;使用@CacheEvict注解在数据更新时清除缓存,确保数据一致性。 2. **事务管理**:使用@Transactional注解实现事务管理,确保用户信息和角色关联的一致性。 3. **业务逻辑**:实现了用户查询、保存、更新、删除等业务逻辑,包括用户角色关联的处理。 ### 6. UserController控制器 ```java @RestController @RequestMapping("/api/user") public class UserController { @Autowired private UserService userService; @GetMapping("/info/{username}") public Result getUserInfo(@PathVariable String username) { User user = userService.findByUsername(username); if (user != null) { // 隐藏敏感信息 user.setPassword(null); return Result.success(user); } else { return Result.error("用户不存在"); } } @PostMapping("/register") public Result register(@RequestBody User user) { // 验证用户名是否已存在 if (userService.findByUsername(user.getUsername()) != null) { return Result.error("用户名已存在"); } // 密码加密 user.setPassword(PasswordUtil.encode(user.getPassword())); // 保存用户 User savedUser = userService.save(user); if (savedUser != null) { savedUser.setPassword(null); return Result.success(savedUser); } else { return Result.error("注册失败"); } } @PostMapping("/login") public Result login(@RequestBody User user) { // 根据用户名查询用户 User existingUser = userService.findByUsername(user.getUsername()); if (existingUser == null) { return Result.error("用户名或密码错误"); } // 验证密码 if (!PasswordUtil.matches(user.getPassword(), existingUser.getPassword())) { return Result.error("用户名或密码错误"); } // 生成JWT令牌 String token = JwtUtil.generateToken(existingUser.getUsername()); // 返回用户信息和令牌 existingUser.setPassword(null); Map result = new HashMap<>(); result.put("user", existingUser); result.put("token", token); return Result.success(result); } } ``` **解析**:UserController是用户模块的控制器,处理用户相关的HTTP请求。主要功能包括: 1. **用户信息查询**:根据用户名查询用户信息,隐藏密码等敏感信息。 2. **用户注册**:验证用户名是否已存在,密码加密,保存用户信息。 3. **用户登录**:验证用户名和密码,生成JWT令牌返回给客户端。 控制器使用@RestController注解标记为RESTful风格的控制器,@RequestMapping指定请求路径,@GetMapping和@PostMapping分别处理GET和POST请求。使用Result类统一返回格式,确保API接口的一致性。 ## 项目功能特点 ### 1. 数据库配置 系统提供了完整的数据库配置方案,支持MySQL数据库的连接和配置。配置文件中包含数据库URL、用户名、密码、连接池配置等信息,便于在不同环境中部署和配置。 ```properties # 数据库配置 spring.datasource.url=jdbc:mysql://127.0.0.1:3306/webblog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=Abcd+7117 # MyBatis配置 mybatis.mapper-locations=classpath:*.xml mybatis.type-aliases-package=com.example.webPlog.model.entity mybatis.configuration.map-underscore-to-camel-case=true ``` ### 2. 高级事务管理 系统实现了灵活的事务管理机制,支持声明式事务配置,可配置事务隔离级别和传播特性,确保数据的一致性和完整性。 ```java @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public User save(User user) { // 业务逻辑实现 } ``` ### 3. Redis缓存与会话管理 系统集成Redis实现了高效的缓存机制,用于缓存用户信息、热门博客等数据,提高系统性能。同时,Redis还可用于会话管理,支持分布式部署。 ```java @Cacheable(value = "userCache", key = "'user:info:' + #username", unless = "#result == null") public User findByUsername(String username) { // 查询用户信息 } @CacheEvict(value = "userCache", key = "'user:info:' + #user.username") public User save(User user) { // 保存用户信息 } ``` ### 4. JWT认证与权限控制 系统使用JWT(JSON Web Token)实现用户认证,支持无状态会话,提高系统的可扩展性。同时,系统实现了基于角色的权限控制,确保不同角色的用户只能访问其有权限的资源。 ```java // 生成JWT令牌 String token = JwtUtil.generateToken(user.getUsername()); // 验证JWT令牌 boolean valid = JwtUtil.validateToken(token); ``` ### 5. 文件上传与管理 系统支持图片和附件的上传与管理,实现了文件上传的限制(大小、类型),确保系统的安全性和稳定性。 ```properties # 文件上传配置 spring.servlet.multipart.enabled=true spring.servlet.multipart.max-file-size=10MB spring.servlet.multipart.max-request-size=50MB # 文件上传路径 file.upload.path=static/files/ avatar.upload.path=static/images/avatar/ ``` ## 主要接口详解 ### 1. 获取所有用户 **接口URL**:`GET /api/user/all` **请求参数**: - `offset`:偏移量,可选 - `pageSize`:每页大小,可选 - `keyword`:搜索关键词,可选 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "users": [ { "id": 1, "username": "admin", "nickname": "管理员", "email": "admin@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "系统管理员", "createTime": "2023-01-01T00:00:00", "updateTime": "2023-01-01T00:00:00", "roleIds": [1] } ], "total": 1 } } ``` ### 2. 根据ID获取用户 **接口URL**:`GET /api/user/{id}` **请求参数**: - `id`:用户ID,路径参数 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 1, "username": "admin", "nickname": "管理员", "email": "admin@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "系统管理员", "createTime": "2023-01-01T00:00:00", "updateTime": "2023-01-01T00:00:00", "roleIds": [1] } } ``` ### 3. 根据用户名获取用户 **接口URL**:`GET /api/user/info/{username}` **请求参数**: - `username`:用户名,路径参数 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 1, "username": "admin", "nickname": "管理员", "email": "admin@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "系统管理员", "createTime": "2023-01-01T00:00:00", "updateTime": "2023-01-01T00:00:00", "roleIds": [1] } } ``` ### 4. 添加用户 **接口URL**:`POST /api/user/add` **请求参数**: ```json { "username": "testuser", "password": "password123", "nickname": "测试用户", "email": "test@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "这是一个测试用户", "roleIds": [2] } ``` **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 2, "username": "testuser", "nickname": "测试用户", "email": "test@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "这是一个测试用户", "createTime": "2023-01-02T00:00:00", "updateTime": "2023-01-02T00:00:00", "roleIds": [2] } } ``` ### 5. 更新用户 **接口URL**:`PUT /api/user/update` **请求参数**: ```json { "id": 2, "username": "testuser", "nickname": "更新后的测试用户", "email": "updated@example.com", "avatar": "images/avatar/new-avatar.jpg", "signature": "这是更新后的测试用户", "roleIds": [2] } ``` **响应示例**: ```json { "code": 200, "message": "成功", "data": null } ``` ### 6. 根据ID删除用户 **接口URL**:`DELETE /api/user/{id}` **请求参数**: - `id`:用户ID,路径参数 **响应示例**: ```json { "code": 200, "message": "成功", "data": null } ``` ### 7. 分页查询用户 **接口URL**:`GET /api/user/list` **请求参数**: - `page`:页码,默认1 - `pageSize`:每页大小,默认10 - `keyword`:搜索关键词,可选 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "users": [ { "id": 1, "username": "admin", "nickname": "管理员", "email": "admin@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "系统管理员", "createTime": "2023-01-01T00:00:00", "updateTime": "2023-01-01T00:00:00", "roleIds": [1] } ], "total": 1, "page": 1, "pageSize": 10 } } ``` ### 8. 获取所有博客 **接口URL**:`GET /api/blog/list` **请求参数**: - `page`:页码,默认1 - `pageSize`:每页大小,默认10 - `categoryId`:分类ID,可选 **响应示例**: ```json { "code": 200, "message": "成功", "data": { "blogs": [ { "id": 1, "title": "测试博客", "content": "这是一篇测试博客", "coverImage": "images/cover/test.jpg", "userId": 1, "categoryId": 1, "categoryName": "技术分享", "username": "admin", "views": 100, "commentCount": 10, "likeCount": 20, "shareCount": 5, "createTime": "2023-01-01T00:00:00" } ], "total": 1, "page": 1, "pageSize": 10 } } ``` ### 9. 添加博客 **接口URL**:`POST /api/blog/create` **请求参数**: ```json { "title": "新博客", "content": "这是一篇新博客的内容", "coverImage": "images/cover/new.jpg", "categoryId": 1, "cardStyle": "default" } ``` **响应示例**: ```json { "code": 200, "message": "成功", "data": { "id": 2, "title": "新博客", "content": "这是一篇新博客的内容", "coverImage": "images/cover/new.jpg", "userId": 1, "categoryId": 1, "views": 0, "commentCount": 0, "likeCount": 0, "shareCount": 0, "cardStyle": "default", "createTime": "2023-01-03T00:00:00", "updateTime": "2023-01-03T00:00:00" } } ``` ### 10. 博客点赞 **接口URL**:`POST /api/blog/like/{id}` **请求参数**: - `id`:博客ID,路径参数 **响应示例**: ```json { "code": 200, "message": "点赞成功", "data": { "likeCount": 21 } } ``` ## 项目技术栈 | 技术类别 | 技术名称 | 版本 | 用途 | |---------|---------|------|------| | 应用框架 | Spring Boot | 3.5.6 | 应用开发框架 | | ORM框架 | MyBatis | 3.0.3 | 数据库访问层 | | 关系型数据库 | MySQL | 8.0+ | 核心数据存储 | | 非关系型数据库 | Redis | 6.0+ | 缓存和会话管理 | | 安全框架 | Spring Security | - | 安全认证与授权 | | 认证技术 | JWT | 0.11.5 | 身份认证 | | 构建工具 | Maven | 3.6+ | 项目构建与依赖管理 | | 开发语言 | Java | 21 | 应用开发语言 | | 代码简化 | Lombok | - | 简化Java代码 | | 前端技术 | HTML/CSS/JavaScript | - | 页面开发 | ## 项目运行步骤 ### 1. 环境要求 - **JDK 21+**:确保已安装并配置好环境变量 - **Maven 3.6+**:项目构建工具 - **MySQL 8.0+**:关系型数据库服务 - **Redis 6.0+**:缓存服务 ### 2. 数据库配置 1. **创建数据库**: ```sql CREATE DATABASE webblog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` 2. **修改配置文件**:修改 `src/main/resources/application.properties` 文件中的数据库连接信息 ```properties spring.datasource.url=jdbc:mysql://127.0.0.1:3306/webblog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC spring.datasource.username=root spring.datasource.password=Abcd+7117 ``` 3. **Redis配置**:修改 Redis 连接信息 ```properties spring.redis.host=127.0.0.1 spring.redis.port=6379 spring.redis.password= spring.redis.database=0 ``` ### 3. 运行项目 #### 方法一:使用Maven运行 ```bash mvn spring-boot:run ``` #### 方法二:打包后运行 1. **构建项目**: ```bash mvn clean package -DskipTests ``` 2. **运行JAR文件**: ```bash java -jar target/webPlog-0.0.1-SNAPSHOT.jar ``` ### 4. 访问应用 项目启动后,可通过以下地址访问: - 首页:`http://localhost:8083/blog` - 登录页:`http://localhost:8083/blog/login.html` - 注册页:`http://localhost:8083/blog/register.html` ## 接口测试指南 ### 测试获取所有用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的GET请求 2. 输入URL:`http://localhost:8083/blog/api/user/all` 3. 点击"Send"按钮发送请求 4. 查看响应结果,验证是否返回所有用户信息 ### 测试根据ID获取用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的GET请求 2. 输入URL:`http://localhost:8083/blog/api/user/1`(假设用户ID为1) 3. 点击"Send"按钮发送请求 4. 查看响应结果,验证是否返回指定ID的用户信息 ### 测试根据用户名获取用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的GET请求 2. 输入URL:`http://localhost:8083/blog/api/user/info/admin`(假设用户名为admin) 3. 点击"Send"按钮发送请求 4. 查看响应结果,验证是否返回指定用户名的用户信息 ### 测试添加用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的POST请求 2. 输入URL:`http://localhost:8083/blog/api/user/add` 3. 选择"Body"选项卡,选择"raw"格式,设置为"JSON" 4. 输入请求参数: ```json { "username": "testuser", "password": "password123", "nickname": "测试用户", "email": "test@example.com", "avatar": "images/avatar/default-avatar.jpg", "signature": "这是一个测试用户", "roleIds": [2] } ``` 5. 点击"Send"按钮发送请求 6. 查看响应结果,验证是否成功添加用户 ### 测试更新用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的PUT请求 2. 输入URL:`http://localhost:8083/blog/api/user/update` 3. 选择"Body"选项卡,选择"raw"格式,设置为"JSON" 4. 输入请求参数: ```json { "id": 2, "username": "testuser", "nickname": "更新后的测试用户", "email": "updated@example.com", "avatar": "images/avatar/new-avatar.jpg", "signature": "这是更新后的测试用户", "roleIds": [2] } ``` 5. 点击"Send"按钮发送请求 6. 查看响应结果,验证是否成功更新用户 ### 测试根据ID删除用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的DELETE请求 2. 输入URL:`http://localhost:8083/blog/api/user/2`(假设用户ID为2) 3. 点击"Send"按钮发送请求 4. 查看响应结果,验证是否成功删除用户 ### 测试分页查询用户接口 **测试工具**:Postman **测试步骤**: 1. 打开Postman,创建一个新的GET请求 2. 输入URL:`http://localhost:8083/blog/api/user/list?page=1&pageSize=10` 3. 点击"Send"按钮发送请求 4. 查看响应结果,验证是否返回分页后的用户列表 ## 实验总结 ### 实验成果 本次实验成功实现了一个基于Spring Boot的现代化博客系统(webblog),主要成果包括: 1. **完成了系统的整体架构设计**:采用分层架构,包括数据访问层、业务逻辑层和表现层,实现了代码的高内聚低耦合。 2. **实现了核心功能模块**:包括用户管理、博客管理、评论管理、社交功能(点赞、分享、关注)、文件管理等核心功能。 3. **应用了多种数据库技术**:使用MySQL作为主数据库,Redis作为缓存数据库,结合MyBatis实现ORM映射,Spring Transaction实现事务管理,展示了现代Web应用中数据库技术的综合应用。 4. **实现了系统的安全性**:包括用户密码加密存储、JWT认证、权限控制等安全机制,确保系统的安全性。 5. **优化了系统的性能**:通过Redis缓存、索引设计、查询优化等手段,提高了系统的性能和响应速度。 ### 项目中遇到的问题及解决方案 1. **数据库连接失败** - **问题**:启动项目时出现数据库连接失败的错误。 - **解决方案**:检查数据库服务是否启动,数据库连接信息(URL、用户名、密码)是否正确,数据库是否存在。 2. **MyBatis映射错误** - **问题**:运行时出现MyBatis映射错误,如字段映射错误、SQL语法错误等。 - **解决方案**:检查实体类与数据库表的字段映射是否正确,SQL语句是否符合语法规范,ResultMap配置是否正确。 3. **中文乱码问题** - **问题**:页面显示中文乱码,数据库存储中文乱码。 - **解决方案**:设置数据库的字符集为utf8mb4,设置Spring Boot的编码为UTF-8,确保页面的编码为UTF-8。 4. **端口占用问题** - **问题**:启动项目时出现端口占用错误。 - **解决方案**:修改application.properties文件中的server.port配置,使用其他未被占用的端口。 5. **依赖下载失败** - **问题**:Maven依赖下载失败,导致项目构建失败。 - **解决方案**:检查网络连接是否正常,修改Maven仓库配置,使用国内镜像源(如阿里云镜像)。 ### 实验心得 通过本次实验,我深刻体会到了软件工程的完整流程,包括需求分析、设计、实现、测试等阶段。在项目开发过程中,我学习了Spring Boot、MyBatis、MySQL、Redis等技术的综合应用,掌握了现代Web应用的开发方法和技巧。 同时,我也认识到了数据库设计和优化的重要性。一个好的数据库设计可以提高系统的性能和可维护性,而合理的优化(如索引设计、缓存机制)可以显著提高系统的响应速度和并发能力。 此外,我还学习了如何进行团队协作开发,如何编写规范的代码和文档,如何进行单元测试和接口测试,这些都是软件工程中非常重要的技能。 ### 项目后续优化方向 1. **参数验证优化**:添加更完善的参数验证机制,使用Bean Validation注解(如@NotNull、@NotBlank、@Size等)进行参数验证,提高系统的安全性和稳定性。 2. **日志系统优化**:使用SLF4J+Logback替代默认的日志系统,实现更完善的日志记录和管理,便于系统的监控和调试。 3. **API文档优化**:使用Swagger或SpringDoc生成API文档,提高API的可维护性和易用性。 4. **性能优化**:进一步优化系统性能,包括数据库索引优化、查询优化、缓存策略优化等。 5. **安全优化**:加强系统的安全性,包括防止SQL注入、XSS攻击、CSRF攻击等安全防护措施。 6. **前端优化**:优化前端页面的性能和用户体验,使用现代前端框架(如Vue.js、React)重构前端页面。 7. **分布式部署**:支持分布式部署,使用Spring Cloud等技术实现服务的注册与发现、负载均衡、断路器等功能。 8. **数据备份与恢复**:实现完善的数据备份与恢复机制,确保数据的安全性和可靠性。 通过这些优化,可以进一步提高系统的性能、安全性、可维护性和用户体验,使系统更加完善和稳定。 ## 结语 本次实验是一次非常有意义的综合实践,通过项目的开发和实现,我不仅学习了各种技术的应用,还掌握了软件工程的基本方法和流程。在今后的学习和工作中,我将继续努力,不断提高自己的技术水平和工程实践能力,为开发更高质量的软件系统打下坚实的基础。