Quellcode durchsuchen

新增镜像服务售卖,ChatGPT

chenbiao vor 2 Jahren
Ursprung
Commit
070bb95446
18 geänderte Dateien mit 435 neuen und 4 gelöschten Zeilen
  1. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/ChatgptSessionMapper.java
  2. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/ChatgptUserConversationMapper.java
  3. 11 0
      netflix-dao/src/main/java/com/cyksj/mapper/ChatgptUserMapper.java
  4. 55 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptSession.java
  5. 64 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUser.java
  6. 42 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUserConversation.java
  7. 5 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  8. 5 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  9. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  10. 15 0
      netflix-service/src/main/java/com/cyksj/service/chatgpt/ChatGptAccountService.java
  11. 140 0
      netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java
  12. 0 2
      netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAuthServiceImpl.java
  13. 8 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  14. 17 1
      netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java
  15. 41 0
      netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java
  16. 0 0
      netflix-web/src/main/resources/application-dev.yml
  17. 0 0
      netflix-web/src/main/resources/application-prd.yml
  18. 4 1
      netflix-web/src/main/resources/application-pre.yml

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/ChatgptSessionMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChatgptSession;
+
+/**
+ * @author chan
+ * @date 2024/3/19 10:43
+ */
+public interface ChatgptSessionMapper extends BaseMapper<ChatgptSession> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/ChatgptUserConversationMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChatgptUserConversation;
+
+/**
+ * @author chan
+ * @date 2024/3/19 10:44
+ */
+public interface ChatgptUserConversationMapper extends BaseMapper<ChatgptUserConversation> {
+}

+ 11 - 0
netflix-dao/src/main/java/com/cyksj/mapper/ChatgptUserMapper.java

@@ -0,0 +1,11 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.ChatgptUser;
+
+/**
+ * @author chan
+ * @date 2024/3/19 10:44
+ */
+public interface ChatgptUserMapper extends BaseMapper<ChatgptUser> {
+}

+ 55 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptSession.java

@@ -0,0 +1,55 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2024/3/18 17:10
+ */
+@Data
+@TableName("chatgpt_session")
+@SearchBean(tables = "chatgpt_session")
+public class ChatgptSession extends BaseEntity {
+
+    /**
+     * 邮箱
+     */
+    private String email;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 状态 1有效 1无效
+     */
+    private Integer status;
+
+    /**
+     * 是否为plus会员
+     */
+    @TableField("isPlus")
+    private Integer isPlus;
+
+    /**
+     * accountId
+     */
+    @TableField("accountId")
+    private Long accountId;
+
+    /**
+     * 官方session
+     */
+    @TableField("officialSession")
+    private String officialSession;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 64 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUser.java

@@ -0,0 +1,64 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author chan
+ * @date 2024/3/18 17:10
+ */
+@Data
+@TableName("chatgpt_user")
+@SearchBean(tables = "chatgpt_user")
+public class ChatgptUser extends BaseEntity {
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 头像
+     */
+    private String img;
+
+    /**
+     * 用户凭证
+     */
+    @TableField("userToken")
+    private String userToken;
+
+    /**
+     * 过期时间
+     */
+    @TableField("expireTime")
+    private Date expireTime;
+
+    /**
+     * 是否为plus
+     */
+    @TableField("isPlus")
+    private Integer isPlus;
+
+    /**
+     * sessionId
+     */
+    @TableField("sessionId")
+    private Long sessionId;
+
+    /**
+     * 车票id
+     */
+    @TableField("relationId")
+    private Long relationId;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+}

+ 42 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ChatgptUserConversation.java

@@ -0,0 +1,42 @@
+package com.cyksj.model.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ejlchina.searcher.bean.SearchBean;
+import lombok.Data;
+
+/**
+ * @author chan
+ * @date 2024/3/18 17:10
+ */
+@Data
+@TableName("chatgpt_user_conversation")
+@SearchBean(tables = "chatgpt_user_conversation")
+public class ChatgptUserConversation extends BaseEntity {
+
+
+    /**
+     * 凭证
+     */
+    @TableField("userToken")
+    private String userToken;
+
+    /**
+     * 会话id
+     */
+    @TableField("conversationId")
+    private String conversationId;
+
+    /**
+     * gpt账号id
+     */
+    @TableField("chatgptaccountid")
+    private String chatgptaccountid;
+
+    /**
+     * 会话标题
+     */
+    private String title;
+
+
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -159,6 +159,11 @@ public class GoodsDonSku extends BaseEntity {
      */
     private Boolean isDp;
 
+    /**
+     * 是否是镜像服务
+     */
+    private Boolean isMirror;
+
     /**
      * 特定价格
      */

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java

@@ -126,6 +126,11 @@ public class ReqGoodsSkuInsert {
          */
         private Integer codeNum;
 
+        /**
+         * 是否是镜像服务
+         */
+        private Boolean isMirror;
+
     }
 
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -166,4 +166,10 @@ public class RenewalView {
 
     @DbIgnore
     private Integer codeNum;
+
+    /**
+     * 是否为镜像服务
+     */
+    @DbField("sku.is_mirror")
+    private Boolean isMirror;
 }

+ 15 - 0
netflix-service/src/main/java/com/cyksj/service/chatgpt/ChatGptAccountService.java

@@ -0,0 +1,15 @@
+package com.cyksj.service.chatgpt;
+
+import com.cyksj.model.entity.Account;
+
+/**
+ * @author chan
+ * @date 2024/3/19 11:01
+ */
+public interface ChatGptAccountService {
+    String addAccount(Account account);
+
+    void upAccount(Account account);
+
+    String getLoginUrl(Long userId, Long relationId);
+}

+ 140 - 0
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAccountServiceImpl.java

@@ -0,0 +1,140 @@
+package com.cyksj.service.chatgpt.impl;
+
+import cn.hutool.core.lang.UUID;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.Method;
+import cn.hutool.json.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.exception.BusinessRuntimeException;
+import com.cyksj.common.util.StringUtil;
+import com.cyksj.mapper.*;
+import com.cyksj.model.entity.*;
+import com.cyksj.service.chatgpt.ChatGptAccountService;
+import com.cyksj.service.user.UserBindRelationService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author chan
+ * @date 2024/3/19 11:01
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class ChatGptAccountServiceImpl implements ChatGptAccountService{
+
+    @Value("${chatgpt.domain}")
+    private String GPT_DOMAIN;
+
+    private static final String GPT_PROXY = "https://chat-chan-87jztgkf257d.xyhelper.net";
+
+    private final ChatgptUserMapper chatgptUserMapper;
+
+    private final ChatgptSessionMapper chatgptSessionMapper;
+
+    private final GroupsRelationMapper groupsRelationMapper;
+
+    private final GroupsMapper groupsMapper;
+
+    private final GoodsDonSkuMapper skuMapper;
+
+    private final UserMapper userMapper;
+
+    private final UserBindRelationService userBindRelationService;
+
+
+    @Override
+    public String addAccount(Account account) {
+        Integer count = chatgptSessionMapper.selectCount(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getEmail, account.getAccount()));
+        if(count > 0){
+            throw BusinessRuntimeException.getInstance("镜像服务该账号已存在.");
+        }
+        String refreshToken = "";
+        String officialSession = "";
+        ChatgptSession chatgptSession = new ChatgptSession();
+       try {
+           HttpRequest request = new HttpRequest(GPT_PROXY + "/applelogin");
+           request.form("username", account.getAccount());
+           request.form("password", account.getPassword());
+           request.header("Content-Type","application/x-www-form-urlencoded");
+           HttpResponse execute = request.method(Method.POST).execute();
+           JSONObject loginResult = new JSONObject(execute.body());
+           //detail
+           if (StringUtils.isBlank(loginResult.getStr("accessToken"))) {
+               throw BusinessRuntimeException.getInstance(loginResult.getStr("detail"));
+           }
+           refreshToken = loginResult.getStr("refresh_token");
+           officialSession = execute.body();
+       }catch (Exception e){
+           throw BusinessRuntimeException.getInstance("登录获取token错误 error:" + e.getMessage());
+       }
+        chatgptSession.setOfficialSession(officialSession);
+        chatgptSession.setEmail(account.getAccount());
+        chatgptSession.setPassword(account.getPassword());
+        chatgptSession.setIsPlus(1);
+        chatgptSession.setAccountId(account.getId());
+        chatgptSession.setStatus(1);
+        chatgptSessionMapper.insert(chatgptSession);
+
+        return refreshToken;
+    }
+
+    @Override
+    public void upAccount(Account account) {
+        ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getEmail, account.getAccount()));
+        if(chatgptSession != null){
+            if(StringUtils.isNotBlank(account.getGptRefreshToken())){
+                chatgptSession.setOfficialSession(account.getGptRefreshToken());
+            }
+            chatgptSession.setEmail(account.getAccount());
+            chatgptSession.setPassword(account.getPassword());
+            chatgptSession.setIsPlus(1);
+            chatgptSession.setAccountId(account.getId());
+            chatgptSession.setStatus(1);
+            chatgptSessionMapper.updateById(chatgptSession);
+        }
+    }
+
+    @Override
+    public String getLoginUrl(Long userId, Long relationId) {
+        List<Long> userIdList = userBindRelationService.getRelationUserIdList(userId, null);
+        GroupsRelation groupsRelation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class).in(GroupsRelation::getUserId, userIdList).eq(GroupsRelation::getId, relationId));
+        if (groupsRelation == null) {
+            throw BusinessRuntimeException.getInstance("车票不存在");
+        }
+        GroupsTrips groupsTrips = groupsMapper.selectById(groupsRelation.getGroupsId());
+        if (groupsTrips == null) {
+            throw BusinessRuntimeException.getInstance("车队异常");
+        }
+        GoodsDonSku goodsDonSku = skuMapper.selectById(groupsTrips.getSkuId());
+        if (goodsDonSku != null && goodsDonSku.getIsMirror()) {
+            ChatgptUser chatgptUser = chatgptUserMapper.selectOne(Wrappers.lambdaQuery(ChatgptUser.class).eq(ChatgptUser::getRelationId, relationId));
+            if (chatgptUser == null) {
+                User user = userMapper.selectById(userId);
+                ChatgptSession chatgptSession = chatgptSessionMapper.selectOne(Wrappers.lambdaQuery(ChatgptSession.class).eq(ChatgptSession::getAccountId, groupsTrips.getAccountId()));
+                //第一次访问
+                chatgptUser = new ChatgptUser();
+                chatgptUser.setExpireTime(groupsRelation.getExpiryTime());
+                chatgptUser.setIsPlus(1);
+                chatgptUser.setSessionId(chatgptSession.getId());
+                chatgptUser.setName(user.getNickname());
+                chatgptUser.setImg(user.getHeadimgurl());
+                chatgptUser.setRelationId(groupsRelation.getId());
+                chatgptUser.setUserToken(UUID.randomUUID().toString());
+                chatgptUserMapper.insert(chatgptUser);
+            }
+
+            return GPT_DOMAIN + "/login_token?access_token=" + chatgptUser.getUserToken();
+        }else {
+            throw BusinessRuntimeException.getInstance("服务器出了点问题");
+        }
+    }
+
+}
+

+ 0 - 2
netflix-service/src/main/java/com/cyksj/service/chatgpt/impl/ChatGptAuthServiceImpl.java

@@ -354,6 +354,4 @@ public class ChatGptAuthServiceImpl implements ChatGptAuthService {
         }
 
     }
-
-
 }

+ 8 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -164,6 +164,9 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
     private final GroupRelationFrontService groupRelationFrontService;
 
     private final UserMapper userMapper;
+
+    private final ChatgptUserMapper chatgptUserMapper;
+
     private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
 
     @Override
@@ -831,6 +834,11 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (gcCash != null && gcCash.compareTo(BigDecimal.ZERO) > 0) {
                 giftCardOrderUseRecordService.returnGiftCardCash(orderDon.getId());
             }
+            //是否是GPT镜像规格
+            if (orderDon.getGoodsId() == 18 && sku.getIsMirror()) {
+                chatgptUserMapper.delete(Wrappers.lambdaQuery(ChatgptUser.class)
+                        .eq(ChatgptUser::getRelationId, orderDon.getRelationId()));
+            }
         });
     }
 

+ 17 - 1
netflix-web/src/main/java/com/cyksj/web/controller/manage/account/CmsAccountController.java

@@ -36,6 +36,7 @@ import com.cyksj.model.response.ExpiredAccountRep;
 import com.cyksj.model.response.OrderDonAccountRep;
 import com.cyksj.model.views.*;
 import com.cyksj.redis.RedisService;
+import com.cyksj.service.chatgpt.ChatGptAccountService;
 import com.cyksj.service.mange.AccountCommonService;
 import com.cyksj.service.mange.CmsAccountService;
 import com.cyksj.service.mange.CmsGroupService;
@@ -112,6 +113,8 @@ public class CmsAccountController {
 
 	private final AccountBlockedReplaceRecordMapper accountBlockedReplaceRecordMapper;
 
+	private final ChatGptAccountService chatGptAccountService;
+
 	private static final GlobalThreadPoolTaskExecutor TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
 	@GetMapping("/get")
@@ -423,7 +426,12 @@ public class CmsAccountController {
 		    if (account.getSkuId() == 178l) {
 			    availableParkingNum = 4;
 		    }
-		    groupsTrips.setAvailableParkingNum(availableParkingNum);
+			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(account.getSkuId());
+			if (goodsDonSku.getIsMirror()) {
+				String gptRefreshToken = chatGptAccountService.addAccount(account);
+				accountService.update(null, Wrappers.lambdaUpdate(Account.class).eq(Account::getId, account.getId()).set(Account::getGptRefreshToken,gptRefreshToken ));
+			}
+			groupsTrips.setAvailableParkingNum(availableParkingNum);
 
 		    groupsTrips.setSkuId(account.getSkuId());
 		    groupsTrips.setAccountId(account.getId());
@@ -589,6 +597,14 @@ public class CmsAccountController {
 				    .eq(GroupsTrips::getStatus, GroupsTrips.Status.down));
 	    }
 	    accountService.updateById(account);
+		//修改镜像服务账号
+		if(db.getSkuId() != null){
+			GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(account.getSkuId());
+			if (goodsDonSku.getIsMirror()) {
+				chatGptAccountService.upAccount(account);
+			}
+		}
+
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 

+ 41 - 0
netflix-web/src/main/java/com/cyksj/web/controller/mirror/MirrorController.java

@@ -0,0 +1,41 @@
+package com.cyksj.web.controller.mirror;
+
+import com.cyksj.service.chatgpt.ChatGptAccountService;
+import com.cyksj.web.util.StpUserUtil;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+
+/**
+ * /server/镜像服务
+ * @author chan
+ * @date 2024/3/19 14:41
+ */
+@Slf4j
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/applets/mirror")
+public class MirrorController {
+
+    private final ChatGptAccountService chatGptAccountService;
+
+    private final HttpServletResponse response;
+
+
+    /**
+     * GPT车票跳转登录
+     * @param relationId 车票id
+     */
+    @GetMapping("/chatGptMirror/{relationId}")
+    public void chatGptMirror(@PathVariable Long relationId) throws IOException {
+        Long userId = StpUserUtil.getLoginIdAsLong();
+
+        response.sendRedirect(chatGptAccountService.getLoginUrl(userId, relationId));
+    }
+}

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


+ 4 - 1
netflix-web/src/main/resources/application-pre.yml

@@ -174,4 +174,7 @@ advertisementwxapp:
   secret: 44c1e7431099fc0bd21dc320822b0108
   shopId: 1644299849
   shopKey: 5y5ZScTJGm0q0umHQOD4r3EfjRvCioUx
-  notify: https://xue.niupian.com.cn/8081/api/
+  notify: https://xue.niupian.com.cn/8081/api/
+
+chatgpt:
+  domain: "https://chat.claudeplus.com.cn"

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.