diff --git a/sams-ui/src/views/student/ClubCenter.vue b/sams-ui/src/views/student/ClubCenter.vue
index c6954b05..db0c3beb 100644
--- a/sams-ui/src/views/student/ClubCenter.vue
+++ b/sams-ui/src/views/student/ClubCenter.vue
@@ -1,6 +1,5 @@
-
🎯 我加入的社团
diff --git a/sams-ui/src/views/student/Profile.vue b/sams-ui/src/views/student/Profile.vue
index 5854ba95..0d46b3da 100644
--- a/sams-ui/src/views/student/Profile.vue
+++ b/sams-ui/src/views/student/Profile.vue
@@ -1,13 +1,17 @@
-
-
-
{{ user.name }}
-
学号:{{ user.schoolId }}
+
姓名:{{ user.nickName }}
+
学号:{{ user.schoolId }}
+
班级:{{ user.className || '暂无信息' }}
+
学院:{{ user.collegeName || '暂无信息' }}
+
+
+ 编辑资料
+ 修改密码
@@ -19,10 +23,6 @@
{{ user.activityCount }}
参与活动
-
-
{{ user.credits }}
-
信用分
-
@@ -30,49 +30,70 @@
+
+
+
+
@@ -85,20 +106,34 @@ onMounted(async () => {
}
.user-info {
display: flex;
+ justify-content: space-between;
align-items: center;
gap: 20px;
}
-.name {
- font-size: 20px;
- margin: 0;
+.info {
+ flex: 1;
}
-.school-id {
+.name {
+ font-size: 18px;
+ font-weight: bold;
+ margin-bottom: 4px;
+}
+.detail {
font-size: 14px;
color: #888;
+ margin: 2px 0;
+}
+.btns-inline {
+ display: flex;
+ gap: 10px;
+}
+.btn {
+ width: 100px;
}
.stats {
display: flex;
- justify-content: space-between;
+ justify-content: flex-start;
+ gap: 20px;
margin-top: 20px;
}
.stat-box {
@@ -120,4 +155,8 @@ onMounted(async () => {
padding-left: 20px;
line-height: 2;
}
+.act-list a {
+ cursor: pointer;
+ color: #409eff;
+}
diff --git a/src/main/java/com/bruce/sams/common/config/SecurityConfig.java b/src/main/java/com/bruce/sams/common/config/SecurityConfig.java
index d233d724..0ae3fa28 100644
--- a/src/main/java/com/bruce/sams/common/config/SecurityConfig.java
+++ b/src/main/java/com/bruce/sams/common/config/SecurityConfig.java
@@ -32,6 +32,7 @@ public class SecurityConfig {
.authorizeHttpRequests(auth -> auth
.requestMatchers("/login").permitAll()
.requestMatchers("/api/auth/me").hasAnyRole("COLLEGE_ADMIN")
+ .requestMatchers("/api/user/**").authenticated()
.anyRequest().authenticated()
)
.addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class)
diff --git a/src/main/java/com/bruce/sams/controller/sys/UserController.java b/src/main/java/com/bruce/sams/controller/sys/UserController.java
index 52ca6f06..8aeb2cc5 100644
--- a/src/main/java/com/bruce/sams/controller/sys/UserController.java
+++ b/src/main/java/com/bruce/sams/controller/sys/UserController.java
@@ -10,6 +10,8 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
+import java.util.Map;
+
/**
* 用户端 - 个人信息管理控制器
@@ -22,69 +24,57 @@ public class UserController {
private UserService userService;
/**
- * 用户修改密码
- *
- * @param userId 用户ID
- * @param oldPassword 旧密码
- * @param newPassword 新密码
- * @return AjaxResult
+ * 获取当前用户个人信息(前端调用 /user/profile,无需传 userId)
*/
- @PutMapping("/change-password")
- public AjaxResult changePassword(@RequestParam Long userId, @RequestParam String oldPassword, @RequestParam String newPassword) {
- userService.changePassword(userId, oldPassword, newPassword);
- return AjaxResult.success("密码修改成功");
+ @GetMapping("/profile")
+ public AjaxResult getUserProfile() {
+ System.out.println("运行中");
+ User user = getCurrentUser();
+ return AjaxResult.success(userService.getUserProfile(user.getUserId()));
}
/**
- * 用户修改个人信息(昵称、邮箱、头像)
- *
- * @param userId 用户ID
- * @param updatedUser 用户提交的新信息(昵称、邮箱、头像)
- * @return AjaxResult
+ * 修改个人资料(昵称、邮箱、头像)=> PUT /user/update
*/
- @PutMapping("/profile")
- public AjaxResult updateProfile(@RequestParam Long userId, @RequestBody User updatedUser) {
- userService.updateProfile(userId, updatedUser);
+ @PutMapping("/update")
+ public AjaxResult updateProfile(@RequestBody User updatedUser) {
+ User user = getCurrentUser();
+ userService.updateProfile(user.getUserId(), updatedUser);
return AjaxResult.success("个人信息更新成功");
}
/**
- * 获取用户详情(查看个人信息)
- *
- * @param userId 用户ID
- * @return AjaxResult
+ * 修改密码 => PUT /user/change-password
*/
- @GetMapping("/{userId}")
- public AjaxResult getUserProfile(@PathVariable Long userId) {
- return AjaxResult.success(userService.getUserProfile(userId));
+ @PutMapping("/change-password")
+ public AjaxResult changePassword(@RequestBody Map
body) {
+ User user = getCurrentUser();
+ String oldPassword = body.get("oldPassword");
+ String newPassword = body.get("newPassword");
+ userService.changePassword(user.getUserId(), oldPassword, newPassword);
+ return AjaxResult.success("密码修改成功");
}
/**
- * 上传头像
- *
- * @param file 头像信息
- * @return AjaxResult
+ * 上传头像 => POST /user/avatar
*/
@PostMapping("/avatar")
public String uploadAvatar(@RequestParam("file") MultipartFile file) {
- // 获取当前认证信息
- Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-
- if (authentication == null || !authentication.isAuthenticated()) {
- throw new RuntimeException("未认证用户");
- }
-
- // 获取当前用户对象
- User userDetails = (User) authentication.getPrincipal();
- Long userId = userDetails.getUserId(); // 获取 userId
-
- // 上传文件
+ User user = getCurrentUser();
String avatarUrl = FileUploadUtil.uploadFile(file, "avatars/");
-
- // 更新用户头像
- userService.updateUserAvatar(userId, avatarUrl);
-
+ userService.updateUserAvatar(user.getUserId(), avatarUrl);
return avatarUrl;
}
+ /**
+ * 获取当前登录用户
+ */
+ private User getCurrentUser() {
+ System.out.println("✔ Controller 已进入!");
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (authentication == null || !authentication.isAuthenticated()) {
+ throw new RuntimeException("用户未认证");
+ }
+ return (User) authentication.getPrincipal();
+ }
}
diff --git a/src/main/java/com/bruce/sams/service/impl/UserServiceImpl.java b/src/main/java/com/bruce/sams/service/impl/UserServiceImpl.java
index 74aafe85..6b8cdd72 100644
--- a/src/main/java/com/bruce/sams/service/impl/UserServiceImpl.java
+++ b/src/main/java/com/bruce/sams/service/impl/UserServiceImpl.java
@@ -1,6 +1,7 @@
package com.bruce.sams.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.sams.common.enums.UserStatus;
import com.bruce.sams.common.exception.PasswordIncorrectException;
@@ -135,23 +136,22 @@ public class UserServiceImpl extends ServiceImpl
}
/**
- * 用户修改个人信息(用户端)
- *
- * @param userId 用户ID
- * @param updatedUser 用户提交的新信息(昵称、邮箱、头像)
+ * 更新用户信息(昵称、邮箱、头像)
*/
+ @Override
public void updateProfile(Long userId, User updatedUser) {
+
User user = userMapper.selectById(userId);
if (user == null) {
throw new UserNotFoundException();
}
+ LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
+ updateWrapper.eq(User::getUserId, userId)
+ .set(User::getNickName, updatedUser.getNickName())
+ .set(User::getEmail, updatedUser.getEmail())
+ .set(User::getAvatar, updatedUser.getAvatar());
- // 仅允许修改部分字段
- user.setNickName(updatedUser.getNickName());
- user.setEmail(updatedUser.getEmail());
- user.setAvatar(updatedUser.getAvatar());
-
- userMapper.updateById(user);
+ this.update(updateWrapper);
}
/**
@@ -168,6 +168,7 @@ public class UserServiceImpl extends ServiceImpl
return user;
}
+
/**
* 删除用户
*
@@ -198,13 +199,15 @@ public class UserServiceImpl extends ServiceImpl
}
/**
- * 更新用户头像
- *
- * @param userId 用户ID
- * @param avatarUrl 头像存储路径
+ * 更新头像地址
*/
+ @Override
public void updateUserAvatar(Long userId, String avatarUrl) {
- userMapper.updateAvatar(userId, avatarUrl);
+ LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
+ updateWrapper.eq(User::getUserId, userId)
+ .set(User::getAvatar, avatarUrl);
+
+ this.update(updateWrapper);
}
}