Просмотр исходного кода

feat(wechat): 实现微信登录及用户权限管理

- 新增获取微信 openid 接口,支持角色参数
- 引入 UserInfoMapper 和 TokenService 依赖
- 根据角色和 openid 查询或创建用户信息
- 生成并返回用户认证 token
- 添加对缺失或无效角色参数的校验
- 更新 GetOpenidRequest VO 类以支持角色字段
mcbaiyun 2 месяцев назад
Родитель
Сommit
591b07a1f3

+ 46 - 5
src/main/java/work/baiyun/chronicdiseaseapp/controller/WeChatController.java

@@ -9,6 +9,12 @@ import org.springframework.web.bind.annotation.RestController;
 import work.baiyun.chronicdiseaseapp.common.R;
 import work.baiyun.chronicdiseaseapp.model.vo.GetOpenidRequest;
 import work.baiyun.chronicdiseaseapp.service.WeChatService;
+import work.baiyun.chronicdiseaseapp.enums.PermissionGroup;
+import work.baiyun.chronicdiseaseapp.mapper.UserInfoMapper;
+import work.baiyun.chronicdiseaseapp.model.po.UserInfo;
+import work.baiyun.chronicdiseaseapp.service.TokenService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -19,6 +25,12 @@ public class WeChatController {
     @Autowired
     private WeChatService weChatService;
 
+    @Autowired
+    private UserInfoMapper userInfoMapper;
+
+    @Autowired
+    private TokenService tokenService;
+
     @RequestMapping("/")
     public R<?> hello() {
         return R.success(200, "Hello from Spring backend!");
@@ -29,13 +41,42 @@ public class WeChatController {
         if (req == null || req.getCode() == null || req.getCode().isEmpty()) {
             return R.fail(400, "Missing code parameter");
         }
+
+        // role is required now
+        if (req.getRole() == null) {
+            return R.fail(400, "Missing role parameter");
+        }
+
         String openid = weChatService.getOpenId(req.getCode());
-        if (openid != null) {
-            Map<String, String> data = new HashMap<>();
-            data.put("openid", openid);
-            return R.success(200, "ok", data);
-        } else {
+        if (openid == null) {
             return R.fail(500, "Failed to get openid");
         }
+
+        // map incoming role int to PermissionGroup enum
+        PermissionGroup pg;
+        try {
+            pg = PermissionGroup.fromCode(req.getRole());
+        } catch (IllegalArgumentException e) {
+            return R.fail(400, "Invalid role parameter");
+        }
+
+        // 查找是否存在 role + wx_openid 的用户
+        QueryWrapper<UserInfo> qw = new QueryWrapper<>();
+        qw.eq("role", pg.getCode()).eq("wx_openid", openid);
+        UserInfo ui = userInfoMapper.selectOne(qw);
+        if (ui == null) {
+            // create new user info with provided role and openid
+            ui = new UserInfo();
+            ui.setRole(pg);
+            ui.setWx_openid(openid);
+            userInfoMapper.insert(ui);
+        }
+
+        // generate or update token
+        String token = tokenService.createToken(ui.getId());
+
+        Map<String, String> data = new HashMap<>();
+        data.put("token", token);
+        return R.success(200, "ok", data);
     }
 }

+ 10 - 0
src/main/java/work/baiyun/chronicdiseaseapp/mapper/UserInfoMapper.java

@@ -0,0 +1,10 @@
+package work.baiyun.chronicdiseaseapp.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import work.baiyun.chronicdiseaseapp.model.po.UserInfo;
+
+@Mapper
+public interface UserInfoMapper extends BaseMapper<UserInfo> {
+
+}

+ 2 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/GetOpenidRequest.java

@@ -5,4 +5,6 @@ import lombok.Data;
 @Data
 public class GetOpenidRequest {
     private String code;
+    /** PermissionGroup code: 1=SYS_ADMIN,2=DOCTOR,3=PATIENT,4=PATIENT_FAMILY */
+    private Integer role;
 }

+ 0 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/QueryUserRequest.java


+ 0 - 0
src/main/java/work/baiyun/chronicdiseaseapp/model/vo/QueryUserResponse.java