From 061a01ce068bf8e1260b6ea8e5c610737185916a Mon Sep 17 00:00:00 2001 From: xin <1099200748@qq.com> Date: Wed, 04 Jun 2025 21:41:48 +0800 Subject: [PATCH] 用户微信授权 --- .idea/inspectionProfiles/Project_Default.xml | 5 + oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserWeixinDto.java | 24 ++++++++ oying-system/src/main/java/com/oying/modules/system/domain/User.java | 12 +++ oying-common/src/main/java/com/oying/utils/ConstantsKey.java | 9 +++ oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java | 98 +++++++++++++++++++++++++++++++- oying-system/src/main/resources/mapper/system/UserMapper.xml | 3 + 6 files changed, 144 insertions(+), 7 deletions(-) diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 68ce32a..6861e12 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -1,6 +1,11 @@ <component name="InspectionProjectProfileManager"> <profile version="1.0"> <option name="myName" value="Project Default" /> + <inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true"> + <Languages> + <language minSize="87" name="Java" /> + </Languages> + </inspection_tool> <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true"> <option name="ADDITIONAL_TAGS" value="date,description" /> </inspection_tool> diff --git a/oying-common/src/main/java/com/oying/utils/ConstantsKey.java b/oying-common/src/main/java/com/oying/utils/ConstantsKey.java index b40936b..abfe332 100644 --- a/oying-common/src/main/java/com/oying/utils/ConstantsKey.java +++ b/oying-common/src/main/java/com/oying/utils/ConstantsKey.java @@ -2,4 +2,13 @@ public interface ConstantsKey { + String BUYER = "BUYER"; + String MERCHANT = "MERCHANT"; + String RIDER = "RIDER"; + String ADMIN = "ADMIN"; + String SUPPLIER = "SUPPLIER"; + String AGENT = "AGENT"; + + // 用户角色字典key + String USER_TYPE_BUYER = "USER_TYPE_BUYER"; } diff --git a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java index da9d9b8..02ed3dd 100644 --- a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java +++ b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java @@ -1,6 +1,7 @@ package com.oying.modules.security.rest; import cn.hutool.core.util.IdUtil; +import com.alibaba.fastjson2.JSONObject; import com.oying.modules.security.config.CaptchaConfig; import com.oying.modules.security.config.LoginProperties; import com.oying.modules.security.config.SecurityProperties; @@ -8,8 +9,15 @@ import com.oying.modules.security.security.TokenProvider; import com.oying.modules.security.service.OnlineUserService; import com.oying.modules.security.service.UserDetailsServiceImpl; +import com.oying.modules.security.service.WeiXinService; import com.oying.modules.security.service.dto.AuthUserDto; +import com.oying.modules.security.service.dto.AuthUserWeixinDto; import com.oying.modules.security.service.dto.JwtUserDto; +import com.oying.modules.system.domain.DictDetail; +import com.oying.modules.system.domain.Role; +import com.oying.modules.system.domain.User; +import com.oying.modules.system.service.DictDetailService; +import com.oying.modules.system.service.UserService; import com.oying.utils.*; import com.wf.captcha.base.Captcha; import io.swagger.annotations.Api; @@ -27,14 +35,12 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.concurrent.TimeUnit; /** @@ -57,9 +63,12 @@ private final LoginProperties loginProperties; private final PasswordEncoder passwordEncoder; private final UserDetailsServiceImpl userDetailsService; + private final WeiXinService weiXinService; + private final UserService userService; + private final DictDetailService dictDetailService; - @Log("用户登录") - @ApiOperation("登录授权") + @Log("账号密码登录") + @ApiOperation("账号密码登录") @AnonymousPostMapping(value = "/login") public ResponseEntity<Object> login(@Validated @RequestBody AuthUserDto authUser, HttpServletRequest request) throws Exception { // 密码解密 @@ -99,6 +108,85 @@ return ResponseEntity.ok(R.success(authInfo)); } + @Log("微信授权登录") + @ApiOperation("微信授权登录") + @AnonymousPostMapping(value = "/login/weixin") + public ResponseEntity<Object> loginWeixin(@Validated @RequestBody AuthUserWeixinDto authUser, HttpServletRequest request) throws Exception { + JSONObject jsonObject; + switch (authUser.getCode()) { + case "OLD": + jsonObject = weiXinService.code2Session(authUser.getCode()); + String openid = jsonObject.getString("openid"); + User userDto = userService.findByOpenid(openid); + if (userDto == null) { + Map<String, Object> authInfo = new HashMap<String, Object>(2) {{ + put("token", openid); + put("member", null); + }}; + return ResponseEntity.ok(authInfo); + } + authUser.setUsername(userDto.getUsername()); + break; + case "NEW": + jsonObject = weiXinService.getPhoneNumber(authUser.getCode()); + String phone = jsonObject.getJSONObject("phone_info").getString("purePhoneNumber"); + User user1 = userService.findByName(phone); + if (user1 == null) { + //创建用户 + User user = new User(); + user.setUsername(phone); + user.setNickName("LYHD-" + phone); + user.setUserType(ConstantsKey.BUYER); + user.setEnabled(true); + getRole(user); + user.setPassword(passwordEncoder.encode(phone.substring(phone.length() - 6))); + user.setOpenid(authUser.getUsername()); + userService.create(user); + } else { + if (user1.getUserType().equals(ConstantsKey.BUYER)) { + if (user1.getRoles() == null) { + getRole(user1); + } + } + user1.setOpenid(authUser.getUsername()); + userService.update(user1); + } + authUser.setUsername(phone); + break; + default: + throw new BadRequestException("登录类型错误"); + + } + // 获取用户信息 + JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername()); + Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map<String, Object> authInfo = new HashMap<String, Object>(2) {{ + put("token", properties.getTokenStartWith() + token); + put("user", jwtUser); + }}; + if (loginProperties.isSingleLogin()) { + // 踢掉之前已经登录的token + onlineUserService.kickOutForUsername(authUser.getUsername()); + } + // 保存在线信息 + onlineUserService.save(jwtUser, token, request); + // 返回登录信息 + return ResponseEntity.ok(R.success(authInfo)); + } + + public void getRole(User user1) { + Set<Role> roles = new HashSet<>(); + Role role = new Role(); + DictDetail detail = dictDetailService.getDictByName(ConstantsKey.USER_TYPE_BUYER).get(0); + role.setId(Long.valueOf(detail.getLabel())); + roles.add(role); + user1.setRoles(roles); + } + @ApiOperation("临时授权") @AnonymousGetMapping(value = "/token") public ResponseEntity<Object> loginTest(@RequestParam String username, HttpServletRequest request) { diff --git a/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserWeixinDto.java b/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserWeixinDto.java new file mode 100644 index 0000000..17a31eb --- /dev/null +++ b/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserWeixinDto.java @@ -0,0 +1,24 @@ +package com.oying.modules.security.service.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @author xin + * @description + * @date 2025/6/4 19:32 + */ +@Getter +@Setter +public class AuthUserWeixinDto { + + @ApiModelProperty(value = "用户名:type为NEW时传入用户openid") + private String username; + + @ApiModelProperty(value = "微信code") + private String code; + + @ApiModelProperty(value = "类型默认:OLD,注册:NEW",example = "OLD") + private String type = "OLD"; +} diff --git a/oying-system/src/main/java/com/oying/modules/system/domain/User.java b/oying-system/src/main/java/com/oying/modules/system/domain/User.java index 900eb83..17f7b64 100644 --- a/oying-system/src/main/java/com/oying/modules/system/domain/User.java +++ b/oying-system/src/main/java/com/oying/modules/system/domain/User.java @@ -8,6 +8,7 @@ import lombok.Getter; import lombok.Setter; import com.oying.base.BaseEntity; + import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -26,7 +27,7 @@ public class User extends BaseEntity implements Serializable { @NotNull(groups = Update.class) - @TableId(value="user_id", type = IdType.AUTO) + @TableId(value = "user_id", type = IdType.AUTO) @ApiModelProperty(value = "ID", hidden = true) private Long id; @@ -45,6 +46,13 @@ @ApiModelProperty(value = "用户机构") @TableField(exist = false) private Dept dept; + + @NotBlank + @ApiModelProperty(value = "用户类型(BUYER、MERCHANT、RIDER、ADMIN、SUPPLIER、AGENT)") + private String userType; + + @ApiModelProperty(value = "openid") + private String openid; @NotBlank @ApiModelProperty(value = "用户名称") @@ -66,7 +74,7 @@ @ApiModelProperty(value = "用户性别") private String gender; - @ApiModelProperty(value = "头像真实名称",hidden = true) + @ApiModelProperty(value = "头像真实名称", hidden = true) private String avatarName; @ApiModelProperty(value = "头像存储的路径", hidden = true) diff --git a/oying-system/src/main/resources/mapper/system/UserMapper.xml b/oying-system/src/main/resources/mapper/system/UserMapper.xml index 93bd442..a4eca68 100644 --- a/oying-system/src/main/resources/mapper/system/UserMapper.xml +++ b/oying-system/src/main/resources/mapper/system/UserMapper.xml @@ -5,6 +5,8 @@ <id column="user_user_id" property="id"/> <result column="user_dept_id" property="deptId"/> <result column="user_username" property="username"/> + <result column="user_user_type" property="userType"/> + <result column="user_openid" property="openid"/> <result column="user_nick_name" property="nickName"/> <result column="user_email" property="email"/> <result column="user_phone" property="phone"/> @@ -37,6 +39,7 @@ <sql id="Base_Column_List"> u.user_id as user_user_id, u.dept_id as user_dept_id, u.username as user_username, + u.user_type as user_user_type,u.openid as user_openid, u.nick_name as user_nick_name, u.email as user_email, u.phone as user_phone, u.gender as user_gender, u.avatar_name as user_avatar_name, u.avatar_path as user_avatar_path, u.enabled as user_enabled, u.pwd_reset_time as user_pwd_reset_time, u.create_by as user_create_by, -- Gitblit v1.9.3