[fix]绑定推广人增加互关逻辑

This commit is contained in:
wangqx 2025-09-18 16:12:22 +08:00
parent 8795b1fb37
commit 1c2e84eaf1
8 changed files with 230 additions and 58 deletions

View File

@ -1,11 +1,13 @@
package org.dromara.app;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.wzj.soopin.member.business.IMemberBusiness;
import com.wzj.soopin.member.convert.AccountBillConvert;
import com.wzj.soopin.member.convert.MemberAccountConvert;
import com.wzj.soopin.member.convert.MemberBankConvert;
import com.wzj.soopin.member.convert.MemberConvert;
import com.wzj.soopin.member.domain.bo.AccountBillBO;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.domain.bo.MemberBankBO;
import com.wzj.soopin.member.domain.po.AccountBill;
import com.wzj.soopin.member.domain.po.Member;
@ -50,6 +52,7 @@ import java.time.LocalDateTime;
@Tag(name = "会员管理")
@RequiredArgsConstructor
public class AppMemberController {
private final IMemberBusiness memberBusiness;
private final IMemberService service;
@ -133,30 +136,11 @@ public class AppMemberController {
}
@Tag(name = "绑定微信")
@Tag(name = "绑定推广人")
@PostMapping("/bind/spread")
public R<AuthToken> bindSpread(@RequestBody SocialLoginBody loginBody) {
public R<AuthToken> bindSpread(@RequestBody MemberBO bo) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
//检查推广人
Long memberId = loginUser.getUserId();
//检查推广人是否绑定
Member member = service.getById(loginBody);
if (member.getSpreadUid() != null) {
throw new ServiceException("用户已绑定推广人");
}
//检查推广人是否存在
Member spreadMember = service.getById(loginBody.getSocialCode());
if (spreadMember == null) {
throw new ServiceException("推广人不存在");
}
member = Member.builder().id(memberId).spreadUid(spreadMember.getId()).spreadTime(LocalDateTime.now()).build();
service.updateById(member);
memberBusiness.bindSpread(bo);
return R.ok();
}

View File

@ -0,0 +1,11 @@
package com.wzj.soopin.member.business;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.domain.vo.MemberVO;
import org.dromara.common.web.core.IBusiness;
public interface IMemberBusiness extends IBusiness<MemberVO, MemberBO> {
void bindSpread(MemberBO memberBO);
void bindWechat(MemberBO memberBO);
}

View File

@ -0,0 +1,79 @@
package com.wzj.soopin.member.business.impl;
import com.wzj.soopin.member.business.IMemberBusiness;
import com.wzj.soopin.member.convert.MemberConvert;
import com.wzj.soopin.member.domain.bo.MemberBO;
import com.wzj.soopin.member.domain.po.Fans;
import com.wzj.soopin.member.domain.po.Member;
import com.wzj.soopin.member.domain.vo.MemberVO;
import com.wzj.soopin.member.service.IFansService;
import com.wzj.soopin.member.service.IMemberService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.domain.model.LoginUser;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.web.core.BusinessImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
@Service
@AllArgsConstructor
@Slf4j
public class MemberBusinessImpl extends BusinessImpl<IMemberService, MemberConvert, MemberVO, MemberBO, Member>
implements IMemberBusiness {
private final IFansService fansService;
@Override
public void bindSpread(MemberBO memberBO) {
//获取用户信息
LoginUser loginUser = LoginHelper.getLoginUser();
if (loginUser == null) {
throw new ServiceException("用户未登录");
}
//检查推广人
Long memberId = loginUser.getUserId();
//检查推广人是否绑定
Member member = service.getById(loginUser.getUserId());
if (member.getSpreadUid() != null) {
throw new ServiceException("用户已绑定推广人");
}
//检查推广人是否存在
Member spreadMember = service.getById(memberBO.getId());
if (spreadMember == null) {
throw new ServiceException("推广人不存在");
}
//更新用户的推广人
member = Member.builder().id(memberId).spreadUid(spreadMember.getId()).spreadTime(LocalDateTime.now()).build();
service.updateById(member);
//两人互加好友
Fans fans=new Fans();
fans.setVloggerId(memberId);
fans.setFanId(spreadMember.getId());
fans.setFriendFlag(1);
fans.setBothFriend(1);
fansService.save(fans);
log.info("用户{}关注了用户{}",memberId,spreadMember.getId());
//被关注人也关注用户
Fans fans2=new Fans();
fans2.setVloggerId(spreadMember.getId());
fans2.setFanId(memberId);
fans2.setFriendFlag(1);
fans2.setBothFriend(1);
fansService.save(fans2);
log.info("用户{}关注了用户{}",spreadMember.getId(),memberId);
}
@Override
public void bindWechat(MemberBO memberBO) {
}
}

View File

@ -234,6 +234,8 @@ public class MemberController extends BaseController {
@Tag(name = "获取登录会员的信息")
@GetMapping(value = "/login/info")
@Tag(name ="获取登录会员的信息")
@GetMapping(value = "login/info")
public R<MemberVO> getLoinInfo() {
return R.ok(service.getLoginMemberInfo());
}
@ -241,6 +243,8 @@ public class MemberController extends BaseController {
@Tag(name = "同步会员的信息")
@GetMapping(value = "/sync")
@Tag(name ="同步会员的信息")
@GetMapping(value = "sync")
public R<MemberVO> syncInfo() {
service.syncInfo();
return R.ok();

View File

@ -1,8 +1,11 @@
package com.wzj.soopin.member.service;
import cn.hutool.json.JSONArray;
import com.wzj.soopin.member.domain.po.Member;
import java.util.List;
/**km//
* 腾讯IM服务
* @author wqx
@ -10,4 +13,5 @@ import com.wzj.soopin.member.domain.po.Member;
public interface ITencentIMServicce {
String createTencentIMAccount(Member member);
void updateMemberRole(Member member);
JSONArray checkTencentIMAccount(List<String> ids);
}

View File

@ -48,6 +48,9 @@ import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 会员信息Service业务层处理
@ -71,6 +74,7 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
private final MemberMapper memberMapper;
private final IFansService fansService;
private final TencentIMServiceImpl tencentIMServiceImpl;
private final SysUserMapper sysUserMapper;
@ -323,10 +327,25 @@ public class MemberServiceImpl extends ServiceImpl<MemberMapper,Member> implemen
@Override
public void syncInfo() {
//分页拉取用户信息
Page<Member> memberPage=memberMapper.selectPage(new Page<>(1,100),null);
List<Member> records = memberPage.getRecords();
Map<Long,Member> memberMap = new HashMap<>(records.size());
records.stream().forEach(member -> memberMap.put(member.getId(),member));
List<String> ids=records.stream().map(member -> member.getId()+"").collect(Collectors.toList());
JSONArray jsonArray=tencentIMServiceImpl.checkTencentIMAccount(ids);
if(jsonArray!=null){
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject o=jsonArray.getJSONObject(i);
String userID=o.getStr("UserID");
String accountStatus=o.getStr("AccountStatus");
if(accountStatus.equals("NotImported")){
//不存在创建
tencentIMServiceImpl.createTencentIMAccount(memberMap.get(Long.valueOf(userID)));
}
}
}
return;
}

View File

@ -12,8 +12,11 @@ import org.dromara.common.core.exception.ServiceException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.concurrent.TimeUnit;
import static org.bouncycastle.asn1.x500.style.RFC4519Style.member;
@Slf4j
@Service
@ -91,6 +94,77 @@ public class TencentIMServiceImpl implements ITencentIMServicce {
}
}
/**
* 创建腾讯云IM账号
*/
@Override
public JSONArray checkTencentIMAccount(List<String> ids) {
try {
//这里生成一个管理员签名
String adminSig=generateUserSig(adminAccount);
String random = String.valueOf(System.currentTimeMillis());
// 构建请求体
JSONArray jsonArray=new JSONArray();
ids.stream().forEach(id->{
JSONObject o=new JSONObject();
o.put("UserID",id);
jsonArray.add(o);
});
JSONObject requestBody = new JSONObject();
requestBody.put("CheckItem", jsonArray);
// 构建URL - 使用管理员账号(administrator)而不是用户ID来生成签名
String urlString = String.format(
"https://console.tim.qq.com/v4/im_open_login_svc/account_check" +
"?sdkappid=%s&identifier=%s&usersig=%s&random=%s&contenttype=json",
GenerateTestUserSig.SDKAPPID,
adminAccount, // 使用管理员账号
adminSig, // 使用管理员的UserSig
random);
// return userSig;
// 创建HTTP客户端
OkHttpClient client = new OkHttpClient().newBuilder().connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.writeTimeout(15, TimeUnit.SECONDS)
.build();
// 发送请求
Request request = new Request.Builder()
.url(urlString)
.post(RequestBody.create(MediaType.get("application/json; charset=utf-8"),
requestBody.toString()))
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
log.error("查询账号失败: {}, 状态码: {}", ids, response.code());
throw new ServiceException(String.format("查询账号异常: %s", ids));
}
String responseBody = response.body().string();
JSONObject jsonResponse = new JSONObject(responseBody);
int errorCode = jsonResponse.getInt("ErrorCode");
if (errorCode == 0) {
log.info("查询账号成功: {}, 结果: {}", ids, jsonResponse.get("ResultItem"));
JSONArray jsonArray1=jsonResponse.getJSONArray("ResultItem");
return jsonArray1;
} else {
log.error("查询账号失败: {}, 错误码: {}, 错误信息: {}",
ids, errorCode, jsonResponse.get("ErrorInfo"));
throw new ServiceException(String.format("查询账号异常: %s", ids));
}
}
} catch (Exception e) {
throw new ServiceException(String.format("查询账号异常"));
}
}
/**
* 更新用户角色

View File

@ -169,10 +169,20 @@ http {
# HTTPS server
#
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/cert/wzjnetcn/wzj.net.cn.pem;
ssl_certificate_key /etc/nginx/cert/wzjnetcn/wzj.net.cn.key;
listen 443 ssl;
server_name wuzhongjie.com.cn www.wuzhongjie.com.cn;
ssl_certificate /etc/nginx/cert/wuzhongjie.com.cn_bundle.pem;
ssl_certificate_key /etc/nginx/cert/wuzhongjie.com.cn.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 设置 gzip 压缩
gzip on;
#gzip_static on;
gzip_types text/plain text/css application/javascript application/json;
gzip_min_length 256;
location / {
proxy_pass http://tj-wzjkjww.icpkuaiban.net/;
proxy_set_header Host tj-wzjkjww.icpkuaiban.net;
@ -203,7 +213,7 @@ http {
}
# app分享-接口代理
location /prod-api/ {
proxy_pass http://43.143.227:8880/;
proxy_pass http://43.143.227.203:8880/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
@ -214,37 +224,24 @@ http {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 443 ssl;
server_name www.wzj.net.cn wzj.net.cn;
server {
listen 443 ssl;
server_name _;
ssl_certificate /etc/nginx/cert/wzjnetcn/wzj.net.cn.pem;
ssl_certificate_key /etc/nginx/cert/wzjnetcn/wzj.net.cn.key;
location / {
proxy_pass http://tj-wzjkjww.icpkuaiban.net/;
proxy_set_header Host tj-wzjkjww.icpkuaiban.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
ssl_certificate /etc/nginx/cert/wzjnetcn/wzj.net.cn.pem;
ssl_certificate_key /etc/nginx/cert/wzjnetcn/wzj.net.cn.key;
location / {
proxy_pass http://tj-wzjkjww.icpkuaiban.net/;
proxy_set_header Host tj-wzjkjww.icpkuaiban.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
server {
listen 443 ssl;
server_name www.wzj.net.cn wzj.net.cn;
ssl_certificate /etc/nginx/cert/wzjnetcn/wzj.net.cn.pem;
ssl_certificate_key /etc/nginx/cert/wzjnetcn/wzj.net.cn.key;
location / {
proxy_pass http://tj-wzjkjww.icpkuaiban.net/;
proxy_set_header Host tj-wzjkjww.icpkuaiban.net;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
}