From 1c2e84eaf11ab280e947f38529103bcf2a3a0861 Mon Sep 17 00:00:00 2001 From: wangqx Date: Thu, 18 Sep 2025 16:12:22 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E7=BB=91=E5=AE=9A=E6=8E=A8=E5=B9=BF?= =?UTF-8?q?=E4=BA=BA=E5=A2=9E=E5=8A=A0=E4=BA=92=E5=85=B3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/app/AppMemberController.java | 28 ++----- .../member/business/IMemberBusiness.java | 11 +++ .../business/impl/MemberBusinessImpl.java | 79 +++++++++++++++++++ .../member/controller/MemberController.java | 4 + .../member/service/ITencentIMServicce.java | 4 + .../service/impl/MemberServiceImpl.java | 25 +++++- .../service/impl/TencentIMServiceImpl.java | 74 +++++++++++++++++ script/docker/nginx/conf/nginx.conf | 63 +++++++-------- 8 files changed, 230 insertions(+), 58 deletions(-) create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/IMemberBusiness.java create mode 100644 ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/impl/MemberBusinessImpl.java diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java index 269534c91..5ba03f2ad 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java @@ -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 bindSpread(@RequestBody SocialLoginBody loginBody) { + public R 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(); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/IMemberBusiness.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/IMemberBusiness.java new file mode 100644 index 000000000..76ace7b46 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/IMemberBusiness.java @@ -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 { + void bindSpread(MemberBO memberBO); + void bindWechat(MemberBO memberBO); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/impl/MemberBusinessImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/impl/MemberBusinessImpl.java new file mode 100644 index 000000000..619e349a4 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/business/impl/MemberBusinessImpl.java @@ -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 + 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) { + + } + + +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java index 92bb11e20..3e962458c 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/MemberController.java @@ -234,6 +234,8 @@ public class MemberController extends BaseController { @Tag(name = "获取登录会员的信息") @GetMapping(value = "/login/info") + @Tag(name ="获取登录会员的信息") + @GetMapping(value = "login/info") public R 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 syncInfo() { service.syncInfo(); return R.ok(); diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java index bbb20843b..cd698593a 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/ITencentIMServicce.java @@ -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 ids); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index a226044c0..a37701d25 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -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 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 implemen @Override public void syncInfo() { + //分页拉取用户信息 - - - + Page memberPage=memberMapper.selectPage(new Page<>(1,100),null); + List records = memberPage.getRecords(); + Map memberMap = new HashMap<>(records.size()); + records.stream().forEach(member -> memberMap.put(member.getId(),member)); + List 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; } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java index 71d09cf4a..0cc73a303 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/TencentIMServiceImpl.java @@ -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 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("查询账号异常")); + } + } /** * 更新用户角色 diff --git a/script/docker/nginx/conf/nginx.conf b/script/docker/nginx/conf/nginx.conf index ed0480733..bed85d9b7 100644 --- a/script/docker/nginx/conf/nginx.conf +++ b/script/docker/nginx/conf/nginx.conf @@ -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; - } - } }