From ae619cc964a5f5c3c7855790f8e08c64486ea522 Mon Sep 17 00:00:00 2001 From: FalingCliff Date: Sat, 24 May 2025 23:49:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(auth):=20=E6=B7=BB=E5=8A=A0=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E5=8A=9F=E8=83=BD-=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=92=8C=E6=8E=A5=E5=8F=A3=20-=20=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E9=80=BB=E8=BE=91?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=AC=E8=8E=B7=E5=8F=96=20openid=20?= =?UTF-8?q?=E5=92=8C=20session=5Fkey-=20=E6=9B=B4=E6=96=B0=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E9=85=8D=E7=BD=AE=EF=BC=8C=E5=85=81=E8=AE=B8=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E7=99=BB=E5=BD=95=E8=AF=B7=E6=B1=82=E9=80=9A=E8=BF=87?= =?UTF-8?q?=20-=20=E6=B7=BB=E5=8A=A0=E5=BF=85=E8=A6=81=E7=9A=84=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=E5=92=8C=E6=95=B0=E6=8D=AE=E4=BC=A0=E8=BE=93=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/client/CustomerController.java | 19 +++++ .../controller/client/WxLoginController.java | 49 +++++++++-- .../admin_server/mapper/CustomerMapper.java | 16 ++++ .../admin_server/model/entity/Customer.java | 82 +++++++++++++++++++ .../service/ICustomerService.java | 16 ++++ .../service/impl/CustomerServiceImpl.java | 20 +++++ src/main/resources/mapper/CustomerMapper.xml | 21 +++++ 7 files changed, 215 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/example/admin_server/controller/client/CustomerController.java create mode 100644 src/main/java/com/example/admin_server/mapper/CustomerMapper.java create mode 100644 src/main/java/com/example/admin_server/model/entity/Customer.java create mode 100644 src/main/java/com/example/admin_server/service/ICustomerService.java create mode 100644 src/main/java/com/example/admin_server/service/impl/CustomerServiceImpl.java create mode 100644 src/main/resources/mapper/CustomerMapper.xml diff --git a/src/main/java/com/example/admin_server/controller/client/CustomerController.java b/src/main/java/com/example/admin_server/controller/client/CustomerController.java new file mode 100644 index 0000000..7856132 --- /dev/null +++ b/src/main/java/com/example/admin_server/controller/client/CustomerController.java @@ -0,0 +1,19 @@ +package com.example.admin_server.controller.client; + + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author FallingCliff + * @since 2025-05-24 + */ +@RestController +@RequestMapping("/api/client/customer") +public class CustomerController { + +} diff --git a/src/main/java/com/example/admin_server/controller/client/WxLoginController.java b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java index ee2add5..93471c1 100644 --- a/src/main/java/com/example/admin_server/controller/client/WxLoginController.java +++ b/src/main/java/com/example/admin_server/controller/client/WxLoginController.java @@ -1,9 +1,13 @@ package com.example.admin_server.controller.client; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.example.admin_server.common.Result; import com.example.admin_server.config.WxConfig; import com.example.admin_server.model.dto.WxLoginDTO; +import com.example.admin_server.model.entity.Customer; +import com.example.admin_server.service.ICustomerService; +import com.example.admin_server.utils.JwtUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -13,6 +17,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @@ -23,6 +28,8 @@ import java.util.Map; public class WxLoginController { private final WxConfig wxConfig; + private final ICustomerService iCustomerService; + private final JwtUtil jwtUtil; @PostMapping("/login") @ApiOperation(value = "微信登录") @@ -32,32 +39,58 @@ public class WxLoginController { return Result.fail("code 参数不能为空"); } - // 构造请求微信的 URL + // 请求微信接口 String url = wxConfig.getJscode2sessionUrl() + "?appid=" + wxConfig.getAppid() + "&secret=" + wxConfig.getSecret() + "&js_code=" + code + "&grant_type=authorization_code"; - // 请求微信服务器 RestTemplate restTemplate = new RestTemplate(); String response = restTemplate.getForObject(url, String.class); - - // 解析微信响应 JSONObject jsonObject = JSONObject.parseObject(response); + System.out.println(jsonObject); String openid = jsonObject.getString("openid"); String sessionKey = jsonObject.getString("session_key"); + String unionid = jsonObject.getString("unionid"); if (openid == null) { - String errMsg = jsonObject.getString("errmsg"); - return Result.fail("微信登录失败: " + errMsg); + return Result.fail("微信登录失败: " + jsonObject.getString("errmsg")); } - // TODO: 你可以在这里用 openid 查数据库,创建或更新用户,生成 JWT 等 + // 查找用户是否已存在 + Customer customer = iCustomerService.getOne(new QueryWrapper().eq("openid", openid)); + if (customer == null) { + // 创建新用户 + customer = new Customer() + .setOpenid(openid) + .setSessionKey(sessionKey) + .setUnionid(unionid) + .setNickname("微信用户") // 默认昵称,可后续完善 + .setAvatarUrl(null) + .setCreateTime(LocalDateTime.now()) + .setUpdateTime(LocalDateTime.now()); + + iCustomerService.save(customer); + } else { + // 更新 session_key 与 update_time + customer.setSessionKey(sessionKey); + customer.setUpdateTime(LocalDateTime.now()); + iCustomerService.updateById(customer); + } + + Map claims = new HashMap<>(); + claims.put("id", customer.getId()); + claims.put("username", customer.getUsername()); + claims.put("sessionKey", customer.getSessionKey()); + claims.put("openid", customer.getOpenid()); + String token = jwtUtil.generateToken(claims); Map resultData = new HashMap<>(); + resultData.put("token", token); resultData.put("openid", openid); - resultData.put("token", "mock-token-" + openid); // 后期你可以用 JWT 替换这里 + resultData.put("nickname", customer.getNickname()); + resultData.put("avatar", customer.getAvatarUrl()); return Result.ok("登录成功", resultData); } diff --git a/src/main/java/com/example/admin_server/mapper/CustomerMapper.java b/src/main/java/com/example/admin_server/mapper/CustomerMapper.java new file mode 100644 index 0000000..cae934d --- /dev/null +++ b/src/main/java/com/example/admin_server/mapper/CustomerMapper.java @@ -0,0 +1,16 @@ +package com.example.admin_server.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.example.admin_server.model.entity.Customer; + +/** + *

+ * Mapper 接口 + *

+ * + * @author FallingCliff + * @since 2025-05-24 + */ +public interface CustomerMapper extends BaseMapper { + +} diff --git a/src/main/java/com/example/admin_server/model/entity/Customer.java b/src/main/java/com/example/admin_server/model/entity/Customer.java new file mode 100644 index 0000000..39e6ddd --- /dev/null +++ b/src/main/java/com/example/admin_server/model/entity/Customer.java @@ -0,0 +1,82 @@ +package com.example.admin_server.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * + *

+ * + * @author FallingCliff + * @since 2025-05-24 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("customer") +@ApiModel(value="Customer对象", description="客户表") +public class Customer implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "主键ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "微信openid") + @TableField("openid") + private String openid; + + @ApiModelProperty(value = "微信会话密钥(可选存储)") + @TableField("session_key") + private String sessionKey; + + @ApiModelProperty(value = "微信unionid(如果获取到)") + @TableField("unionid") + private String unionid; + + @ApiModelProperty(value = "用户名") + @TableField("username") + private String username; + + @ApiModelProperty(value = "密码") + @TableField("password") + private String password; + + @ApiModelProperty(value = "用户昵称") + @TableField("nickname") + private String nickname; + + @ApiModelProperty(value = "头像URL") + @TableField("avatar_url") + private String avatarUrl; + + @ApiModelProperty(value = "邮箱") + @TableField("email") + private String email; + + @ApiModelProperty(value = "手机号(后续绑定时)") + @TableField("phone") + private String phone; + + @ApiModelProperty(value = "创建时间") + @TableField("create_time") + private LocalDateTime createTime; + + @ApiModelProperty(value = "更新时间") + @TableField("update_time") + private LocalDateTime updateTime; + + +} diff --git a/src/main/java/com/example/admin_server/service/ICustomerService.java b/src/main/java/com/example/admin_server/service/ICustomerService.java new file mode 100644 index 0000000..1fe8d88 --- /dev/null +++ b/src/main/java/com/example/admin_server/service/ICustomerService.java @@ -0,0 +1,16 @@ +package com.example.admin_server.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.example.admin_server.model.entity.Customer; + +/** + *

+ * 服务类 + *

+ * + * @author FallingCliff + * @since 2025-05-24 + */ +public interface ICustomerService extends IService { + +} diff --git a/src/main/java/com/example/admin_server/service/impl/CustomerServiceImpl.java b/src/main/java/com/example/admin_server/service/impl/CustomerServiceImpl.java new file mode 100644 index 0000000..bbf1edc --- /dev/null +++ b/src/main/java/com/example/admin_server/service/impl/CustomerServiceImpl.java @@ -0,0 +1,20 @@ +package com.example.admin_server.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.example.admin_server.mapper.CustomerMapper; +import com.example.admin_server.model.entity.Customer; +import com.example.admin_server.service.ICustomerService; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author FallingCliff + * @since 2025-05-24 + */ +@Service +public class CustomerServiceImpl extends ServiceImpl implements ICustomerService { + +} diff --git a/src/main/resources/mapper/CustomerMapper.xml b/src/main/resources/mapper/CustomerMapper.xml new file mode 100644 index 0000000..08b9142 --- /dev/null +++ b/src/main/resources/mapper/CustomerMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + +