Files
xuan-deduct/src/main/java/xuan/controller/UserController.java
T
H1d3rOne 6561e9034b feat: 完善微信授权登录功能
- 新增半屏授权登录窗口,从底部滑出
- 支持微信头像和昵称选择
- 新用户注册默认3个金币
- 新增注销账号功能,从数据库删除用户
- 删除旧的授权登录页面
- 退出登录和注销后跳转首页
- 优化登录交互体验
2026-03-10 01:37:24 +08:00

270 lines
10 KiB
Java

package xuan.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import xuan.entity.UserInfo;
import xuan.service.UserInfoService;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/user")
@CrossOrigin(origins = "*")
public class UserController {
@Autowired
private UserInfoService userInfoService;
@Value("${wechat.appid:}")
private String appId;
@Value("${wechat.secret:}")
private String appSecret;
@PostMapping("/login")
public Map<String, Object> login(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String code = params.get("code") != null ? params.get("code").toString() : null;
String nickname = params.get("nickname") != null ? params.get("nickname").toString() : "微信用户";
String avatarUrl = params.get("avatarUrl") != null ? params.get("avatarUrl").toString() : "";
String openId = null;
if (code != null && !code.isEmpty() && appId != null && !appId.isEmpty() && appSecret != null && !appSecret.isEmpty()) {
String url = String.format(
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
appId, appSecret, code
);
try {
RestTemplate restTemplate = new RestTemplate();
@SuppressWarnings("unchecked")
Map<String, Object> wxResult = restTemplate.getForObject(url, Map.class);
if (wxResult != null && wxResult.containsKey("openid")) {
openId = (String) wxResult.get("openid");
}
} catch (Exception e) {
System.err.println("调用微信API失败: " + e.getMessage());
}
}
if (openId == null || openId.isEmpty()) {
openId = "guest_" + System.currentTimeMillis();
}
UserInfo user = userInfoService.loginOrRegister(openId, nickname, avatarUrl);
Map<String, Object> data = new HashMap<>();
data.put("id", user.getId());
data.put("userId", user.getUserId());
data.put("openId", user.getOpenId());
data.put("nickname", user.getNickname());
data.put("avatarUrl", user.getAvatarUrl());
data.put("username", user.getUsername());
data.put("phone", user.getPhone());
data.put("vipLevel", user.getVipLevel());
data.put("coins", user.getCoins());
data.put("streakDays", user.getStreakDays());
data.put("createTime", user.getCreateTime());
result.put("success", true);
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/info")
public Map<String, Object> getUserInfo(@RequestParam String userId) {
Map<String, Object> result = new HashMap<>();
try {
UserInfo user = userInfoService.getUserInfo(userId);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("id", user.getId());
data.put("userId", user.getUserId());
data.put("openId", user.getOpenId());
data.put("nickname", user.getNickname());
data.put("avatarUrl", user.getAvatarUrl());
data.put("username", user.getUsername());
data.put("phone", user.getPhone());
data.put("vipLevel", user.getVipLevel());
data.put("coins", user.getCoins());
data.put("streakDays", user.getStreakDays());
data.put("createTime", user.getCreateTime());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/updateVip")
public Map<String, Object> updateVipLevel(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
Integer vipLevel = Integer.parseInt(params.get("vipLevel").toString());
UserInfo user = userInfoService.updateVipLevel(userId, vipLevel);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("vipLevel", user.getVipLevel());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/updateCoins")
public Map<String, Object> updateCoins(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
Integer coins = Integer.parseInt(params.get("coins").toString());
UserInfo user = userInfoService.updateCoins(userId, coins);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("coins", user.getCoins());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/updatePhone")
public Map<String, Object> updatePhone(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
String phone = params.get("phone").toString();
UserInfo user = userInfoService.updatePhone(userId, phone);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("phone", user.getPhone());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/updateUsername")
public Map<String, Object> updateUsername(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
String username = params.get("username").toString();
UserInfo user = userInfoService.updateUsername(userId, username);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("username", user.getUsername());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/updateAvatar")
public Map<String, Object> updateAvatar(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
String avatarUrl = params.get("avatarUrl").toString();
UserInfo user = userInfoService.updateAvatarUrl(userId, avatarUrl);
if (user != null) {
Map<String, Object> data = new HashMap<>();
data.put("avatarUrl", user.getAvatarUrl());
result.put("success", true);
result.put("data", data);
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/permissionLog")
public Map<String, Object> addPermissionLog(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
result.put("success", true);
result.put("message", "权限使用记录已保存");
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@PostMapping("/deleteAccount")
public Map<String, Object> deleteAccount(@RequestBody Map<String, Object> params) {
Map<String, Object> result = new HashMap<>();
try {
String userId = params.get("userId").toString();
boolean deleted = userInfoService.deleteAccount(userId);
if (deleted) {
result.put("success", true);
result.put("message", "账号已注销");
} else {
result.put("success", false);
result.put("error", "用户不存在");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
}