feat: 测试版本提交

This commit is contained in:
ageerle
2025-04-08 16:48:06 +08:00
parent 00f362acf1
commit d2755f00bc
111 changed files with 1112 additions and 2276 deletions

View File

@@ -0,0 +1,21 @@
package org.ruoyi.system;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
/**
* 启动程序
*
* @author Lion Li
*/
@SpringBootApplication
public class RuoYiAIApplication {
public static void main(String[] args) {
SpringApplication application = new SpringApplication(RuoYiAIApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
System.out.println("(♥◠‿◠)ノ゙ RuoYiAI启动成功 ლ(´ڡ`ლ)゙");
}
}

View File

@@ -0,0 +1,18 @@
package org.ruoyi.system;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
/**
* web容器中进行部署
*
* @author Lion Li
*/
public class RuoYiAIServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(RuoYiAIApplication.class);
}
}

View File

@@ -0,0 +1,169 @@
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.json.JSONUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import org.ruoyi.common.core.constant.Constants;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.domain.model.*;
import org.ruoyi.common.core.utils.MapstructUtils;
import org.ruoyi.common.core.utils.StreamUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.common.tenant.helper.TenantHelper;
import org.ruoyi.system.domain.bo.SysTenantBo;
import org.ruoyi.system.domain.vo.LoginTenantVo;
import org.ruoyi.system.domain.vo.LoginVo;
import org.ruoyi.system.domain.vo.SysTenantVo;
import org.ruoyi.system.domain.vo.TenantListVo;
import org.ruoyi.system.service.ISysTenantService;
import org.ruoyi.system.service.SysLoginService;
import org.ruoyi.system.service.SysRegisterService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.net.URL;
import java.util.List;
/**
* 认证
*
* @author Lion Li
*/
@SaIgnore
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/auth")
public class AuthController {
private final SysLoginService loginService;
private final SysRegisterService registerService;
private final ISysTenantService tenantService;
@PostMapping("/xcxLogin")
public R<LoginVo> login(@Validated @RequestBody String xcxCode) throws WxErrorException {
String openidFromCode = loginService.getOpenidFromCode((String) JSONUtil.parseObj(xcxCode).get("xcxCode"));
LoginVo loginVo = loginService.mpLogin(openidFromCode);
return R.ok(loginVo);
}
/**
* 登录方法
*
* @param body 登录信息
* @return 结果
*/
@PostMapping("/login")
public R<LoginVo> login(@Validated @RequestBody LoginBody body) {
body.setTenantId(Constants.TENANT_ID);
LoginVo loginVo = new LoginVo();
// 生成令牌
String token = loginService.login(
body.getTenantId(),
body.getUsername(), body.getPassword(),
body.getCode(), body.getUuid());
loginVo.setToken(token);
loginVo.setAccess_token(token);
loginVo.setUserInfo(LoginHelper.getLoginUser());
return R.ok(loginVo);
}
/**
* 短信登录
*
* @param body 登录信息
* @return 结果
*/
@PostMapping("/smsLogin")
public R<LoginVo> smsLogin(@Validated @RequestBody SmsLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
String token = loginService.smsLogin(body.getTenantId(), body.getPhonenumber(), body.getSmsCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
/**
* 访客登录
*
* @param loginBody 登录信息
* @return token信息
*/
@PostMapping("/visitorLogin")
public R<LoginVo> visitorLogin(@RequestBody VisitorLoginBody loginBody) {
LoginVo loginVo = new LoginVo();
return R.ok(loginVo);
}
/**
* 邮件登录
*
* @param body 登录信息
* @return 结果
*/
@PostMapping("/emailLogin")
public R<LoginVo> emailLogin(@Validated @RequestBody EmailLoginBody body) {
LoginVo loginVo = new LoginVo();
// 生成令牌
String token = loginService.emailLogin(body.getTenantId(), body.getEmail(), body.getEmailCode());
loginVo.setToken(token);
return R.ok(loginVo);
}
/**
* 退出登录
*/
@PostMapping("/logout")
public R<Void> logout() {
loginService.logout();
return R.ok("退出成功");
}
/**
* 用户注册
*/
@PostMapping("/register")
public R<Void> register(@Validated @RequestBody RegisterBody user, HttpServletRequest request) {
String domainName = request.getServerName();
user.setDomainName(domainName);
registerService.register(user);
return R.ok();
}
/**
* 重置密码
*/
@PostMapping("/reset/password")
@SaIgnore
public R<Void> resetPassWord(@Validated @RequestBody RegisterBody user) {
registerService.resetPassWord(user);
return R.ok();
}
/**
* 登录页面租户下拉框
*
* @return 租户列表
*/
@GetMapping("/tenant/list")
public R<LoginTenantVo> tenantList(HttpServletRequest request) throws Exception {
List<SysTenantVo> tenantList = tenantService.queryList(new SysTenantBo());
List<TenantListVo> voList = MapstructUtils.convert(tenantList, TenantListVo.class);
// 获取域名
String host = new URL(request.getRequestURL().toString()).getHost();
// 根据域名进行筛选
List<TenantListVo> list = StreamUtils.filter(voList, vo -> StringUtils.equals(vo.getDomain(), host));
// 返回对象
LoginTenantVo vo = new LoginTenantVo();
vo.setVoList(CollUtil.isNotEmpty(list) ? list : voList);
vo.setTenantEnabled(TenantHelper.isEnable());
return R.ok(vo);
}
}

View File

@@ -0,0 +1,153 @@
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.hutool.captcha.AbstractCaptcha;
import cn.hutool.captcha.generator.CodeGenerator;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.constant.Constants;
import org.ruoyi.common.core.constant.GlobalConstants;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.exception.ServiceException;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.core.utils.SpringUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.common.core.utils.reflect.ReflectUtils;
import org.ruoyi.common.mail.utils.MailUtils;
import org.ruoyi.common.redis.utils.RedisUtils;
import org.ruoyi.common.sms.config.properties.SmsProperties;
import org.ruoyi.common.sms.core.SmsTemplate;
import org.ruoyi.common.sms.entity.SmsResult;
import org.ruoyi.common.web.config.properties.CaptchaProperties;
import org.ruoyi.common.web.enums.CaptchaType;
import org.ruoyi.system.domain.request.EmailRequest;
import org.ruoyi.system.domain.vo.CaptchaVo;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;
/**
* 验证码操作处理
*
* @author Lion Li
*/
@SaIgnore
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
public class CaptchaController {
private final CaptchaProperties captchaProperties;
private final SmsProperties smsProperties;
private final ConfigService configService;
/**
* 短信验证码
*
* @param phonenumber 用户手机号
*/
@GetMapping("/resource/sms/code")
public R<Void> smsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
if (!smsProperties.getEnabled()) {
return R.fail("当前系统没有开启短信功能!");
}
String key = GlobalConstants.CAPTCHA_CODE_KEY + phonenumber;
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 验证码模板id 自行处理 (查数据库或写死均可)
String templateId = "";
Map<String, String> map = new HashMap<>(1);
map.put("code", code);
SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
SmsResult result = smsTemplate.send(phonenumber, templateId, map);
if (!result.isSuccess()) {
log.error("验证码短信发送异常 => {}", result);
return R.fail(result.getMessage());
}
return R.ok();
}
/**
* 邮箱验证码
*
* @param emailRequest 用户邮箱
*/
@PostMapping("/resource/email/code")
public R<Void> emailCode(@RequestBody @Valid EmailRequest emailRequest) {
String key = GlobalConstants.CAPTCHA_CODE_KEY + emailRequest.getUsername();
String code = RandomUtil.randomNumbers(4);
RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
// 检验邮箱后缀
String suffix = configService.getConfigValue("mail", "suffix");
String prompt = configService.getConfigValue("mail", "prompt");
if(StringUtils.isNotEmpty(suffix)){
// 动态的域名列表
String[] invalidDomains = suffix.split(",");
for (String domain : invalidDomains) {
if (emailRequest.getUsername().endsWith(domain)) {
throw new ServiceException(prompt);
}
}
}
// 自定义邮箱模板
String model = configService.getConfigValue("mail", "mailModel");
String mailTitle = configService.getConfigValue("mail", "mailTitle");
String replacedModel = model.replace("{code}", code);
try {
MailUtils.sendHtml(emailRequest.getUsername(), mailTitle, replacedModel);
} catch (Exception e) {
log.error("邮箱验证码发送异常 => {}", e.getMessage());
return R.fail(e.getMessage());
}
return R.ok();
}
/**
* 生成验证码
*/
@GetMapping("/auth/code")
public R<CaptchaVo> getCode() {
CaptchaVo captchaVo = new CaptchaVo();
boolean captchaEnabled = captchaProperties.getEnable();
if (!captchaEnabled) {
captchaVo.setCaptchaEnabled(false);
return R.ok(captchaVo);
}
// 保存验证码信息
String uuid = IdUtil.simpleUUID();
String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + uuid;
// 生成验证码
CaptchaType captchaType = captchaProperties.getType();
boolean isMath = CaptchaType.MATH == captchaType;
Integer length = isMath ? captchaProperties.getNumberLength() : captchaProperties.getCharLength();
CodeGenerator codeGenerator = ReflectUtils.newInstance(captchaType.getClazz(), length);
AbstractCaptcha captcha = SpringUtils.getBean(captchaProperties.getCategory().getClazz());
captcha.setGenerator(codeGenerator);
captcha.createCode();
String code = captcha.getCode();
if (isMath) {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression(StringUtils.remove(code, "="));
code = exp.getValue(String.class);
}
RedisUtils.setCacheObject(verifyKey, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
captchaVo.setUuid(uuid);
captchaVo.setImg(captcha.getImageBase64());
return R.ok(captchaVo);
}
}

View File

@@ -8,9 +8,6 @@ import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.service.ConfigService;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatConfigBo;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.system.service.IChatConfigService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -15,9 +15,6 @@ import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatGptsBo;
import org.ruoyi.system.domain.vo.ChatGptsVo;
import org.ruoyi.system.service.IChatGptsService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -16,9 +16,6 @@ import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.satoken.utils.LoginHelper;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatMessageVo;
import org.ruoyi.system.service.IChatMessageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -17,9 +17,6 @@ import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.system.domain.bo.ChatPluginBo;
import org.ruoyi.system.service.IChatPluginService;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
/**

View File

@@ -3,10 +3,6 @@ package org.ruoyi.system.controller.system;
import lombok.RequiredArgsConstructor;
import org.ruoyi.common.core.domain.R;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatAppStoreBo;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
import org.ruoyi.system.service.IChatAppStoreService;
import org.springframework.web.bind.annotation.*;
import java.util.List;

View File

@@ -15,9 +15,6 @@ import org.ruoyi.common.log.enums.BusinessType;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.system.domain.bo.ChatVisitorUsageBo;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.system.service.IChatVisitorUsageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -16,9 +16,6 @@ import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.web.core.BaseController;
import org.ruoyi.common.wechat.web.utils.UUIDShortUtil;
import org.ruoyi.system.domain.bo.ChatVoucherBo;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
import org.ruoyi.system.service.IChatVoucherService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

View File

@@ -0,0 +1,26 @@
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 首页
*
* @author Lion Li
*/
@SaIgnore
@RequiredArgsConstructor
@RestController
public class IndexController {
/**
* 访问首页,提示语
*/
@GetMapping("/")
public String index() {
return "RuoYi-AI 启动成功";
}
}

View File

@@ -0,0 +1,184 @@
//package org.ruoyi.system.controller.system;
//
//import cn.dev33.satoken.stp.StpUtil;
//import jakarta.servlet.http.HttpServletRequest;
//import jakarta.servlet.http.HttpServletResponse;
//import jakarta.validation.Valid;
//import jakarta.validation.constraints.NotEmpty;
//import jakarta.validation.constraints.NotNull;
//import lombok.RequiredArgsConstructor;
//import org.ruoyi.common.chat.domain.request.ChatRequest;
//import org.ruoyi.common.chat.entity.chat.Message;
//import org.ruoyi.common.core.domain.R;
//import org.ruoyi.common.core.validate.AddGroup;
//import org.ruoyi.common.excel.utils.ExcelUtil;
//import org.ruoyi.common.log.annotation.Log;
//import org.ruoyi.common.log.enums.BusinessType;
//import org.ruoyi.common.mybatis.core.page.PageQuery;
//import org.ruoyi.common.mybatis.core.page.TableDataInfo;
//import org.ruoyi.common.satoken.utils.LoginHelper;
//import org.ruoyi.common.web.core.BaseController;
//import org.ruoyi.knowledge.chain.vectorstore.VectorStore;
//import org.ruoyi.knowledge.domain.bo.KnowledgeAttachBo;
//import org.ruoyi.knowledge.domain.bo.KnowledgeFragmentBo;
//import org.ruoyi.knowledge.domain.bo.KnowledgeInfoBo;
//import org.ruoyi.knowledge.domain.req.KnowledgeInfoUploadRequest;
//import org.ruoyi.knowledge.domain.vo.KnowledgeAttachVo;
//import org.ruoyi.knowledge.domain.vo.KnowledgeFragmentVo;
//import org.ruoyi.knowledge.domain.vo.KnowledgeInfoVo;
//import org.ruoyi.knowledge.service.EmbeddingService;
//import org.ruoyi.knowledge.service.IKnowledgeAttachService;
//import org.ruoyi.knowledge.service.IKnowledgeFragmentService;
//import org.ruoyi.knowledge.service.IKnowledgeInfoService;
//import org.ruoyi.system.service.ISseService;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.*;
//import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
//
//import java.util.List;
//
//
///**
// * 知识库
// *
// * @author Lion Li
// * @date 2024-10-21
// */
//@Validated
//@RequiredArgsConstructor
//@RestController
//@RequestMapping("/knowledge")
//public class KnowledgeController extends BaseController {
//
// private final IKnowledgeInfoService knowledgeInfoService;
//
// private final VectorStore vectorStore;
//
// private final IKnowledgeAttachService attachService;
//
// private final IKnowledgeFragmentService fragmentService;
//
// private final EmbeddingService embeddingService;
//
// private final ISseService sseService;
//
// /**
// * 知识库对话
// */
// @PostMapping("/send")
// public SseEmitter send(@RequestBody @Valid ChatRequest chatRequest, HttpServletRequest request) {
// List<Message> messages = chatRequest.getMessages();
// // 获取知识库信息
// Message message = messages.get(messages.size() - 1);
// StringBuilder sb = new StringBuilder(message.getContent().toString());
// List<String> nearestList;
// List<Double> queryVector = embeddingService.getQueryVector(message.getContent().toString(), chatRequest.getKid());
// nearestList = vectorStore.nearest(queryVector, chatRequest.getKid());
// for (String prompt : nearestList) {
// sb.append("\n####").append(prompt);
// }
// sb.append( (nearestList.size() > 0 ? "\n\n注意回答问题时须严格根据我给你的系统上下文内容原文进行回答请不要自己发挥,回答时保持原来文本的段落层级" : ""));
// message.setContent(sb.toString());
// return sseService.sseChat(chatRequest, request);
// }
//
// /**
// * 根据用户信息查询本地知识库
// */
// @GetMapping("/list")
// public TableDataInfo<KnowledgeInfoVo> list(KnowledgeInfoBo bo, PageQuery pageQuery) {
// if(!StpUtil.isLogin()){
// return null;
// }
// bo.setUid(LoginHelper.getUserId());
// return knowledgeInfoService.queryPageList(bo, pageQuery);
// }
//
// /**
// * 新增知识库
// */
// @Log(title = "知识库", businessType = BusinessType.INSERT)
// @PostMapping("/save")
// public R<Void> save(@Validated(AddGroup.class) @RequestBody KnowledgeInfoBo bo) {
// knowledgeInfoService.saveOne(bo);
// return R.ok();
// }
//
// /**
// * 删除知识库
// */
// @PostMapping("/remove/{id}")
// public R<String> remove(@PathVariable String id){
// knowledgeInfoService.removeKnowledge(id);
// return R.ok("删除知识库成功!");
// }
//
// /**
// * 修改知识库
// */
// @Log(title = "知识库", businessType = BusinessType.UPDATE)
// @PostMapping("/edit")
// public R<Void> edit( @RequestBody KnowledgeInfoBo bo) {
// return toAjax(knowledgeInfoService.updateByBo(bo));
// }
//
// /**
// * 导出知识库列表
// */
// @Log(title = "知识库", businessType = BusinessType.EXPORT)
// @PostMapping("/export")
// public void export(KnowledgeInfoBo bo, HttpServletResponse response) {
// List<KnowledgeInfoVo> list = knowledgeInfoService.queryList(bo);
// ExcelUtil.exportExcel(list, "知识库", KnowledgeInfoVo.class, response);
// }
//
// /**
// * 查询知识附件信息
// */
// @GetMapping("/detail/{kid}")
// public TableDataInfo<KnowledgeAttachVo> attach(KnowledgeAttachBo bo, PageQuery pageQuery,@PathVariable String kid){
// bo.setKid(kid);
// return attachService.queryPageList(bo, pageQuery);
// }
//
// /**
// * 上传知识库附件
// */
// @PostMapping(value = "/attach/upload")
// public R<String> upload(KnowledgeInfoUploadRequest request){
// knowledgeInfoService.upload(request);
// return R.ok("上传知识库附件成功!");
// }
//
// /**
// * 获取知识库附件详细信息
// *
// * @param id 主键
// */
// @GetMapping("attach/info/{id}")
// public R<KnowledgeAttachVo> getAttachInfo(@NotNull(message = "主键不能为空")
// @PathVariable Long id) {
// return R.ok(attachService.queryById(id));
// }
//
// /**
// * 删除知识库附件
// *
// */
// @PostMapping("attach/remove/{docId}")
// public R<Void> removeAttach(@NotEmpty(message = "主键不能为空") @PathVariable String docId) {
// attachService.removeKnowledgeAttach(docId);
// return R.ok();
// }
//
//
// /**
// * 查询知识片段
// */
// @GetMapping("/fragment/list/{docId}")
// public TableDataInfo<KnowledgeFragmentVo> fragmentList(KnowledgeFragmentBo bo, PageQuery pageQuery, @PathVariable String docId) {
// bo.setDocId(docId);
// return fragmentService.queryPageList(bo, pageQuery);
// }
//
//}

View File

@@ -1,81 +1,81 @@
package org.ruoyi.system.controller.system;
import cn.dev33.satoken.annotation.SaIgnore;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.ruoyi.common.core.exception.ServiceException;
import org.ruoyi.common.wechat.itchat4j.api.WechatTools;
import org.ruoyi.common.wechat.itchat4j.controller.LoginController;
import org.ruoyi.common.wechat.itchat4j.core.MsgCenter;
import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
import org.ruoyi.common.wechat.web.base.BaseException;
import org.ruoyi.system.domain.bo.WxRobConfigBo;
import org.ruoyi.system.domain.vo.WxRobConfigVo;
import org.ruoyi.system.handler.MyMsgHandler;
import org.ruoyi.system.service.ISseService;
import org.ruoyi.system.service.IWxRobConfigService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 个人微信扩展控制器
*
* @author WangLe
*/
@SaIgnore
@Slf4j
@Validated
@RequiredArgsConstructor
@RestController
public class WeChatController {
private final ISseService sseService;
private final IWxRobConfigService wxRobConfigService;
/**
* 登录第一步,获取二维码链接
* @throws BaseException
*/
@PostMapping("/getQr")
public String getQr(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
try {
return login.login_1();
} catch (BaseException e) {
throw new ServiceException("获取二维码失败:"+ e.getMessage());
}
}
@PostMapping("/wxLogin")
public Boolean wxLogin(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
return login.login_2();
}
@PostMapping("/wxInit")
public Boolean wxInit(@RequestParam String uniqueKey) {
LoginController login = new LoginController(uniqueKey);
// 开启消息处理线程
WxRobConfigBo wxRobConfigBo = new WxRobConfigBo();
wxRobConfigBo.setUniqueKey(uniqueKey);
List<WxRobConfigVo> wxRobConfigVos = wxRobConfigService.queryList(wxRobConfigBo);
//查询机器人对应的用户
start(uniqueKey,new MyMsgHandler(uniqueKey,sseService,wxRobConfigVos.get(0)));
return login.login_3();
}
@PostMapping("/wxLogout")
public void wxLogout(@RequestParam String uniqueKey) {
WechatTools.logout(uniqueKey);
}
public void start(String uniqueKey,IMsgHandlerFace msgHandler) {
log.info("7.+++开启消息处理线程["+uniqueKey+"]+++");
new Thread(() -> MsgCenter.handleMsg(uniqueKey,msgHandler)).start();
}
}
//package org.ruoyi.system.controller.system;
//
//import cn.dev33.satoken.annotation.SaIgnore;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.ruoyi.common.core.exception.ServiceException;
//import org.ruoyi.common.wechat.itchat4j.api.WechatTools;
//import org.ruoyi.common.wechat.itchat4j.controller.LoginController;
//import org.ruoyi.common.wechat.itchat4j.core.MsgCenter;
//import org.ruoyi.common.wechat.itchat4j.face.IMsgHandlerFace;
//import org.ruoyi.common.wechat.web.base.BaseException;
//import org.ruoyi.system.domain.bo.WxRobConfigBo;
//import org.ruoyi.system.domain.vo.WxRobConfigVo;
//import org.ruoyi.system.handler.MyMsgHandler;
//import org.ruoyi.system.service.ISseService;
//import org.ruoyi.system.service.IWxRobConfigService;
//import org.springframework.validation.annotation.Validated;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestParam;
//import org.springframework.web.bind.annotation.RestController;
//
//import java.util.List;
//
///**
// * 个人微信扩展控制器
// *
// * @author WangLe
// */
//@SaIgnore
//@Slf4j
//@Validated
//@RequiredArgsConstructor
//@RestController
//public class WeChatController {
//
// private final ISseService sseService;
//
// private final IWxRobConfigService wxRobConfigService;
//
// /**
// * 登录第一步,获取二维码链接
// * @throws BaseException
// */
// @PostMapping("/getQr")
// public String getQr(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// try {
// return login.login_1();
// } catch (BaseException e) {
// throw new ServiceException("获取二维码失败:"+ e.getMessage());
// }
// }
//
// @PostMapping("/wxLogin")
// public Boolean wxLogin(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// return login.login_2();
// }
//
// @PostMapping("/wxInit")
// public Boolean wxInit(@RequestParam String uniqueKey) {
// LoginController login = new LoginController(uniqueKey);
// // 开启消息处理线程
// WxRobConfigBo wxRobConfigBo = new WxRobConfigBo();
// wxRobConfigBo.setUniqueKey(uniqueKey);
// List<WxRobConfigVo> wxRobConfigVos = wxRobConfigService.queryList(wxRobConfigBo);
// //查询机器人对应的用户
// start(uniqueKey,new MyMsgHandler(uniqueKey,sseService,wxRobConfigVos.get(0)));
// return login.login_3();
// }
//
// @PostMapping("/wxLogout")
// public void wxLogout(@RequestParam String uniqueKey) {
// WechatTools.logout(uniqueKey);
// }
//
// public void start(String uniqueKey,IMsgHandlerFace msgHandler) {
// log.info("7.+++开启消息处理线程["+uniqueKey+"]+++");
// new Thread(() -> MsgCenter.handleMsg(uniqueKey,msgHandler)).start();
// }
//}

View File

@@ -1,58 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 应用市场
*
* @author Lion Li
* @date 2024-03-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_app_store")
public class ChatAppStore extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 头像
*/
private String avatar;
/**
* 应用地址
*/
private String appUrl;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,72 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.common.tenant.core.TenantEntity;
import java.io.Serial;
/**
* 对话配置信息对象 chat_config
*
* @author Lion Li
* @date 2024-04-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_config")
public class ChatConfig extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 配置类型
*/
private String category;
/**
* 配置名称
*/
private String configName;
/**
* 配置值
*/
@Sensitive(strategy = SensitiveStrategy.SKY)
private String configValue;
/**
* 说明
*/
private String configDict;
/**
* 备注
*/
private String remark;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
/**
* 更新IP
*/
private String updateIp;
}

View File

@@ -1,111 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
/**
* gpts管理对象 chat_gpts
*
* @author Lion Li
* @date 2024-07-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_gpts")
public class ChatGpts extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* gpts应用id
*/
private String gid;
/**
* gpts应用名称
*/
private String name;
/**
* gpts图标
*/
private String logo;
/**
* gpts描述
*/
private String info;
/**
* 作者id
*/
private String authorId;
/**
* 作者名称
*/
private String authorName;
/**
* 点赞
*/
private String useCnt;
/**
* 差评
*/
private String bad;
/**
* 类型
*/
private String type;
/**
* 备注
*/
private String remark;
/**
* 版本
*/
@Version
private Long version;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
/**
* 更新IP
*/
private String updateIp;
/**
* 模型名称
*/
private String modelName;
/**
* 模型system
*/
private String systemPrompt;
}

View File

@@ -1,76 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
/**
* 聊天消息对象 chat_message
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_message")
public class ChatMessage extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
@NotBlank(message = "用户ID", groups = { AddGroup.class, EditGroup.class })
private Long UserId;
/**
* 对话角色
*/
private String role;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String content;
/**
* 扣除费用
*/
private Double deductCost;
/**
* 累计 Tokens
*/
@NotNull(message = "累计 Tokens不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer totalTokens;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelName;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

View File

@@ -1,46 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
/**
* 插件管理对象 chat_plugin
*
* @author ageerle
* @date 2025-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_plugin")
public class ChatPlugin extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 插件名称
*/
private String name;
/**
* 插件编码
*/
private String code;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,49 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户token使用记录
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
@TableName("chat_usage_token")
public class ChatToken implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
@NotBlank(message = "用户ID", groups = { AddGroup.class, EditGroup.class })
private Long UserId;
/**
* 待结算token
*/
private Integer token;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelName;
}

View File

@@ -1,73 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import java.io.Serial;
import java.io.Serializable;
/**
* 访客管理对象 chat_visitor_usage
*
* @author Lion Li
* @date 2024-07-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_visitor_usage")
public class ChatVisitorUsage extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@TableId(value = "id")
private Long id;
/**
* 浏览器指纹
*/
private String fingerprint;
/**
* 使用次数
*/
private String usageCount;
/**
* ip地址
*/
private String ipAddress;
/**
* 备注
*/
private String remark;
/**
* 版本
*/
@Version
private Long version;
/**
* 删除标志0代表存在 1代表删除
*/
@TableLogic
private String delFlag;
/**
* 更新IP
*/
private String updateIp;
}

View File

@@ -1,67 +0,0 @@
package org.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.*;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.io.Serial;
/**
* 用户兑换记录对象 chat_voucher
*
* @author Lion Li
* @date 2024-05-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("chat_voucher")
public class ChatVoucher extends BaseEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 兑换码
*/
private String code;
/**
* 兑换金额
*/
private BigDecimal amount;
/**
* 兑换状态
*/
private String status;
/**
* 兑换前余额
*/
private BigDecimal balanceBefore;
/**
* 兑换后余额
*/
private BigDecimal balanceAfter;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,59 +0,0 @@
package org.ruoyi.system.domain.bo;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatAppStore;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 应用市场业务对象 voice_role
*
* @author Lion Li
* @date 2024-03-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatAppStore.class, reverseConvertGenerate = false)
public class ChatAppStoreBo extends BaseEntity {
/**
* id
*/
@NotNull(message = "id不能为空")
private Long id;
/**
* 角色名称
*/
@NotBlank(message = "名称不能为空")
private String name;
/**
* 角色描述
*/
@NotBlank(message = "描述不能为空")
private String description;
/**
* 头像
*/
@NotBlank(message = "头像不能为空")
private String avatar;
/**
* 音频地址
*/
@NotBlank(message = "应用地址不能为空")
private String appUrl;
/**
* 备注
*/
@NotBlank(message = "备注不能为空")
private String remark;
}

View File

@@ -1,71 +0,0 @@
package org.ruoyi.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.system.domain.ChatConfig;
/**
* 对话配置信息
业务对象 chat_config
*
* @author Lion Li
* @date 2024-04-13
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatConfig.class, reverseConvertGenerate = false)
public class ChatConfigBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 配置类型
*/
@NotBlank(message = "配置类型不能为空", groups = { AddGroup.class, EditGroup.class })
private String category;
/**
* 配置名称
*/
@NotBlank(message = "配置名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String configName;
/**
* 配置值
*/
@Sensitive(strategy = SensitiveStrategy.SKY)
@NotBlank(message = "配置值不能为空", groups = { AddGroup.class, EditGroup.class })
private String configValue;
/**
* 说明
*/
@NotBlank(message = "参数说明不能为空", groups = { AddGroup.class, EditGroup.class })
private String configDict;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 更新IP
*/
@NotBlank(message = "更新IP不能为空", groups = { AddGroup.class, EditGroup.class })
private String updateIp;
}

View File

@@ -1,97 +0,0 @@
package org.ruoyi.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatGpts;
/**
* gpts管理业务对象 chat_gpts
*
* @author Lion Li
* @date 2024-07-09
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatGpts.class, reverseConvertGenerate = false)
public class ChatGptsBo extends BaseEntity {
/**
* id
*/
@NotNull(message = "id不能为空", groups = { EditGroup.class })
private Long id;
/**
* gpts应用id
*/
@NotBlank(message = "gpts应用id不能为空", groups = { AddGroup.class, EditGroup.class })
private String gid;
/**
* gpts应用名称
*/
@NotBlank(message = "gpts应用名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* gpts图标
*/
private String logo;
/**
* gpts描述
*/
private String info;
/**
* 作者id
*/
private String authorId;
/**
* 作者名称
*/
private String authorName;
/**
* 点赞
*/
private String useCnt;
/**
* 差评
*/
private String bad;
/**
* 类型
*/
private String type;
/**
* 备注
*/
private String remark;
/**
* 更新IP
*/
private String updateIp;
/**
* 模型名称
*/
private String modelName;
/**
* 模型system
*/
private String systemPrompt;
}

View File

@@ -1,71 +0,0 @@
package org.ruoyi.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatMessage;
/**
* 聊天消息业务对象 chat_message
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatMessage.class, reverseConvertGenerate = false)
public class ChatMessageBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
private Long userId;
/**
* 用户名称
*/
private String userName;
/**
* 对话角色
*/
private String role;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String content;
/**
* 扣除费用
*/
private Double deductCost;
/**
* 累计 Tokens
*/
private Integer totalTokens;
/**
* 模型名称
*/
private String modelName;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,48 +0,0 @@
package org.ruoyi.system.domain.bo;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
/**
* 插件管理业务对象 chat_plugin
*
* @author ageerle
* @date 2025-03-30
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatPlugin.class, reverseConvertGenerate = false)
public class ChatPluginBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 插件名称
*/
@NotBlank(message = "插件名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 插件编码
*/
@NotBlank(message = "插件编码不能为空", groups = { AddGroup.class, EditGroup.class })
private String code;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
}

View File

@@ -1,61 +0,0 @@
package org.ruoyi.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatVisitorUsage;
/**
* 访客管理业务对象 chat_visitor_usage
*
* @author Lion Li
* @date 2024-07-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatVisitorUsage.class, reverseConvertGenerate = false)
public class ChatVisitorUsageBo extends BaseEntity {
/**
* id
*/
@NotNull(message = "id不能为空", groups = { EditGroup.class })
private Long id;
/**
* 浏览器指纹
*/
@NotBlank(message = "浏览器指纹不能为空", groups = { AddGroup.class, EditGroup.class })
private String fingerprint;
/**
* 使用次数
*/
@NotBlank(message = "使用次数不能为空", groups = { AddGroup.class, EditGroup.class })
private String usageCount;
/**
* ip地址
*/
@NotBlank(message = "ip地址不能为空", groups = { AddGroup.class, EditGroup.class })
private String ipAddress;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 更新IP
*/
@NotBlank(message = "更新IP不能为空", groups = { AddGroup.class, EditGroup.class })
private String updateIp;
}

View File

@@ -1,68 +0,0 @@
package org.ruoyi.system.domain.bo;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.common.mybatis.core.domain.BaseEntity;
import org.ruoyi.system.domain.ChatVoucher;
import java.math.BigDecimal;
/**
* 用户兑换记录业务对象 chat_voucher
*
* @author Lion Li
* @date 2024-05-03
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = ChatVoucher.class, reverseConvertGenerate = false)
public class ChatVoucherBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户id
*/
private Long userId;
/**
* 兑换码
*/
private String code;
/**
* 兑换金额
*/
@NotNull(message = "兑换金额不能为空", groups = { AddGroup.class, EditGroup.class })
private BigDecimal amount;
/**
* 兑换状态
*/
private String status;
/**
* 兑换前余额
*/
private Double balanceBefore;
/**
* 兑换后余额
*/
private Double balanceAfter;
/**
* 备注
*/
private String remark;
}

View File

@@ -1,65 +0,0 @@
package org.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.system.domain.ChatAppStore;
import java.io.Serial;
import java.io.Serializable;
/**
* 应用市场视图对象
*
* @author Lion Li
* @date 2024-03-19
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatAppStore.class)
public class ChatAppStoreVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 角色名称
*/
@ExcelProperty(value = "名称")
private String name;
/**
* 角色描述
*/
@ExcelProperty(value = "描述")
private String description;
/**
* 头像
*/
@ExcelProperty(value = "头像")
private String avatar;
/**
* 音频地址
*/
@ExcelProperty(value = "应用地址")
private String appUrl;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -1,75 +0,0 @@
package org.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.common.sensitive.annotation.Sensitive;
import org.ruoyi.common.sensitive.core.SensitiveStrategy;
import org.ruoyi.system.domain.ChatConfig;
import java.io.Serial;
import java.io.Serializable;
/**
* 对话配置信息
视图对象 chat_config
*
* @author Lion Li
* @date 2024-04-13
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatConfig.class)
public class ChatConfigVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 配置类型
*/
@ExcelProperty(value = "配置类型")
private String category;
/**
* 配置名称
*/
@ExcelProperty(value = "配置名称")
private String configName;
/**
* 配置值
*/
@ExcelProperty(value = "配置值")
@Sensitive(strategy = SensitiveStrategy.SKY)
private String configValue;
/**
* 说明
*/
@ExcelProperty(value = "说明")
private String configDict;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 更新IP
*/
@ExcelProperty(value = "更新IP")
private String updateIp;
}

View File

@@ -1,111 +0,0 @@
package org.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.ruoyi.system.domain.ChatGpts;
import java.io.Serial;
import java.io.Serializable;
/**
* gpts管理视图对象 chat_gpts
*
* @author Lion Li
* @date 2024-07-09
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatGpts.class)
public class ChatGptsVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* gpts应用id
*/
@ExcelProperty(value = "gpts应用id")
private String gid;
/**
* gpts应用名称
*/
@ExcelProperty(value = "gpts应用名称")
private String name;
/**
* gpts图标
*/
@ExcelProperty(value = "gpts图标")
private String logo;
/**
* gpts描述
*/
@ExcelProperty(value = "gpts描述")
private String info;
/**
* 作者id
*/
@ExcelProperty(value = "作者id")
private String authorId;
/**
* 作者名称
*/
@ExcelProperty(value = "作者名称")
private String authorName;
/**
* 点赞
*/
@ExcelProperty(value = "点赞")
private String useCnt;
/**
* 差评
*/
@ExcelProperty(value = "差评")
private String bad;
/**
* 类型
*/
@ExcelProperty(value = "类型")
private String type;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 更新IP
*/
@ExcelProperty(value = "更新IP")
private String updateIp;
/**
* 模型名称
*/
@ExcelProperty(value = "模型名称")
private String modelName;
/**
* 模型system
*/
private String systemPrompt;
}

View File

@@ -1,90 +0,0 @@
package org.ruoyi.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import org.ruoyi.system.domain.ChatMessage;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 聊天消息视图对象 chat_message
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatMessage.class)
public class ChatMessageVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
@NotBlank(message = "用户ID", groups = { AddGroup.class, EditGroup.class })
private Long userId;
/**
* 用户名称
*/
@NotBlank(message = "用户名称")
private String userName;
/**
* 对话角色
*/
private String role;
/**
* 消息内容
*/
@NotBlank(message = "消息内容不能为空", groups = { AddGroup.class, EditGroup.class })
private String content;
/**
* 扣除费用
*/
private Double deductCost;
/**
* 累计 Tokens
*/
@NotNull(message = "累计 Tokens不能为空", groups = { AddGroup.class, EditGroup.class })
private Integer totalTokens;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelName;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -1,55 +0,0 @@
package org.ruoyi.system.domain.vo;
import org.ruoyi.system.domain.ChatPlugin;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 插件管理视图对象 chat_plugin
*
* @author ageerle
* @date 2025-03-30
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatPlugin.class)
public class ChatPluginVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 插件名称
*/
@ExcelProperty(value = "插件名称")
private String name;
/**
* 插件编码
*/
@ExcelProperty(value = "插件编码")
private String code;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -1,43 +0,0 @@
package org.ruoyi.system.domain.vo;
import org.ruoyi.common.core.validate.AddGroup;
import org.ruoyi.common.core.validate.EditGroup;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serializable;
/**
* 用户token chat_token
*
* @author Lion Li
* @date 2023-11-26
*/
@Data
public class ChatTokenVo implements Serializable {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = { EditGroup.class })
private Long id;
/**
* 用户ID
*/
@NotBlank(message = "用户ID", groups = { AddGroup.class, EditGroup.class })
private Long UserId;
/**
* 待结算token
*/
private Integer token;
/**
* 模型名称
*/
@NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String modelName;
}

View File

@@ -1,64 +0,0 @@
package org.ruoyi.system.domain.vo;
import org.ruoyi.system.domain.ChatVisitorUsage;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 访客管理视图对象 chat_visitor_usage
*
* @author Lion Li
* @date 2024-07-14
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatVisitorUsage.class)
public class ChatVisitorUsageVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* id
*/
@ExcelProperty(value = "id")
private Long id;
/**
* 浏览器指纹
*/
@ExcelProperty(value = "浏览器指纹")
private String fingerprint;
/**
* 使用次数
*/
@ExcelProperty(value = "使用次数")
private String usageCount;
/**
* ip地址
*/
@ExcelProperty(value = "ip地址")
private String ipAddress;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 更新IP
*/
@ExcelProperty(value = "更新IP")
private String updateIp;
}

View File

@@ -1,87 +0,0 @@
package org.ruoyi.system.domain.vo;
import org.ruoyi.system.domain.ChatVoucher;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 用户兑换记录视图对象 chat_voucher
*
* @author Lion Li
* @date 2024-05-03
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = ChatVoucher.class)
public class ChatVoucherVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 用户名称
*/
@ExcelProperty(value = "用户名称")
private String userName;
/**
* 兑换码
*/
@ExcelProperty(value = "兑换码")
private String code;
/**
* 兑换金额
*/
@ExcelProperty(value = "兑换金额")
private Double amount;
/**
* 兑换状态
*/
@ExcelProperty(value = "兑换状态")
private String status;
/**
* 兑换前余额
*/
@ExcelProperty(value = "兑换前余额")
private Double balanceBefore;
/**
* 兑换后余额
*/
@ExcelProperty(value = "兑换后余额")
private Double balanceAfter;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
@ExcelProperty(value = "创建时间")
private String createTime;
}

View File

@@ -19,7 +19,7 @@ import java.util.Map;
@RequiredArgsConstructor
public class MsgHandler extends AbstractHandler {
private final ISseService sseService;
// private final ISseService sseService;
@@ -34,8 +34,10 @@ public class MsgHandler extends AbstractHandler {
if (!msgType.equals(WxConsts.XmlMsgType.EVENT)) {
//TODO 可以选择将消息保存到本地
}
//TODO 组装回复消息
String content = sseService.wxCpChat(wxMessage.getContent());
String content = "";
//sseService.wxCpChat(wxMessage.getContent());
return new TextBuilder().build(content, wxMessage, cpService);

View File

@@ -15,11 +15,8 @@ import org.ruoyi.common.chat.entity.chat.ChatCompletionResponse;
import org.ruoyi.common.chat.utils.TikTokensUtil;
import org.ruoyi.common.core.utils.SpringUtils;
import org.ruoyi.common.core.utils.StringUtils;
import org.ruoyi.system.domain.bo.ChatMessageBo;
import org.ruoyi.system.domain.bo.SysModelBo;
import org.ruoyi.system.domain.vo.SysModelVo;
import org.ruoyi.system.service.IChatCostService;
import org.ruoyi.system.service.IChatMessageService;
import org.ruoyi.system.service.ISysModelService;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.factory.annotation.Autowired;

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatAppStore;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
/**
* 应用市场Mapper接口

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatConfig;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatGpts;
import org.ruoyi.system.domain.vo.ChatGptsVo;
/**
* gpts管理Mapper接口

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatMessage;
import org.ruoyi.system.domain.vo.ChatMessageVo;
/**

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatPlugin;
import org.ruoyi.system.domain.vo.ChatPluginVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatToken;
import org.ruoyi.system.domain.vo.ChatTokenVo;
/**

View File

@@ -1,7 +1,5 @@
package org.ruoyi.system.mapper;
import org.ruoyi.system.domain.ChatVisitorUsage;
import org.ruoyi.system.domain.vo.ChatVisitorUsageVo;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
/**

View File

@@ -1,8 +1,6 @@
package org.ruoyi.system.mapper;
import org.ruoyi.common.mybatis.core.mapper.BaseMapperPlus;
import org.ruoyi.system.domain.ChatVoucher;
import org.ruoyi.system.domain.vo.ChatVoucherVo;
/**
* 用户兑换记录Mapper接口

View File

@@ -1,71 +0,0 @@
package org.ruoyi.system.service;
import org.ruoyi.system.domain.vo.ChatAppStoreVo;
import org.ruoyi.system.domain.bo.ChatAppStoreBo;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.system.request.RoleListDto;
import org.ruoyi.system.request.RoleRequest;
import org.ruoyi.system.request.SimpleGenerateRequest;
import org.ruoyi.system.response.SimpleGenerateDataResponse;
import org.ruoyi.system.response.rolelist.ChatAppStoreVO;
import java.util.Collection;
import java.util.List;
/**
* 应用市场Service接口
*
* @author Lion Li
* @date 2024-03-19
*/
public interface IChatAppStoreService {
/**
* 查询应用市场
*/
ChatAppStoreVo queryById(Long id);
/**
* 查询应用市场列表
*/
TableDataInfo<ChatAppStoreVo> queryPageList(ChatAppStoreBo bo, PageQuery pageQuery);
/**
* 查询应用市场列表
*/
List<ChatAppStoreVo> queryList(ChatAppStoreBo bo);
/**
* 新增应用市场
*/
Boolean insertByBo(RoleRequest roleRequest);
/**
* 生成音频
*/
SimpleGenerateDataResponse simpleGenerate(SimpleGenerateRequest simpleGenerateRequest);
/**
* 修改应用市场
*/
Boolean updateByBo(ChatAppStoreBo bo);
/**
* 校验并批量删除应用市场信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 查询市场角色
*
* @return 角色列表
*/
List<ChatAppStoreVO> roleList();
/**
* 收藏市场角色
*
*/
void copyRole(RoleListDto roleListDto);
}

View File

@@ -1,53 +0,0 @@
package org.ruoyi.system.service;
import org.ruoyi.common.mybatis.core.page.PageQuery;
import org.ruoyi.common.mybatis.core.page.TableDataInfo;
import org.ruoyi.system.domain.bo.ChatConfigBo;
import org.ruoyi.system.domain.vo.ChatConfigVo;
import java.util.Collection;
import java.util.List;
/**
* 对话配置信息Service接口
* @date 2024-04-13
*/
public interface IChatConfigService {
/**
* 查询配置信息
*/
ChatConfigVo queryById(Long id);
/**
* 查询配置信息列表
*/
TableDataInfo<ChatConfigVo> queryPageList(ChatConfigBo bo, PageQuery pageQuery);
/**
* 查询配置信息列表
*/
List<ChatConfigVo> queryList(ChatConfigBo bo);
/**
* 新增配置信息
*/
Boolean insertByBo(ChatConfigBo bo);
/**
* 修改配置信息
*/
Boolean updateByBo(ChatConfigBo bo);
/**
* 校验并批量删除配置信息信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 查询系统参数
*/
List<ChatConfigVo> getSysConfigValue(String category);
}

Some files were not shown because too many files have changed in this diff Show More