# homework **Repository Path**: tsrsss/homework ## Basic Information - **Project Name**: homework - **Description**: 匿名聊天网站学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-10-26 - **Last Updated**: 2026-01-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # WebChat聊天系统项目 这是一个基于Spring Boot和WebSocket的现代化实时聊天应用,支持用户注册、登录、实时聊天、文件分析、天气查询等丰富功能,并采用Redis和本地缓存双机制确保系统高可用性。系统集成了完整的数据库事务管理、RBAC权限控制等企业级特性。 公网访问地址:http://47.115.215.108:8080 ## 🚀 功能特性 ### 核心功能 - ✅ **用户注册和登录** - 安全的用户认证系统 - ✅ **JWT令牌认证** - 基于JSON Web Token的无状态认证 - ✅ **实时聊天功能** - WebSocket实时双向通信 - ✅ **在线用户管理** - 实时显示在线用户状态和数量统计 - ✅ **消息持久化** - 聊天记录存储和历史消息查询 - ✅ **文件分析功能** - 支持多种文件格式分析 - ✅ **天气查询** - 集成天气API服务 - ✅ **验证码安全** - 图形验证码增强安全性 ### 高级功能 - ✅ **数据库事务管理** - 完整的ACID事务支持,确保数据一致性 - ✅ **RBAC权限系统** - 基于角色的访问控制,支持细粒度权限管理 - ✅ **缓存降级机制** - Redis不可用时自动切换到本地缓存 - ✅ **自定义背景** - 用户可自定义登录界面背景 - ✅ **文件上传** - 支持图片等文件上传和共享 - ✅ **响应式设计** - 适配不同设备屏幕尺寸 - ✅ **Spring Security** - 完整的安全认证体系 ## 🛠 技术栈 ### 后端技术 - **Spring Boot 3.5.6** - 企业级Java应用框架 - **Spring Security** - 安全认证和授权 - **Spring WebSocket** - 实时双向通信 - **Spring Data JPA** - 数据持久化层 - **Spring Transaction** - 声明式事务管理 - **JWT (JSON Web Token)** - 无状态认证机制 - **Redis** - 缓存和分布式会话管理 - **MySQL 8.0** - 关系型数据库 - **H2 Database** - 内存数据库(开发测试) ### 前端技术 - **HTML5 + CSS3 + JavaScript** - 现代化Web技术 - **WebSocket API** - 浏览器实时通信 - **响应式设计** - Bootstrap风格界面 - **File API** - 文件上传和处理 ## 📦 项目结构 ``` src/main/java/com/example/demo/ ├── config/ │ ├── JwtConfig.java # JWT配置类 │ ├── RedisConfig.java # Redis配置类 │ ├── SecurityConfig.java # Spring Security配置 │ ├── WebConfig.java # Web配置(包含JWT拦截器) │ └── WebSocketConfig.java # WebSocket配置 ├── controller/ │ ├── AuthController.java # 认证控制器 │ ├── CaptchaController.java # 验证码控制器 │ └── MessageController.java # 消息控制器 ├── entity/ │ ├── User.java # 用户实体类 │ └── Message.java # 消息实体类 ├── handler/ │ └── ChatWebSocketHandler.java # WebSocket处理器 ├── interceptor/ │ └── JwtInterceptor.java # JWT认证拦截器 ├── repository/ │ ├── UserRepository.java # 用户数据访问层 │ └── MessageRepository.java # 消息数据访问层 ├── service/ │ ├── UserService.java # 用户业务逻辑 │ ├── MessageService.java # 消息业务逻辑 │ ├── CaptchaService.java # 验证码服务 │ ├── RbacService.java # RBAC权限服务 │ ├── RoleService.java # 角色管理服务 │ └── PermissionService.java # 权限管理服务 ├── service/impl/ │ ├── RbacServiceImpl.java # RBAC权限服务实现 │ ├── RoleServiceImpl.java # 角色管理服务实现 │ └── PermissionServiceImpl.java # 权限管理服务实现 ├── util/ │ ├── JwtUtil.java # JWT工具类 │ └── RedisUtil.java # Redis工具类 └── DemoApplication.java # 应用启动类 src/main/resources/ ├── static/ # 静态资源 │ ├── index.html # 主页 │ ├── login.html # 登录页面 │ ├── register.html # 注册页面 │ ├── chat.html # 聊天页面 │ ├── file-analysis.html # 文件分析页面 │ ├── weather.html # 天气查询页面 │ ├── settings.html # 设置页面 │ └── images/ # 图片资源 ├── application.yml # 应用配置 ├── schema.sql # 数据库脚本 └── init_data.sql # RBAC系统初始化数据 ``` ## 🚀 快速开始 ### 环境要求 - **Java 17+** - 推荐使用OpenJDK 17 - **Maven 3.6+** - 项目构建工具 - **Redis 6.0+** - 缓存数据库(可选,如果未部署会自动使用本地缓存) - **MySQL 8.0+** - 关系型数据库 - **Node.js** - 可选,用于前端开发 ### 安装步骤 1. **克隆项目** ```bash git clone cd webchat_proj_demo ``` 2. **配置数据库** - 创建MySQL数据库:`webchat_db` - 修改`application.yml`中的数据库连接信息 3. **编译项目** ```bash mvn clean compile ``` 4. **运行应用** ```bash mvn spring-boot:run ``` 5. **访问应用** 打开浏览器访问:http://localhost:8080 ### 打包部署 1. **打包应用** ```bash mvn clean package -DskipTests ``` 2. **运行jar包** ```bash java -jar target/demo-0.0.2-SNAPSHOT.jar ``` ## ⚙️ 配置说明 ### 数据库配置 (application.yml) ```yaml spring: datasource: url: driver-class-name: username: password: jpa: hibernate: ddl-auto: update ``` ### Redis配置 ```yaml spring: redis: host: localhost port: 6379 database: 0 timeout: 60000 ``` ### 文件上传配置 ```yaml spring: servlet: multipart: max-file-size: 5MB max-request-size: 10MB ``` ### 第三方API配置 ```yaml # 高德地图API配置 amap: api: key: ``` ## 📡 API接口 ### 认证接口 - `POST /api/auth/login` - 用户登录(返回JWT令牌) - `POST /api/auth/register` - 用户注册 - `GET /api/auth/me` - 获取当前用户信息(需要JWT认证) ### 验证码接口 - `GET /api/captcha/generate` - 生成验证码 ### WebSocket接口 - `ws://localhost:8080/ws/chat?token={jwt_token}` - WebSocket聊天连接(需要JWT认证) ### 消息接口 - `GET /api/messages` - 获取历史消息(需要JWT认证) ### RBAC权限接口 - `GET /api/rbac/user/{userId}/permissions` - 获取用户权限列表 - `GET /api/rbac/roles` - 获取所有角色列表 - `GET /api/rbac/permissions` - 获取所有权限列表 ## 💡 使用说明 ### 用户注册登录 1. 访问注册页面创建新账户 2. 使用账户密码登录系统 3. 登录时需要输入图形验证码 ### 实时聊天 1. 登录后进入聊天室 2. 查看在线用户列表和在线人数 3. 发送和接收实时消息,支持文本和图片消息 4. 支持私聊和群聊功能 ### 文件分析 1. 访问文件分析页面 2. 上传需要分析的文件 3. 查看分析结果 ### 天气查询 1. 访问天气查询页面 2. 输入城市名称 3. 获取实时天气信息 ## 🔧 数据库事务管理 ### 声明式事务支持 系统采用Spring的声明式事务管理,通过`@Transactional`注解实现完整的事务控制: 1. **事务配置** - 在服务层使用`@Transactional`注解 - 支持事务传播行为配置 - 自动回滚运行时异常 2. **事务应用场景** - **用户注册**:确保用户数据和权限分配的事务一致性 - **消息保存**:保证消息持久化和缓存更新的原子性 - **权限管理**:角色权限关联操作的事务完整性 ### 事务隔离级别 - 默认使用数据库的默认隔离级别 - 支持可重复读(REPEATABLE_READ)级别 - 防止脏读、不可重复读和幻读 ### 事务传播行为 - **REQUIRED**:默认传播行为,支持当前事务,不存在则创建新事务 - **SUPPORTS**:支持当前事务,不存在则以非事务方式执行 ## 🔐 RBAC权限系统 ### 基于角色的访问控制 系统实现了完整的RBAC(Role-Based Access Control)权限管理模型: 1. **核心组件** - **用户(User)**:系统使用者 - **角色(Role)**:权限的集合,如admin、user、guest - **权限(Permission)**:具体的操作权限,如sys:user:manage 2. **权限关系** - 用户与角色:多对多关系 - 角色与权限:多对多关系 - 权限继承:支持角色间的权限继承 ### 权限初始化 系统启动时自动初始化RBAC基础数据: - 创建基础角色:admin、user、guest - 定义系统权限:用户管理、角色管理、内容管理等 - 建立角色权限关联关系 ### 权限验证流程 1. 用户登录后获取JWT令牌 2. 根据用户ID查询用户角色和权限 3. 验证用户是否具有访问特定资源的权限 4. 返回权限验证结果 ## 🔧 缓存机制说明 ### 多级缓存架构 系统采用Redis和本地内存缓存相结合的多级缓存架构,确保在各种网络环境下的高可用性: 1. **Redis缓存**(主缓存) - 存储在线用户信息 - 管理会话与用户映射关系 - 支持分布式部署场景 2. **本地内存缓存**(备用缓存) - Redis不可用时自动降级使用 - 维护会话与用户的本地映射关系 - 确保核心功能不受Redis状态影响 ### 缓存降级策略 当Redis服务不可用时,系统会自动: - 切换到本地缓存进行用户会话管理 - 保持在线用户统计的准确性 - 确保聊天功能正常运行 - 在Redis恢复后无需重启即可自动切换回Redis缓存 ## 🔐 JWT认证使用指南 ### JWT认证流程 1. **用户登录**:客户端调用`/api/auth/login`接口,服务端验证成功后返回JWT令牌 2. **令牌存储**:客户端将JWT令牌存储在localStorage或sessionStorage中 3. **API调用**:客户端在请求头中添加`Authorization: Bearer {token}` 4. **WebSocket连接**:客户端在WebSocket连接URL中添加`token={token}`参数 5. **令牌刷新**:客户端在令牌过期前需要重新登录获取新令牌 ### 事务管理代码示例 ```java @Service @Transactional // 开启事务管理 public class UserService { @Autowired private UserRepository userRepository; @Autowired private RoleRepository roleRepository; /** * 用户注册 - 事务方法 * 确保用户创建和角色分配的原子性 */ @Transactional(rollbackFor = Exception.class) public User registerUser(String username, String password) { // 检查用户名是否存在 if (userRepository.existsByUsername(username)) { throw new RuntimeException("用户名已存在"); } // 创建用户 User user = new User(username, password); User savedUser = userRepository.save(user); // 分配默认角色 Role defaultRole = roleRepository.findByName("user"); user.getRoles().add(defaultRole); return userRepository.save(savedUser); } } ``` ### RBAC权限验证示例 ```java @Service public class RbacServiceImpl implements RbacService { @Autowired private UserRepository userRepository; /** * 检查用户是否具有指定权限 */ public boolean hasPermission(Long userId, String permissionCode) { User user = userRepository.findById(userId) .orElseThrow(() -> new RuntimeException("用户不存在")); return user.getRoles().stream() .flatMap(role -> role.getPermissions().stream()) .anyMatch(permission -> permission.getCode().equals(permissionCode)); } /** * 获取用户所有权限 */ public Set getUserPermissions(Long userId) { User user = userRepository.findById(userId) .orElseThrow(() -> new RuntimeException("用户不存在")); return user.getRoles().stream() .flatMap(role -> role.getPermissions().stream()) .map(Permission::getCode) .collect(Collectors.toSet()); } } ``` ### JWT令牌结构 JWT令牌包含以下信息: - **用户ID** - 用于标识用户身份 - **用户名** - 用户显示名称 - **签发时间** - 令牌创建时间 - **过期时间** - 令牌有效期(默认24小时) ### 前端集成示例 ```javascript // 登录后存储令牌 localStorage.setItem('jwt_token', response.token); // API调用时添加认证头 const token = localStorage.getItem('jwt_token'); fetch('/api/some-endpoint', { headers: { 'Authorization': `Bearer ${token}` } }); // WebSocket连接 const ws = new WebSocket(`ws://localhost:8080/ws/chat?token=${token}`); ``` ## 🐛 故障排除 ### 常见问题 1. **数据库连接失败** - 检查MySQL服务是否启动 - 验证数据库连接配置 - 检查网络连接 2. **WebSocket连接失败** - 检查防火墙设置 - 验证WebSocket配置 - 查看浏览器控制台错误 - 确保JWT令牌有效 3. **Redis连接问题** - 系统会自动降级到本地缓存,不影响核心功能 - 查看服务器日志获取详细错误信息 4. **文件上传失败** - 检查文件大小是否超过限制 - 验证文件上传目录权限 - 查看服务器日志 5. **验证码不显示** - 检查浏览器是否支持Canvas - 查看网络请求状态 - 验证后端服务是否正常 ### 日志查看 应用日志级别设置为DEBUG,可在控制台查看详细日志: ```bash tail -f logs/application.log ``` ## 📊 性能优化 ### 数据库优化 - 使用连接池配置 - 添加合适的索引 - 定期清理历史数据 ### 缓存优化 - Redis与本地缓存双机制确保高可用 - 合理设置缓存过期时间 - 减少缓存穿透和缓存雪崩风险 ### 前端优化 - 压缩静态资源 - 使用CDN加速 - 启用浏览器缓存 ### 服务器优化 - 配置合适的JVM参数 - 使用Nginx反向代理 - 启用Gzip压缩 ## 🤝 贡献指南 1. Fork本项目 2. 创建功能分支 3. 提交代码变更 4. 发起Pull Request ## 📄 许可证 本项目采用MIT许可证,详情请查看LICENSE文件。 ## 📞 联系方式 如有问题或建议,请通过以下方式联系: - 提交Issue - 发送邮件 - 参与讨论 --- **注意**: 本项目仅供学习和演示使用,生产环境部署请确保做好安全配置和性能优化。