作者 钟来

修改bug

... ... @@ -80,6 +80,16 @@
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-system</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
<build>
... ...
package com.zhonglai.luhui.openai.controller;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.common.utils.Arith;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.html.HttpUtils;
import com.ruoyi.common.utils.http.OkHttpUtils;
import com.ruoyi.system.login.dto.OpenAiLoginUser;
import com.ruoyi.system.login.dto.OpenAiUserInfo;
import com.ruoyi.system.service.PublicService;
import com.theokanning.openai.Usage;
import com.theokanning.openai.completion.CompletionChoice;
import com.theokanning.openai.completion.CompletionResult;
import com.zhonglai.luhui.openai.dto.*;
import com.zhonglai.luhui.openai.utils.OpenAiUtils;
import com.zhonglai.luhui.openai.utils.SysConfigKeyType;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import okhttp3.Request;
import okhttp3.Response;
import org.apache.commons.io.input.ReaderInputStream;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
@Api(tags = "chatGPT接口")
@RestController
... ... @@ -45,4 +72,148 @@ public class ChatGPTController extends BaseController {
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,list);
}
private ChatRoomMessages mapToChatRoomMessages(Map<String,Object> src)
{
ChatRoomMessages chatRoomMessages = new ChatRoomMessages();
BeanUtils.copyBeanProp(chatRoomMessages,src);
return chatRoomMessages;
}
@ApiOperation("chatgpt3.5")
@Transactional
@RequestMapping(value = "/chatgptV3_5",method = RequestMethod.POST)
public Message chatgptV3_5(HttpServletRequest httpServletRequest, @RequestBody String data)
{
OpenAiLoginUser userInfo = (OpenAiLoginUser) getLoginUser();
Integer user_id= userInfo.getUserId().intValue();
OpenAiUserInfo openAiUserInfo = (OpenAiUserInfo) userInfo.getUser();
if(openAiUserInfo.getFlow_packet_remain()<=0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"余量不足");
}
List<Map<String,Object>> unitpriceList = publicService.getObjectListBySQL("select `key`,`value` from `lk_openai`.`sys_config` where `key_type`='"+SysConfigKeyType.gpt_3_5_unitprice+"'");
BigDecimal openaiUnitprice = new BigDecimal(0);
BigDecimal realityUnitprice = new BigDecimal(0);
if(null != unitpriceList && unitpriceList.size() !=0)
{
for(Map<String,Object> map:unitpriceList)
{
if("openai".equals(map.get("key")))
{
openaiUnitprice = new BigDecimal(map.get("value").toString());
}else if("reality".equals(map.get("key")))
{
realityUnitprice = new BigDecimal(map.get("value").toString());
}
}
}
if(openaiUnitprice.intValue()==0 || realityUnitprice.intValue()==0)
{
return new Message(MessageCode.DEFAULT_FAIL_CODE,"系统未配置流量单价,请联系管理员");
}
String room_id = String.valueOf(user_id);
logger.info("{}生成聊天会话:",room_id);
List<Map<String,Object>> list = publicService.getObjectListBySQL("SELECT send_role role,send_content content FROM `lk_openai`.`gpt_message` WHERE room_id='"+room_id+"' AND user_id="+user_id+" order by create_time asc limit 5");
List<ChatRoomMessages> messageList = Optional.ofNullable(list).orElse(new ArrayList<>()).stream().map(item->mapToChatRoomMessages(item)).collect(Collectors.toList());
ChatRoomMessages chatRoomMessages = new ChatRoomMessages();
chatRoomMessages.setRole("user");
chatRoomMessages.setContent(data);
messageList.add(chatRoomMessages);
//获取返回参数
CompletionResult3_5 completionResult3_5 = sendGPTAi(messageList);
Usage usage = completionResult3_5.getUsage();
List<CompletionChoice3_5> list3_5 = completionResult3_5.getChoices();
List<CompletionChoiceMessage3_5> rlist = new ArrayList<>();
if(null != list3_5 && list3_5.size() !=0 )
{
List<GptMessage> insertGptMessages = new ArrayList<>();
int i=0;
for (CompletionChoice3_5 completionChoice:list3_5)
{
GptMessage gptMessage = new GptMessage();
gptMessage.setRoom_id(room_id);
gptMessage.setUser_id(user_id);
gptMessage.setCreate_time(DateUtils.getNowTimeMilly());
gptMessage.setSend_role(chatRoomMessages.getRole());
gptMessage.setSend_content(chatRoomMessages.getContent());
if(insertGptMessages.size()==0) //第一次计数后面不计数
{
gptMessage.setSend_size(gptMessage.getSend_content().length());
//统计代币
gptMessage.setCompletion_tokens(usage.getCompletionTokens());
gptMessage.setPrompt_tokens(usage.getPromptTokens());
}else{
gptMessage.setSend_size(0);
}
if(null != completionChoice.getMessage())
{
rlist.add(completionChoice.getMessage());
gptMessage.setMessage_role(completionChoice.getMessage().getRole());
gptMessage.setMessage_content(completionChoice.getMessage().getContent());
}
gptMessage.setMessage_size(0);
if(null != gptMessage.getMessage_content())
{
gptMessage.setMessage_size(gptMessage.getMessage_content().length());
}
i+=gptMessage.getMessage_content().length();
insertGptMessages.add(gptMessage);
}
logger.info("{} 请求的流量:{},回复的流量:{}",room_id,messageList.get(messageList.size()-1).getContent().length(),i);
if(null != insertGptMessages && insertGptMessages.size() !=0 )
{
publicService.insertAllToTable(insertGptMessages,"`lk_openai`.`gpt_message`");
}
publicService.updateBySql("UPDATE `user_info` SET flow_packet_remain=flow_packet_remain-"+usage.getTotalTokens()+" WHERE id="+openAiUserInfo.getId());
UserFlowPacketRemainLog userFlowPacketRemainLog = new UserFlowPacketRemainLog();
userFlowPacketRemainLog.setCreate_time(DateUtils.getNowTimeMilly());
userFlowPacketRemainLog.setUser_id(openAiUserInfo.getId());
userFlowPacketRemainLog.setRoom_id(room_id);
userFlowPacketRemainLog.setPrompt_tokens(usage.getPromptTokens());
userFlowPacketRemainLog.setCompletion_tokens(usage.getCompletionTokens());
userFlowPacketRemainLog.setTotal_tokens(usage.getTotalTokens());
userFlowPacketRemainLog.setOpenai_money(openaiUnitprice.multiply(new BigDecimal(usage.getTotalTokens())).divide(new BigDecimal(1000),6));
userFlowPacketRemainLog.setReality_money(realityUnitprice.multiply(new BigDecimal(usage.getTotalTokens())).divide(new BigDecimal(1000),6));
publicService.insertToTable(userFlowPacketRemainLog,"`lk_openai`.`user_flow_packet_remain_log`");
}
return new Message(MessageCode.DEFAULT_FAIL_CODE,rlist);
}
private CompletionResult3_5 sendGPTAi(List<ChatRoomMessages> messageList)
{
JSONObject jsonObject = new JSONObject();
jsonObject.put("model","gpt-3.5-turbo-0301");
jsonObject.put("messages",messageList);
String str = HttpUtil.post("https://chatgpt.njlaikun.com/v1/chat/completions",jsonObject.toString());
CompletionResult3_5 completionResult = JSONObject.parseObject(str, CompletionResult3_5.class);
return completionResult;
}
public static byte[] readInputStream(InputStream inputStream) throws IOException {
byte[] buffer = new byte[1024];
int len = 0;
ByteArrayOutputStream bos = new ByteArrayOutputStream();
while((len = inputStream.read(buffer)) != -1) {
bos.write(buffer, 0, len);
}
bos.close();
return bos.toByteArray();
}
}
... ...
package com.zhonglai.luhui.openai.controller;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.Message;
import com.ruoyi.common.core.domain.MessageCode;
import com.ruoyi.system.login.service.LoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Api(tags = "登陆")
@RestController
@RequestMapping("/openAiUserLogin")
public class OpenAiUserLoginController extends BaseController {
private static String user_pass = "123456";
@Autowired
private LoginService loginService;
@ApiOperation("手机验证码登陆")
@ApiImplicitParams({
@ApiImplicitParam(value = "手机号",name = "phone"),
@ApiImplicitParam(value = "验证码",name = "code"),
})
@PostMapping("/userpassLogin")
public Message userpassLogin(String phone, String code,String key)
{
//验证验证码
String str = HttpUtil.get("http://ly.userlogin.yu2le.com/userLogin/verificationCode?key="+key+"&code="+code);
Message message = JSON.parseObject(str,Message.class);
if(message.getCode()!=MessageCode.DEFAULT_SUCCESS_CODE.code)
{
return message;
}
//生成令牌
String token = loginService.openaiLoginByPass(phone,user_pass);
Map<String,Object> map = new HashMap<>();
map.put(Constants.TOKEN, token);
return new Message(MessageCode.DEFAULT_SUCCESS_CODE,map);
}
@ApiOperation("发送验证码")
@ApiImplicitParams({
@ApiImplicitParam(value = "手机号",name = "phone"),
})
@PostMapping("/sendPhoneCode")
public Message sendPhoneCode(String phone)
{
//生成令牌
String str = HttpUtil.get("http://ly.userlogin.yu2le.com/userLogin/getPhoneCode/1/"+phone);
return JSON.parseObject(str,Message.class);
}
}
... ...
package com.zhonglai.luhui.openai.dto;
/**
* 聊天室消息
*/
public class ChatRoomMessages {
private String role; //角色(system “系统”、user “用户”、assistant “助手”)
private String content; //内容(消息的内容)
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
public class CompletionChoice3_5 {
private CompletionChoiceMessage3_5 message;
private String finish_reason;
private Integer index;
public CompletionChoiceMessage3_5 getMessage() {
return message;
}
public void setMessage(CompletionChoiceMessage3_5 message) {
this.message = message;
}
public String getFinish_reason() {
return finish_reason;
}
public void setFinish_reason(String finish_reason) {
this.finish_reason = finish_reason;
}
public Integer getIndex() {
return index;
}
public void setIndex(Integer index) {
this.index = index;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
public class CompletionChoiceMessage3_5 {
private String role;
private String content;
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
import com.theokanning.openai.Usage;
import com.theokanning.openai.completion.CompletionChoice;
import java.util.List;
public class CompletionResult3_5 {
private String id;
private String object;
private Long created;
private String model;
private List<CompletionChoice3_5> choices;
private Usage usage;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getObject() {
return object;
}
public void setObject(String object) {
this.object = object;
}
public Long getCreated() {
return created;
}
public void setCreated(Long created) {
this.created = created;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public List<CompletionChoice3_5> getChoices() {
return choices;
}
public void setChoices(List<CompletionChoice3_5> choices) {
this.choices = choices;
}
public Usage getUsage() {
return usage;
}
public void setUsage(Usage usage) {
this.usage = usage;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
public class GptMessage {
private Integer id; //int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
private Integer create_time; //int(11) NOT NULL COMMENT '创建时间',
private String room_id; //varchar(150) DEFAULT NULL COMMENT '房价id',
private String send_role; //varchar(15) DEFAULT NULL COMMENT '发送角色',
private String send_content; //text COMMENT '发送内容',
private String message_role; //varchar(15) DEFAULT NULL COMMENT '返回消息角色',
private String message_content; //text COMMENT '返回消息内容',
private Integer send_size; //int(11) DEFAULT NULL COMMENT '发送大小byte',
private Integer message_size; //int(11) DEFAULT NULL COMMENT '返回大小byte',
private Integer user_id; //int(11) DEFAULT NULL COMMENT '用户id',
private Long prompt_tokens; //输入代币
private Long completion_tokens; //输出代币
public Long getPrompt_tokens() {
return prompt_tokens;
}
public void setPrompt_tokens(Long prompt_tokens) {
this.prompt_tokens = prompt_tokens;
}
public Long getCompletion_tokens() {
return completion_tokens;
}
public void setCompletion_tokens(Long completion_tokens) {
this.completion_tokens = completion_tokens;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getCreate_time() {
return create_time;
}
public void setCreate_time(Integer create_time) {
this.create_time = create_time;
}
public String getRoom_id() {
return room_id;
}
public void setRoom_id(String room_id) {
this.room_id = room_id;
}
public String getSend_role() {
return send_role;
}
public void setSend_role(String send_role) {
this.send_role = send_role;
}
public String getSend_content() {
return send_content;
}
public void setSend_content(String send_content) {
this.send_content = send_content;
}
public String getMessage_role() {
return message_role;
}
public void setMessage_role(String message_role) {
this.message_role = message_role;
}
public String getMessage_content() {
return message_content;
}
public void setMessage_content(String message_content) {
this.message_content = message_content;
}
public Integer getSend_size() {
return send_size;
}
public void setSend_size(Integer send_size) {
this.send_size = send_size;
}
public Integer getMessage_size() {
return message_size;
}
public void setMessage_size(Integer message_size) {
this.message_size = message_size;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
public class SysConfig {
private String id; //int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
private String key_type; //varchar(50) DEFAULT NULL COMMENT 'key类型',
private String key; //varchar(50) DEFAULT NULL COMMENT 'key',
private String value; //varchar(50) DEFAULT NULL COMMENT '值',
private String sort; //int(11) DEFAULT NULL COMMENT '排序',
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getKey_type() {
return key_type;
}
public void setKey_type(String key_type) {
this.key_type = key_type;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public String getSort() {
return sort;
}
public void setSort(String sort) {
this.sort = sort;
}
}
... ...
package com.zhonglai.luhui.openai.dto;
import java.math.BigDecimal;
public class UserFlowPacketRemainLog {
private Integer id; //int(11) DEFAULT NULL COMMENT '主键',
private Integer user_id; //int(11) DEFAULT NULL COMMENT '用户',
private String room_id; //varchar(50) DEFAULT NULL COMMENT '房间号',
private Integer create_time; //int(11) DEFAULT NULL COMMENT '创建时间',
private Long prompt_tokens; //bigint(20) DEFAULT NULL COMMENT '发起代币',
private Long completion_tokens; //bigint(20) DEFAULT NULL COMMENT '完成代币',
private Long total_tokens; //bigint(20) DEFAULT NULL COMMENT '总代币',
private BigDecimal openai_money; //bigint(20) DEFAULT NULL COMMENT 'openai费用(美元)',
private BigDecimal reality_money; //bigint(20) DEFAULT NULL COMMENT '实际费用(人民币)'
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUser_id() {
return user_id;
}
public void setUser_id(Integer user_id) {
this.user_id = user_id;
}
public String getRoom_id() {
return room_id;
}
public void setRoom_id(String room_id) {
this.room_id = room_id;
}
public Integer getCreate_time() {
return create_time;
}
public void setCreate_time(Integer create_time) {
this.create_time = create_time;
}
public Long getPrompt_tokens() {
return prompt_tokens;
}
public void setPrompt_tokens(Long prompt_tokens) {
this.prompt_tokens = prompt_tokens;
}
public Long getCompletion_tokens() {
return completion_tokens;
}
public void setCompletion_tokens(Long completion_tokens) {
this.completion_tokens = completion_tokens;
}
public Long getTotal_tokens() {
return total_tokens;
}
public void setTotal_tokens(Long total_tokens) {
this.total_tokens = total_tokens;
}
public BigDecimal getOpenai_money() {
return openai_money;
}
public void setOpenai_money(BigDecimal openai_money) {
this.openai_money = openai_money;
}
public BigDecimal getReality_money() {
return reality_money;
}
public void setReality_money(BigDecimal reality_money) {
this.reality_money = reality_money;
}
}
... ...
package com.zhonglai.luhui.openai.service;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.system.login.dto.ApiLoginUser;
import com.ruoyi.system.login.dto.Yu2leUserInfo;
import com.ruoyi.system.login.dto.Yu2leUserLogin;
import com.ruoyi.system.login.dto.*;
import com.ruoyi.system.service.PublicService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
... ... @@ -21,18 +20,22 @@ public class ChatgptDetailsServiceImpl implements UserDetailsService {
private PublicService publicService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Yu2leUserLogin yu2leUserLogin = publicService.getObjectForTableName(Yu2leUserLogin.class,"loginName",username,"`liu_yu_le`.`user_login`");
Yu2leUserInfo yu2leUserInfo = publicService.getObjectForTableName(Yu2leUserInfo.class,"loginName",username,"`liu_yu_le`.`user_info`");;
if (StringUtils.isNull(yu2leUserLogin) || StringUtils.isNull(yu2leUserInfo))
OpenAiUserInfo openAiUserInfo = publicService.getObjectForTableName(OpenAiUserInfo.class,"phone",username,"`lk_openai`.`user_info`");
if (StringUtils.isNull(openAiUserInfo) )
{
log.info("登录用户:{} 不存在.", username);
throw new ServiceException("登录用户:" + username + " 不存在");
log.info("未找到用户{},开始新增用户...",username);
OpenAiUserInfo adduser = new OpenAiUserInfo();
adduser.setPhone(username);
adduser.setCreate_time(DateUtils.getNowTimeMilly());
adduser.setNickname(username);
adduser.setVip_level(0);
adduser.setFlow_packet_remain(10000); //默认给1w免费额度
adduser.setFlow_packet_total(10000);
adduser.setState(1);
publicService.insertToTable(adduser,"`lk_openai`.`user_info`");
log.info("新增用户{},成功",username);
openAiUserInfo = adduser;
}
else if (1==yu2leUserInfo.getIsInvalid())
{
log.info("登录用户:{} 已被停用.", username);
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
}
return new ApiLoginUser(yu2leUserInfo, yu2leUserLogin);
return new OpenAiLoginUser(openAiUserInfo);
}
}
... ...
... ... @@ -64,6 +64,8 @@ public class OpenAiUtils {
PARMS.put("OpenAi47", new OpenAi("OpenAi47", "点评生成", "依据文本内容自动生成点评", "text-davinci-003", "依据下面内容,进行点评:\n%s\n点评:", 0.5, 1.0, 1.0, 0.0, 0.0, ""));
PARMS.put("OpenAi48", new OpenAi("OpenAi48", "知识学习", "可以为学习知识自动解答", "text-davinci-003", "%s", 0.3, 1.0, 1.0, 0.0, 0.0, ""));
PARMS.put("OpenAi49", new OpenAi("OpenAi49", "面试", "生成面试题", "text-davinci-003", "创建10道%s相关的面试题(中文):\n", 0.5, 1.0, 10.0, 0.0, 0.0, ""));
PARMS.put("OpenAi50", new OpenAi("OpenAi50", "chatgpt3.5", "chatgpt3.5", "gpt-3.5-turbo-0301", "%s", null, null, null, null, null, null));
}
public static String OPENAPI_TOKEN = "";
... ... @@ -686,4 +688,9 @@ public class OpenAiUtils {
return getAiResult(openAi, String.format(openAi.getPrompt(), text));
}
public static List<CompletionChoice> getChatGPT3_5(String text) {
OpenAi openAi = PARMS.get("OpenAi50");
System.out.println(String.format(openAi.getPrompt(), text));
return getAiResult(openAi, String.format(openAi.getPrompt(), text));
}
}
... ...
package com.zhonglai.luhui.openai.utils;
public class SysConfigKeyType {
public static String gpt_3_5_unitprice = "GPT_3_5_UNITPRICE"; //$0.002 / 1K tokens
}
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8082 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-openai # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-chat-gpt send-tags: 1 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/chatgpt/aiChatbot chatgpt: token: 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 timeout: 5000
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 获取ip地址开关 addressEnabled: false # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8082 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-openai # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-chat-gpt send-tags: 1 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login,/register,/captchaImage,/getCacheObject,/v2/api-docs,/chatgpt/aiChatbot,/chatgpt/chatgptV3_5, chatgpt: token: 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 timeout: 5000
\ No newline at end of file
... ...
package com.ruoyi.system.login.dto;
import com.ruoyi.common.core.domain.BaseLoginUser;
import com.ruoyi.system.domain.tool.PublicSQLConfig;
import org.springframework.security.core.GrantedAuthority;
import java.util.Collection;
public class OpenAiLoginUser extends BaseLoginUser {
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
private OpenAiUserInfo openAiUserInfo;
public OpenAiLoginUser(OpenAiUserInfo openAiUserInfo) {
this.openAiUserInfo = openAiUserInfo;
setUserId(new Long(openAiUserInfo.getId()));
}
@Override
public Object getUser() {
return openAiUserInfo;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return "123456";
}
@Override
public String getUsername() {
return openAiUserInfo.getPhone();
}
@Override
public boolean isAccountNonExpired() {
return openAiUserInfo.getState()!=2;
}
@Override
public boolean isAccountNonLocked() {
return openAiUserInfo.getState()!=3;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return openAiUserInfo.getState()!=0;
}
}
... ...
package com.ruoyi.system.login.dto;
import com.ruoyi.system.domain.tool.PublicSQLConfig;
import java.io.Serializable;
/**
* 用户信息
*/
public class OpenAiUserInfo implements Serializable {
@PublicSQLConfig(isSelect = false)
private static final long serialVersionUID = 2442852637823064570L;
private Integer id; // int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
private String phone; // varchar(50) DEFAULT NULL COMMENT '手机号',
private String nickname; // varchar(50) DEFAULT NULL COMMENT '昵称',
private String img_url; // varchar(50) DEFAULT NULL COMMENT '头像地址',
private Integer vip_level; //vip等级(0试用用户,1vip1,2vip2,3vip3)
private Integer getVip_level_end_time; //vip到期时间
private Integer create_time; //创建时间
private Integer flow_packet_remain; //流量包余额
private Integer flow_packet_total; //流量包总额
private Integer state; //状态(0禁用,1正常,2过期,3锁定)
public Integer getState() {
return state;
}
public void setState(Integer state) {
this.state = state;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public String getImg_url() {
return img_url;
}
public void setImg_url(String img_url) {
this.img_url = img_url;
}
public Integer getVip_level() {
return vip_level;
}
public void setVip_level(Integer vip_level) {
this.vip_level = vip_level;
}
public Integer getGetVip_level_end_time() {
return getVip_level_end_time;
}
public void setGetVip_level_end_time(Integer getVip_level_end_time) {
this.getVip_level_end_time = getVip_level_end_time;
}
public Integer getCreate_time() {
return create_time;
}
public void setCreate_time(Integer create_time) {
this.create_time = create_time;
}
public Integer getFlow_packet_remain() {
return flow_packet_remain;
}
public void setFlow_packet_remain(Integer flow_packet_remain) {
this.flow_packet_remain = flow_packet_remain;
}
public Integer getFlow_packet_total() {
return flow_packet_total;
}
public void setFlow_packet_total(Integer flow_packet_total) {
this.flow_packet_total = flow_packet_total;
}
}
... ...
... ... @@ -91,6 +91,20 @@ public class LoginService {
return tokenService.createToken(loginUser);
}
public String openaiLoginByPass(String user,String pass) {
// 用户验证
Authentication authentication = userPasswordVerification(user,pass,SysLogininforType.openAi);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(user, SysLogininforType.openAi, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
OpenAiLoginUser loginUser = (OpenAiLoginUser) authentication.getPrincipal();
loginUser.setSysLogininforType(SysLogininforType.openAi);
// OpenAiUserInfo openAiUserInfo = new OpenAiUserInfo();
// openAiUserInfo.setId(loginUser.getUserId().intValue());
// openAiUserInfo.s(IpUtils.getIpAddr(ServletUtils.getRequest()));
// openAiUserInfo.setLastLoginTime(DateUtils.getNowTimeMilly());
// publicService.updateObjectByTable(openAiUserInfo,"id","`lk_openai`.`user_info`");
return tokenService.createToken(loginUser);
}
/**
* 刷新api端token
* @param token
... ...
... ... @@ -34,7 +34,7 @@ public interface PublicMapper {
* 指定表名添加对象集合
*/
@InsertProvider(type = PublicSQL.class, method = "insertAllToTable")
int insertAllToTable(List<?> list,String tableName);
int insertAllToTable(@Param("list")List<?> list,@Param("tableName")String tableName);
/**
* 更新对象不为空的属性
... ...