diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolActivitySignupController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolActivitySignupController.java index 911ef8c5..f293116e 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolActivitySignupController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolActivitySignupController.java @@ -1,9 +1,6 @@ package org.jeecg.modules.aiol.controller; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -13,8 +10,11 @@ import javax.servlet.http.HttpServletResponse; import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.query.QueryRuleEnum; +import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.oConvertUtils; +import org.jeecg.modules.aiol.entity.AiolActivity; import org.jeecg.modules.aiol.entity.AiolActivitySignup; +import org.jeecg.modules.aiol.service.IAiolActivityService; import org.jeecg.modules.aiol.service.IAiolActivitySignupService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -22,6 +22,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; +import org.jeecg.modules.system.entity.SysUser; +import org.jeecg.modules.system.service.impl.SysUserServiceImpl; import org.jeecgframework.poi.excel.ExcelImportUtil; import org.jeecgframework.poi.excel.def.NormalExcelConstants; import org.jeecgframework.poi.excel.entity.ExportParams; @@ -51,6 +53,10 @@ import org.apache.shiro.authz.annotation.RequiresPermissions; public class AiolActivitySignupController extends JeecgController { @Autowired private IAiolActivitySignupService aiolActivitySignupService; + @Autowired + private SysUserServiceImpl sysUserService; + @Autowired + private IAiolActivityService aiolActivityService; /** * 分页列表查询 @@ -75,7 +81,7 @@ public class AiolActivitySignupController extends JeecgController pageList = aiolActivitySignupService.page(page, queryWrapper); return Result.OK(pageList); } - + /** * 添加 * @@ -91,7 +97,7 @@ public class AiolActivitySignupController extends JeecgController> queryMyActivit(HttpServletRequest req) { + try { + // 1. 从JWT中获取当前用户信息 + String username = JwtUtil.getUserNameByToken(req); + if (username == null || username.trim().isEmpty()) { + return Result.error(401, "用户未登录或token无效"); + } + SysUser currentUser = sysUserService.getUserByName(username); + if (currentUser == null) { + return Result.error(404, "用户不存在"); + } + // 2. 根据当前用户ID查询报名信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", currentUser.getId()); + List list = aiolActivitySignupService.list(queryWrapper); + // 3. 根据报名信息中的活动ID查询活动信息 + List activityList = new ArrayList<>(); + List activityIds = list.stream() + .map(AiolActivitySignup::getActivityId) + .collect(Collectors.toList()); + if (!activityIds.isEmpty()) { + activityList = aiolActivityService.listByIds(activityIds); + } + return Result.OK(activityList); + }catch (Exception e){ + log.error("查询失败: {}", e.getMessage(), e); + } + return Result.OK(); + } + } diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserController.java index aef54ad9..1da46a56 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserController.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.system.api.ISysBaseAPI; import org.jeecg.common.system.util.JwtUtil; @@ -212,24 +213,24 @@ public class AiolUserController { try { // 构建查询条件 LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - + // 只查询教师角色的用户 - queryWrapper.inSql(SysUser::getId, + queryWrapper.inSql(SysUser::getId, "SELECT user_id FROM sys_user_role WHERE role_id = '1955367301787348993'"); // 教师角色ID - + // 可选条件:按姓名查询 if (realName != null && !realName.trim().isEmpty()) { queryWrapper.like(SysUser::getRealname, realName.trim()); } - + // 可选条件:按工号查询 if (workNo != null && !workNo.trim().isEmpty()) { queryWrapper.like(SysUser::getWorkNo, workNo.trim()); } - + // 查询用户列表 List teachers = sysUserService.list(queryWrapper); - + // 构建返回结果 List> result = teachers.stream().map(teacher -> { Map teacherInfo = new LinkedHashMap<>(); @@ -242,7 +243,7 @@ public class AiolUserController { teacherInfo.put("avatar", teacher.getAvatar()); teacherInfo.put("status", teacher.getStatus()); teacherInfo.put("createTime", teacher.getCreateTime()); - + // 查询扩展信息 AiolUserInfo userInfo = userInfoMapper.selectOne( new QueryWrapper().eq("user_id", teacher.getId())); @@ -253,12 +254,12 @@ public class AiolUserController { teacherInfo.put("title", userInfo.getTitle()); teacherInfo.put("tag", userInfo.getTag()); } - + return teacherInfo; }).collect(Collectors.toList()); - + return Result.OK(result); - + } catch (Exception e) { log.error("查询教师用户失败: realName={}, workNo={}, error={}", realName, workNo, e.getMessage(), e); return Result.error("查询教师用户失败: " + e.getMessage()); @@ -271,13 +272,13 @@ public class AiolUserController { @Transactional(rollbackFor = Exception.class) public Result studentRegister(@RequestBody Map registerData) { Result result = new Result<>(); - + try { // 1. 获取注册参数 String studentNumber = registerData.get("studentNumber"); String inviteCode = registerData.get("inviteCode"); String password = registerData.get("password"); - + // 2. 参数验证 if (studentNumber == null || studentNumber.trim().isEmpty()) { return result.error500("学号不能为空"); @@ -288,13 +289,13 @@ public class AiolUserController { if (password == null || password.trim().isEmpty()) { return result.error500("密码不能为空"); } - + // 3. 检查学号是否已被注册 SysUser existingUser = sysUserService.getUserByName(studentNumber); if (existingUser != null) { return result.error500("学号已被注册,请使用其他学号"); } - + // 4. 检查邀请码是否对应某个班级 LambdaQueryWrapper classQuery = new LambdaQueryWrapper<>(); classQuery.eq(AiolClass::getInviteCode, inviteCode); @@ -303,26 +304,26 @@ public class AiolUserController { if (targetClass == null) { return result.error500("邀请码无效,请检查邀请码是否正确"); } - + // 5. 使用通用方法创建学生用户 SysUser studentUser = sysUserService.createStudentUser(studentNumber, studentNumber, password); - + // 6. 设置工号(学号) studentUser.setWorkNo(studentNumber); sysUserService.updateById(studentUser); - + // 7. 自动加入班级 AiolClassStudent classStudent = new AiolClassStudent(); classStudent.setClassId(targetClass.getId()); classStudent.setStudentId(studentUser.getId()); classStudent.setCreateBy("system"); // 系统创建 classStudent.setCreateTime(new Date()); - + boolean classStudentSaved = aiolClassStudentService.save(classStudent); if (!classStudentSaved) { throw new RuntimeException("加入班级失败"); } - + // 8. 构建返回结果 JSONObject response = new JSONObject(); response.put("userId", studentUser.getId()); @@ -331,14 +332,14 @@ public class AiolUserController { response.put("classId", targetClass.getId()); response.put("className", targetClass.getName()); response.put("message", "注册成功,已自动加入班级:" + targetClass.getName()); - - log.info("学生注册成功: 学号={}, 班级ID={}, 班级名={}", + + log.info("学生注册成功: 学号={}, 班级ID={}, 班级名={}", studentNumber, targetClass.getId(), targetClass.getName()); - + result.setResult(response); result.success("注册成功"); return result; - + } catch (Exception e) { log.error("学生注册失败: {}", e.getMessage(), e); return result.error500("注册失败: " + e.getMessage()); @@ -355,18 +356,18 @@ public class AiolUserController { if (username == null || username.trim().isEmpty()) { return Result.error(401, "用户未登录或token无效"); } - + SysUser currentUser = sysUserService.getUserByName(username); if (currentUser == null) { return Result.error(404, "用户不存在"); } - + String id = currentUser.getId(); - + // 2. 更新sys_user表的基本信息 SysUser userToUpdate = new SysUser(); userToUpdate.setId(id); - + if (profileDTO.getRealname() != null) { userToUpdate.setRealname(profileDTO.getRealname()); } @@ -385,20 +386,20 @@ public class AiolUserController { if (profileDTO.getPhone() != null) { userToUpdate.setPhone(profileDTO.getPhone()); } - + // 设置更新信息 userToUpdate.setUpdateBy(username); userToUpdate.setUpdateTime(new Date()); - + boolean userUpdated = sysUserService.updateById(userToUpdate); if (!userUpdated) { return Result.error(500, "更新用户基本信息失败"); } - + // 3. 更新aiol_user_info表的扩展信息 AiolUserInfo userInfo = userInfoMapper.selectOne( new QueryWrapper().eq("user_id", id)); - + if (userInfo == null) { // 如果扩展信息不存在,创建新记录 userInfo = new AiolUserInfo(); @@ -406,7 +407,7 @@ public class AiolUserController { userInfo.setCreateBy(username); userInfo.setCreateTime(new Date()); } - + // 更新扩展信息字段 if (profileDTO.getMajor() != null) { userInfo.setMajor(profileDTO.getMajor()); @@ -423,11 +424,11 @@ public class AiolUserController { if (profileDTO.getTag() != null) { userInfo.setTag(profileDTO.getTag()); } - + // 设置更新信息 userInfo.setUpdateBy(username); userInfo.setUpdateTime(new Date()); - + boolean userInfoUpdated; if (userInfo.getId() == null) { // 新增记录 @@ -436,17 +437,59 @@ public class AiolUserController { // 更新记录 userInfoUpdated = userInfoMapper.updateById(userInfo) > 0; } - + if (!userInfoUpdated) { return Result.error(500, "更新用户扩展信息失败"); } - + log.info("用户个人信息更新成功: userId={}, username={}", id, username); return Result.OK("个人信息更新成功"); - + } catch (Exception e) { log.error("编辑个人信息失败: {}", e.getMessage(), e); return Result.error(500, "编辑个人信息失败: " + e.getMessage()); } } + + //密码修改 + @AutoLog(value = "用户信息-修改密码") + @Operation(summary="用户信息-修改密码") + @PostMapping(value = "/updatePassword") + public Result updatePassword(@RequestBody Map params, HttpServletRequest request) { + try { + // 1. 从JWT中获取当前用户信息 + String username = JwtUtil.getUserNameByToken(request); + if (username == null || username.trim().isEmpty()) { + return Result.error(401, "用户未登录或token无效"); + } + SysUser currentUser = sysUserService.getUserByName(username); + if (currentUser == null) { + return Result.error(404, "用户不存在"); + } + String oldPassword = params.get("oldPassword"); + String newPassword = params.get("newPassword"); + String id = currentUser.getId(); + //判断密码是否一致 + String oldPasswordEncrypt = PasswordUtil.encrypt(username, oldPassword, currentUser.getSalt()); + String passwordEncrypt = currentUser.getPassword(); + if (newPassword == null || newPassword.trim().isEmpty()) { + return Result.error(400, "新密码不允许为空"); + } + if (newPassword.equals(oldPassword)) { + return Result.error(400, "新密码不能与旧密码相同"); + } + if (!oldPasswordEncrypt.equals(passwordEncrypt)) { + return Result.error(400, "旧密码不正确"); + } + //更新密码 + String password = PasswordUtil.encrypt(username, newPassword, currentUser.getSalt()); + currentUser.setPassword(password); + sysUserService.updateById(currentUser); + log.info("用户密码修改成功: userId={}, username={}", id, username); + return Result.OK("密码修改成功"); + }catch (Exception e){ + log.error("密码修改失败: {}", e.getMessage(), e); + return Result.error(500, "密码修改失败: " + e.getMessage()); + } + } } diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserFollowController.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserFollowController.java index 2fddb852..ccd11907 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserFollowController.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/controller/AiolUserFollowController.java @@ -292,32 +292,73 @@ public class AiolUserFollowController extends JeecgController objects = redisTemplate.opsForZSet().range(recentFollowKey, 0, -1); - Set followedIds = objects.stream() - .map(obj -> String.valueOf(obj)) - .collect(Collectors.toSet()); - if (followedIds != null && !followedIds.isEmpty()) { - // 根据被关注者的ID列表查询用户信息 - List followedUsers = sysUserService.listByIds(followedIds); - if (followedUsers != null && !followedUsers.isEmpty()) { - List userFollows = new ArrayList<>(); - for (SysUser followedUser : followedUsers) { - UserFollow userFollow = new UserFollow(); - userFollow.setId(followedUser.getId()); - userFollow.setIsFollow(true); - userFollow.setRealName(followedUser.getRealname()); - userFollow.setAvatar(followedUser.getAvatar()); - userFollows.add(userFollow); - } + // 2. 查询最近关注列表 + String recentFollowKey = "user:recent:follow:" + sysUser.getId(); + Set objects = redisTemplate.opsForZSet().range(recentFollowKey, 0, -1); + Set followedIds = objects.stream() + .map(obj -> String.valueOf(obj)) + .collect(Collectors.toSet()); + if (followedIds != null && !followedIds.isEmpty()) { + // 根据被关注者的ID列表查询用户信息 + List followedUsers = sysUserService.listByIds(followedIds); + if (followedUsers != null && !followedUsers.isEmpty()) { + List userFollows = new ArrayList<>(); + for (SysUser followedUser : followedUsers) { + UserFollow userFollow = new UserFollow(); + userFollow.setId(followedUser.getId()); + userFollow.setIsFollow(true); + userFollow.setRealName(followedUser.getRealname()); + userFollow.setAvatar(followedUser.getAvatar()); + userFollows.add(userFollow); + } return Result.OK(userFollows); - } - } + } + } } catch (Exception e) { - return Result.error(e.getMessage()); - } - return Result.OK(); + return Result.error(e.getMessage()); + } + return Result.OK(); + } + + //查询最常访问 + @AutoLog(value = "关注关系-查询最常访问") + @Operation(summary = "查询最常访问", description = "当前登录用户最常访问的用户") + @GetMapping(value = "/frequentVisitList") + public Result> frequentVisitList(HttpServletRequest req) { + try { + // 1. 获取当前登录用户信息 + String token = req.getHeader(CommonConstant.X_ACCESS_TOKEN); + String username = JwtUtil.getUsername(token); + LoginUser sysUser = sysBaseApi.getUserByName(username); + if (sysUser == null) { + return Result.error("用户未登录或登录已过期"); + } + // 2. 查询最常访问列表 + String frequentVisitKey = "user:frequent:visit:" + sysUser.getId(); + Set objects = redisTemplate.opsForZSet().range(frequentVisitKey, 0, -1); + Set followedIds = objects.stream() + .map(obj -> String.valueOf(obj)) + .collect(Collectors.toSet()); + if (followedIds != null && !followedIds.isEmpty()) { + // 根据被关注者的ID列表查询用户信息 + List followedUsers = sysUserService.listByIds(followedIds); + if (followedUsers != null && !followedUsers.isEmpty()) { + List userFollows = new ArrayList<>(); + for (SysUser followedUser : followedUsers) { + UserFollow userFollow = new UserFollow(); + userFollow.setId(followedUser.getId()); + userFollow.setIsFollow(true); + userFollow.setRealName(followedUser.getRealname()); + userFollow.setAvatar(followedUser.getAvatar()); + userFollows.add(userFollow); + } + return Result.OK(userFollows); + } + } + }catch (Exception e){ + return Result.error(e.getMessage()); + } + return Result.OK(); } /** diff --git a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/AiolActivitySignup.java b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/AiolActivitySignup.java index 344fc17f..5ae14e76 100644 --- a/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/AiolActivitySignup.java +++ b/jeecg-boot/jeecg-boot-module/jeecg-module-aiol/src/main/java/org/jeecg/modules/aiol/entity/AiolActivitySignup.java @@ -77,4 +77,10 @@ public class AiolActivitySignup implements Serializable { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") @Schema(description = "更新日期") private java.util.Date updateTime; + /**活动id*/ + @Schema(description = "活动id") + private java.lang.String activityId; + /**用户id*/ + @Schema(description = "用户id") + private java.lang.String userId; }