diff --git a/web-api/.gitignore b/web-api/.gitignore index ed8368a..816ede8 100644 --- a/web-api/.gitignore +++ b/web-api/.gitignore @@ -4,7 +4,7 @@ .gradle /build/ !gradle/wrapper/gradle-wrapper.jar - +*.sql target/ !.mvn/wrapper/maven-wrapper.jar diff --git a/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/AiManagerApiController.java b/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/AiManagerApiController.java index f698f9f..481372e 100644 --- a/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/AiManagerApiController.java +++ b/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/AiManagerApiController.java @@ -51,6 +51,9 @@ public class AiManagerApiController extends BaseController { @Anonymous public AjaxResult selectInfo(String aiType) { AiManager aiManager = aiManagerService.selectAiManagerByType(aiType); + if (aiManager == null) { + return AjaxResult.error("该功能未配置或已停用"); + } aiManager.setPrompt(null); return AjaxResult.success(aiManager); } diff --git a/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/ByteApiController.java b/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/ByteApiController.java index eb69649..3895f19 100644 --- a/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/ByteApiController.java +++ b/web-api/ruoyi-admin/src/main/java/com/ruoyi/api/ByteApiController.java @@ -10,10 +10,10 @@ import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.model.LoginAiUser; -import com.ruoyi.common.utils.AwsS3Util; import com.ruoyi.common.utils.RandomStringUtil; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.TencentCosUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; @@ -36,13 +36,21 @@ import java.util.regex.Pattern; public class ByteApiController extends BaseController { private final IByteService byteService; - private final AwsS3Util awsS3Util; + private final TencentCosUtil tencentCosUtil; private final IAiOrderService aiOrderService; private final IAiManagerService managerService; private final IAiTagService aiTagService; @Value("${byteapi.callBackUrl}") private String url; + // 火山引擎配置 + @Value("${volcengine.ark.apiKey}") + private String volcApiKey; + @Value("${volcengine.ark.baseUrl}") + private String volcBaseUrl; + @Value("${volcengine.ark.callbackUrl}") + private String volcCallbackUrl; + @PostMapping("/promptToImg") @ApiOperation("文生图") public AjaxResult promptToImg(@RequestBody ByteApiRequest request) { @@ -51,9 +59,12 @@ public class ByteApiController extends BaseController { return AjaxResult.error("functionType is null"); } + String mode = request.getMode() != null ? request.getMode() : "image-to-video"; AiManager aiManager = managerService.selectAiManagerByType(functionType); String tags = request.getTags(); - String text = ""; + String text = request.getText(); + + // 如果使用标签系统生成prompt if (StringUtils.isNotEmpty(tags)) { List aiTags = aiTagService.selectAiTagListByIds(request.getTags(), aiManager.getParentIdSort()); List tagPrompts = new ArrayList<>(); @@ -70,22 +81,24 @@ public class ByteApiController extends BaseController { tagPrompts.add(p); } text = StringUtils.replacePlaceholders(aiManager.getPrompt(), tagPrompts); - } else { - text = aiManager.getPrompt(); } + if (StringUtils.isEmpty(text)) { return AjaxResult.error("text is null"); } - AiOrder aiOrder = aiOrderService.getAiOrder(functionType); try { if (aiOrder == null) { return AjaxResult.error(-1, "You have a low balance, please recharge"); } aiOrder.setText(text); + aiOrder.setMode(mode); // 记录生成模式 + ByteBodyReq byteBodyReq = new ByteBodyReq(); - byteBodyReq.setModel("ep-20251104104536-2gpgz"); + // model由前端传入,默认为Seedance 2.0 + byteBodyReq.setModel(StringUtils.isNotEmpty(request.getModel()) ? + request.getModel() : "ep-20260326165811-dlkth"); byteBodyReq.setPrompt(text); byteBodyReq.setSequential_image_generation("disabled"); byteBodyReq.setResponse_format("url"); @@ -96,7 +109,7 @@ public class ByteApiController extends BaseController { List data = byteBodyRes.getData(); ByteDataRes byteDataRes = data.get(0); String url = byteDataRes.getUrl(); - url = awsS3Util.uploadFileByUrl(url); + url = tencentCosUtil.uploadFileByUrl(url); if (url == null) { // 判断生成失败,退回金额逻辑 aiOrderService.orderFailure(aiOrder); @@ -175,7 +188,7 @@ public class ByteApiController extends BaseController { List data = byteBodyRes.getData(); ByteDataRes byteDataRes = data.get(0); String url = byteDataRes.getUrl(); - url = awsS3Util.uploadFileByUrl(url); + url = tencentCosUtil.uploadFileByUrl(url); if (url == null) { // 判断生成失败,退回金额逻辑 aiOrderService.orderFailure(aiOrder); @@ -191,7 +204,7 @@ public class ByteApiController extends BaseController { } @PostMapping("/imgToVideo") - @ApiOperation("图生视频") + @ApiOperation("图生视频 (Seedance 2.0)") public AjaxResult imgToVideo(@RequestBody ByteApiRequest request) throws Exception { String functionType = request.getFunctionType(); if (null == functionType) { @@ -235,51 +248,56 @@ public class ByteApiController extends BaseController { return AjaxResult.error(-1, "You have a low balance, please recharge"); } try { -// String text = request.getText(); -// if (StringUtils.isBlank(text)) { -// return AjaxResult.error("text is null"); -// } -// String tags = request.getTags(); -// if (StringUtils.isNotBlank(tags)) { -// text = "(优先考虑以下关键词:" + tags + ")"; -// } aiOrder.setText(text); - aiOrder.setImg1(firstUrl.toString()); - Integer duration = request.getDuration(); + + Integer duration = request.getDuration() != null ? request.getDuration() : 4; + ByteBodyReq byteBodyReq = new ByteBodyReq(); - byteBodyReq.setModel("ep-20251113072240-cfxlz"); - byteBodyReq.setCallback_url(url + "/api/ai/callBack"); - List content = new ArrayList<>(); - ContentItem contentItem = new ContentItem(); - contentItem.setType("text"); - contentItem.setText(text + " --dur " + duration + " --fps 24 --rs 720p --wm false --cf false"); - content.add(contentItem); + // model由前端传入,默认为Seedance2.0 + byteBodyReq.setModel(StringUtils.isNotEmpty(request.getModel()) ? + request.getModel() : "ep-20260326165811-dlkth"); + byteBodyReq.setCallback_url(volcCallbackUrl); - ContentItem contentItem1 = new ContentItem(); - contentItem1.setType("image_url"); - contentItem1.setRole("first_frame"); - ImageUrl imageUrl1 = new ImageUrl(); - imageUrl1.setUrl(firstUrl.toString()); - contentItem1.setImageUrl(imageUrl1); - content.add(contentItem1); + // 构建符合火山引擎格式的content + List contentList = new ArrayList<>(); + + // 文本提示词 + ContentItem textItem = new ContentItem(); + textItem.setType("text"); + textItem.setText(text); + contentList.add(textItem); + // 首帧图片 + ContentItem firstFrameItem = new ContentItem(); + firstFrameItem.setType("image_url"); + firstFrameItem.setRole("first_frame"); + ImageUrl firstImageUrl = new ImageUrl(); + firstImageUrl.setUrl(firstUrl.toString()); + firstFrameItem.setImageUrl(firstImageUrl); + contentList.add(firstFrameItem); + + // 如果有尾帧 String lastUrl = request.getLastUrl(); if (StringUtils.isNotBlank(lastUrl)) { - ContentItem contentItem2 = new ContentItem(); - contentItem2.setType("image_url"); - contentItem2.setRole("last_frame"); - ImageUrl imageUrl2 = new ImageUrl(); - imageUrl2.setUrl(lastUrl); - contentItem2.setImageUrl(imageUrl2); - content.add(contentItem2); + ContentItem lastFrameItem = new ContentItem(); + lastFrameItem.setType("image_url"); + lastFrameItem.setRole("last_frame"); + ImageUrl lastImageUrl = new ImageUrl(); + lastImageUrl.setUrl(lastUrl); + lastFrameItem.setImageUrl(lastImageUrl); + contentList.add(lastFrameItem); aiOrder.setImg2(lastUrl); } - byteBodyReq.setContent(content); + + byteBodyReq.setContent(contentList); + byteBodyReq.setDuration(duration); + byteBodyReq.setResolution("720p"); + byteBodyReq.setRatio("3:4"); + ByteBodyRes byteBodyRes = byteService.imgToVideo(byteBodyReq); String id = byteBodyRes.getId(); if (id == null) { - // 判断生成失败,退回金额逻辑 aiOrderService.orderFailure(aiOrder); return AjaxResult.error(-2, "generation failed, balance has been refunded"); } @@ -299,7 +317,7 @@ public class ByteApiController extends BaseController { if ("succeeded".equals(byteBodyRes.getStatus())) { content content = byteBodyRes.getContent(); String videoUrl = content.getVideo_url(); - videoUrl = awsS3Util.uploadFileByUrl(videoUrl); + videoUrl = tencentCosUtil.uploadFileByUrl(videoUrl); content.setVideo_url(videoUrl); AiOrder aiOrderByResult = aiOrderService.getAiOrderByResult(id); AiOrder aiOrder = new AiOrder(); @@ -311,24 +329,34 @@ public class ByteApiController extends BaseController { return AjaxResult.success(byteBodyRes); } - @GetMapping(value = "/callBack") - @ApiOperation("视频下载回调") + @GetMapping(value = "/volcCallback") + @ApiOperation("火山引擎视频回调") @Anonymous - public AjaxResult callBack(@PathVariable("id") ByteBodyRes byteBodyRes) throws Exception { + public AjaxResult volcCallback(@RequestBody ByteBodyRes byteBodyRes) throws Exception { if ("succeeded".equals(byteBodyRes.getStatus())) { String id = byteBodyRes.getId(); - content content = byteBodyRes.getContent(); - String videoUrl = content.getVideo_url(); - videoUrl = awsS3Util.uploadFileByUrl(videoUrl); - content.setVideo_url(videoUrl); - AiOrder aiOrderByResult = aiOrderService.getAiOrderByResult(id); - AiOrder aiOrder = new AiOrder(); - aiOrder.setId(aiOrderByResult.getId()); - aiOrder.setResult(videoUrl); -// aiOrder.setUpdateBy(SecurityUtils.getLoginAiUser().getUsername()); - aiOrderService.updateAiOrder(aiOrder); + content contentObj = byteBodyRes.getContent(); + if (contentObj != null && StringUtils.isNotEmpty(contentObj.getVideo_url())) { + String videoUrl = contentObj.getVideo_url(); + videoUrl = tencentCosUtil.uploadFileByUrl(videoUrl); + contentObj.setVideo_url(videoUrl); + + AiOrder aiOrderByResult = aiOrderService.getAiOrderByResult(id); + if (aiOrderByResult != null) { + AiOrder aiOrder = new AiOrder(); + aiOrder.setId(aiOrderByResult.getId()); + aiOrder.setResult(videoUrl); + aiOrderService.updateAiOrder(aiOrder); + } + } } - return AjaxResult.success(byteBodyRes); + return AjaxResult.success("callback success"); + } + + @PostMapping(value = "/{id}/cancel") + @ApiOperation("取消视频生成任务") + public AjaxResult cancelTask(@PathVariable("id") String id) throws Exception { + return byteService.cancelVideoTask(id); } } diff --git a/web-api/ruoyi-admin/src/main/resources/application.yml b/web-api/ruoyi-admin/src/main/resources/application.yml index 70e9966..682f0d1 100644 --- a/web-api/ruoyi-admin/src/main/resources/application.yml +++ b/web-api/ruoyi-admin/src/main/resources/application.yml @@ -47,12 +47,16 @@ user: # Spring配置 spring: - # 邮件发送配置 + # 邮件发送配置 mail: - host: smtp.qq.com # QQ邮箱SMTP服务器(163邮箱:smtp.163.com;Gmail:smtp.gmail.com) + # host: mailcow-self.undressing.name # QQ邮箱SMTP服务器(163邮箱:smtp.163.com;Gmail:smtp.gmail.com) + # port: 465 # SMTP端口(SSL加密端口:465,非加密:587,优先用587) + # username: undressing@mail.undressing.name # 你的邮箱地址 + # password: aRtHEN39 # 邮箱授权码(不是登录密码!) + host: smtpdm-ap-southeast-1.aliyun.com # QQ邮箱SMTP服务器(163邮箱:smtp.163.com;Gmail:smtp.gmail.com) port: 465 # SMTP端口(SSL加密端口:465,非加密:587,优先用587) - username: # 你的邮箱地址 - password: # 邮箱授权码(不是登录密码!) + username: undressing@undressing.name # 你的邮箱地址 + password: 1284GOvkho # 邮箱授权码(不是登录密码!) default-encoding: UTF-8 # 编码格式 protocol: smtp # SSL/TLS配置(可选,根据邮箱要求) @@ -89,15 +93,17 @@ spring: # redis 配置 redis: # 地址 - host: localhost + host: master.redis.chguac.apse1.cache.amazonaws.com # 端口,默认为6379 port: 6379 # 数据库索引 database: 2 # 密码 - password: + user: root + password: mkMReisAKl6I7rVqEY90 # 连接超时时间 timeout: 10s + ssl: true lettuce: pool: # 连接池中的最小空闲连接 @@ -108,7 +114,6 @@ spring: max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms - # 自定义验证码配置 verify: code: @@ -204,42 +209,109 @@ google: redirect-uri: tencentCos: - accessKey: - secretKey: - endpoint: - bucketName: - domain: + accessKey: AKIDBE3dzB + secretKey: EDyUmsnX2IJ + endpoint: ap-guangzhou + bucketName: seed + domain: https://seedaguangzhou.myqcloud.com -aws: - accessKey: AKIAYVMHEVDDZQGE3HVX - secretKey: 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 - endpoint: ap-southeast-1 - bucketName: di-image - domain: https://images.iqyjsnwv.com/ +# aws配置已替换为腾讯云COS,请在环境变量或配置文件中设置腾讯云凭证 +# aws: +# accessKey: AKIAYVMHEVDDZQGE3HVX +# secretKey: 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 +# endpoint: ap-southeast-1 +# bucketName: di-image +# domain: https://images.iqyjsnwv.com/ byteapi: url: https://ark.ap-southeast.bytepluses.com/api/v3 - apiKey: 327d2815-2516-44c2-9e32-2dc50bf7afd7 - callBackUrl: www.google.com + apiKey: + callBackUrl: https://undressing.top + +# 火山引擎 Ark API (Seedance 2.0) +volcengine: + ark: + baseUrl: https://ark.cn-beijing.volces.com + apiKey: + callbackUrl: https://undressing.top/api/ai/volcCallback + +# 门户视频生成页:模型 / 比例 / 时长 / 分辨率均由此处维护,前后端不写死业务枚举 +portal: + video: + # 与库表 ai_manager.type 一致(用于扣费);若报错 functionType does not exist,请插入对应 type 或改此处与库一致 + function-type: "21" + defaults: + model: ep-20260326165811-dlkth + duration: 4 + resolution: 720p + ratio: "3:4" + models: + - label: Seedance 2.0 + value: ep-20260326165811-dlkth + - label: Seedance 2.0 Fast + value: ep-20260326170056-dkj9m + ratios: + - "16:9" + - "9:16" + - "3:4" + - "1:1" + - "4:3" + durations: + - 4 + - 5 + - 6 + - 8 + - 10 + - 11 + - 12 + - 13 + - 14 + - 15 + resolutions: + - "720p" + - "1080p" jinsha: url: https://api.jinshapay.xyz appId: 1763617360 secret: a201e7969af5045dcd62d203b26121ae - notifyUrl: www.google.com - returnUrl: www.google.com + notifyUrl: https://undressing.top + returnUrl: https://undressing.top kada: url: https://rapi.openkada.xyz - appId: c70f1719017e290354017d1c101d0cc288d06ceb - secret: ME2VRe6tWH6weK/NAUJA5lhmewHkB23rA6CdWlrHrAs+/E/E3j3eG3io/GCHbQKqMMurfTNrBj/R4Yy84UziM5YJheiKFKbsWQc5xRoE46E3/0EYy4ZjbK9jhwGyHS+C - notifyUrl: www.google.com - returnUrl: www.google.com - + appId: d1743d48fb8fc24f38b7268015cf800e3b49f0fd + secret: b0CH/+tVEsz+1j2mfBzd9Kgu6UylJxr0056TwTbkKfHWw9UW/6TaQyQHv+teBnGbqWy5ObaLUMvnrs9adpymebEqjI3ipNpJa7YPQbMYm0VGuYUEgeM+fjakhWuYx2XEVzmjdIvvfhNsfr2YHTmDUzwIKPbp/OJvfG9KhSPMzpw= + notifyUrl: https://undressing.top + returnUrl: https://undressing.top + yuzhou: - url: https://pay.joinus6688.cc + url: https://api.fast-vip.store appId: PM20251211091945 - publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiTl8fg6eM6uUJqxAjGtzskt+ESIgferomy6uUtjRx4yhu6I4cVBgaw9ErJq9KMNQpMVl44GEese6PRDmNPdvXBktI/skpCfyNvT+1LqYm69Hh+rFre2Ve+0XIVoln0H3EGNUHL/KPOCm2tYXLXlZ3r02z+AQeS3rxNhE4jr32oQIDAQAB - secretKey: MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAL7U/f7yb9Z9j56dauCUb0B/I0ONAcZDK+TtOnAgLEjV4qrirYHYuCumxYbPFvt6qYggjbBpphFhihbWzf8IPS7iD6VXoSX1T1iAlWFL1ZaBscqQSvPxFGtgpTBiRFS3KkZV70WswcCL770OCkY8+DJpdyk9OkD6vBa0TYU1wxJFAgMBAAECgYBpF+t5iBJHUYbSl2bQn25VWq8U+IbNpRh7TposPculoQTfj052f9+NSp7liw7hF8Bdk2/0g3pNgCYIRevUU7k9MEIKqHCiOWkyavtsfqGYI37PZ4/0uMzB5eibTqKTEkcyskSJ9GxrL4uGKgTGNc213i3VOcZZ4xEfvuDQCHF8gQJBAPATuhQeFNNAIE9TkGiESHFGChSZZgzp1xfGrAt8BwidBSe+r9duAcGJSeNJatxneeu0w6NuwQ6iq9ztnqtoG90CQQDLfSHrOTloHSa+DdBc2SFQWa/P4K2Tznb8Y5ng8L/t+a9sYvGjWOln0R3Bq9TrImm0AjWnq/saaMg2nYD1wr2JAkA36XA5xTO2a0XbE6wbG0u/zb8FQyCIO2GTsPpahl0g/Wi48+kB9CXGjBHANFYF1LeJVIUHqACgRvRdtJ1ycAGlAkEAqASVWiTw2p+fWrQLRG7gS/kR6uIIUI/cvT78UrhWsYdFqof0Hz0N0/PdzwkzkEbk4oYkiWK+viqgjj/0uHfoiQJAQhPYVVLHD7xiJApc/Aga6g0OFF5O7zy8KTsq+KTXqRlJREBH5nirSponHwYalEbUvtQrVs+Z4BCBEGCU8m2GEw== - redirectUrl: www.google.com - callbackUrl: www.google.com + publicKey: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCiTl8fg6eM6uUJqxAjGtzskt+ESIgferomy6uUtjRx4yhu6I4cVBgaw9ErJq9KMNQpMVl44GEese6PRDmNPdvXBktI/skpCfyNvT+1LqYm69Hh+rFre2Ve+0XIVoln0H3EGNUHL/KPOCm2tYXLXlZ3r02z+AQeS3rxNhE4jr32oQIDAQAB + secretKey: MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOyqpe98vNWLL/1ja4WnUkCGiHAVnNJtlw7c9bdacCc7xgGSlXIq1bRQWXMjLZeSC31BUFcrIMk5eMr1AWUTYnVOmAJ4IsLZCUMQOBU9S6BJdqnaus4K6Kul35lrb/Zt6ju6fY1acL7q3NWJGdeRtmYaGXZbF+RH6UbA6aH4vkHBAgMBAAECgYAEh+8EbveOYZCuGdpil82w9KUVpe5Hj5JQANOMpU+RdWPLiX7xDX2jqv2kFmEeiPeNbXk7AAABJjzoKtO84lz/n0Vp8hwqIgeMdmLZBBTsJhXgOfgnvwjb/1Ev2Yjg3KGp7nKvkyPpoU9e0W8+PR5yTclylV0bCYqsP260BFLnIQJBAPmqUzQLQN739dKoO3uVpB9qU3exZOv+zlTQZj2C0cXt3/+JzJs78DBieN9+b3ZLq307namt8QAUVV+QwRoNPxECQQDyq+QoAakpi1tQoGfYUecucDcZf8GDPdEkCGhGoIq/FkzL0gGub45Rz0oXzAzBME6DcobfVVippcUB54pueTexAkBxDTtX2bCqRkW9+gfVUlFbGF5rWJyGcH8l0Kg7Oj2bDrfbkp5fvKhqgGyTZ0E5o9InhxNBfk4e5xYxi+6kyVLBAkBcPahA6LizOOxhzkcKu78jMLZQ8/XLfCDWEHgKeJWkosZYJyBKfM7dG+zu9LnYaRM+9bZ8h8Vm3sLuwWMmMN9RAkBdOSqC71e9248Bmw70zX7x6ZmszGQ64toA6mhhcdYb4wAlDtmm0OJjJRmpyXdhgdIHF3i7vNe7sXpPfNKFc1Yf + redirectUrl: https://undressing.top + callbackUrl: https://undressing.top +vm: + url: http://payment-api.togame.top + mchNo: M1768983012 + appId: 697089e4f41a4f456f159408 + secret: 120tzr4snoq11yus8la9gx7cbutw1uore4pervckvqmsswrt1hl9qkd0ug5r6twwv94jex03ajpsmsky2za4x1kghd2l54z4nn7t5fcy4gewsvwjjxrce5q1f7u2yeqj + notifyUrl: https://undressing.top + # 支付方式,固定为BUZHI_VM(国际VM卡支付) + wayCode: BUZHI_VM + # 货币代码,默认USD + currency: USD + +# 汇率服务配置 +exchange-rate: + enabled: true + apikey: 0bed27315c87475f8dd6a0792a632cc5 + api-url: https://api.currencyfreaks.com/v2.0/rates/latest + # base 货币(API返回的基准货币,通常为USD) + base-currency: USD + # 备用汇率(当API调用失败时使用) + fallback-rate-jinsha: 90 + fallback-rate-kada: 60 + # PHP比索的备用汇率(当API调用失败时使用,默认使用JinSha的汇率) + fallback-rate-php: 90 diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiManagerServiceImpl.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiManagerServiceImpl.java index 349124f..287b429 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiManagerServiceImpl.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiManagerServiceImpl.java @@ -124,6 +124,8 @@ public class AiManagerServiceImpl implements IAiManagerService { public AiManager selectAiManagerByType(String aiType) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("type", aiType); + queryWrapper.eq("del_flag", "0"); + queryWrapper.eq("status", 0); return aiManagerMapper.selectOne(queryWrapper); } } diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiOrderServiceImpl.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiOrderServiceImpl.java index 48b23a3..9e5227b 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiOrderServiceImpl.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/AiOrderServiceImpl.java @@ -1,25 +1,20 @@ package com.ruoyi.ai.service.impl; -import java.math.BigDecimal; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.List; -import java.util.UUID; - import cn.hutool.core.util.NumberUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.ai.domain.AiManager; +import com.ruoyi.ai.domain.AiOrder; import com.ruoyi.ai.domain.AiStatistics; +import com.ruoyi.ai.mapper.AiOrderMapper; import com.ruoyi.ai.service.IAiManagerService; +import com.ruoyi.ai.service.IAiOrderService; import com.ruoyi.ai.service.IAiStatisticsService; import com.ruoyi.ai.service.IAiUserService; import com.ruoyi.common.constant.BalanceChangerConstants; import com.ruoyi.common.constant.HttpStatus; -import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.AiUser; import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.utils.DateUtils; @@ -27,14 +22,17 @@ import com.ruoyi.common.utils.MessageUtils; import com.ruoyi.common.utils.SecurityUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.ruoyi.ai.mapper.AiOrderMapper; -import com.ruoyi.ai.domain.AiOrder; -import com.ruoyi.ai.service.IAiOrderService; import org.springframework.transaction.annotation.Transactional; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; +import java.util.UUID; + /** * 订单管理Service业务层处理 - * + * * @author shi * @date 2025-11-13 */ @@ -56,7 +54,7 @@ public class AiOrderServiceImpl implements IAiOrderService { /** * 查询订单管理 - * + * * @param id 订单管理主键 * @return 订单管理 */ @@ -67,7 +65,7 @@ public class AiOrderServiceImpl implements IAiOrderService { /** * 查询订单管理列表 - * + * * @param aiOrder 订单管理 * @return 订单管理 */ @@ -91,7 +89,7 @@ public class AiOrderServiceImpl implements IAiOrderService { /** * 新增订单管理 - * + * * @param aiOrder 订单管理 * @return 结果 */ @@ -105,7 +103,7 @@ public class AiOrderServiceImpl implements IAiOrderService { /** * 修改订单管理 - * + * * @param aiOrder 订单管理 * @return 结果 */ @@ -118,30 +116,29 @@ public class AiOrderServiceImpl implements IAiOrderService { /** * 批量删除订单管理 - * + * * @param ids 需要删除的订单管理主键 * @return 结果 */ @Override - public int deleteAiOrderByIds(Long[] ids) - { + public int deleteAiOrderByIds(Long[] ids) { return aiOrderMapper.deleteAiOrderByIds(ids); } /** * 删除订单管理信息 - * + * * @param id 订单管理主键 * @return 结果 */ @Override - public int deleteAiOrderById(Long id) - { + public int deleteAiOrderById(Long id) { return aiOrderMapper.deleteAiOrderById(id); } /** * 生成订单 + * * @param aiType 对应的AI类型 * @return */ @@ -150,7 +147,9 @@ public class AiOrderServiceImpl implements IAiOrderService { public AiOrder getAiOrder(String aiType) { AiManager aiManager = aiManagerService.selectAiManagerByType(aiType); if (aiManager == null) { - throw new ServiceException("Corresponding functionType does not exist", HttpStatus.BAD_REQUEST); + throw new ServiceException( + "未找到可用的功能类型:请在「AI管理」中新增 type=" + aiType + " 且状态为正常的记录,或执行 sql/seed_ai_manager_type_21.sql 初始化", + HttpStatus.BAD_REQUEST); } // 判断用户余额是否足够 AiUser aiUser = aiUserService.selectAiUserById(SecurityUtils.getAiUserId()); @@ -170,7 +169,7 @@ public class AiOrderServiceImpl implements IAiOrderService { aiOrder.setSource(aiUser.getSource()); aiOrderMapper.insert(aiOrder); // 执行余额变更 - aiUserService.addUserBalance(SecurityUtils.getAiUserId(), NumberUtil.mul(-1, aiManager.getPrice()), getChangerType(aiType)); + aiUserService.addUserBalance(orderno, SecurityUtils.getAiUserId(), NumberUtil.mul(-1, aiManager.getPrice()), getChangerType(aiType)); return aiOrder; } @@ -181,7 +180,7 @@ public class AiOrderServiceImpl implements IAiOrderService { String remark = MessageUtils.message("order.number.generation.failed", aiOrder.getOrderNum()); aiOrder.setRemark(remark); aiOrderMapper.updateById(aiOrder); - aiUserService.addUserBalance(SecurityUtils.getAiUserId(), aiOrder.getAmount(), BalanceChangerConstants.REFUND, remark); + aiUserService.addUserBalance(aiOrder.getOrderNum(), SecurityUtils.getAiUserId(), aiOrder.getAmount(), BalanceChangerConstants.REFUND, remark); } @Override @@ -191,7 +190,7 @@ public class AiOrderServiceImpl implements IAiOrderService { aiOrderMapper.updateById(aiOrder); AiStatistics aiStatistics = new AiStatistics(); aiStatistics.setSource(aiOrder.getSource()); - aiStatistics.setGenerateCount(1l); + aiStatistics.setGenerateCount(1L); // 新增生成数量 aiStatisticsService.saveOrUpdateData(aiStatistics); } @@ -204,6 +203,11 @@ public class AiOrderServiceImpl implements IAiOrderService { return aiOrderMapper.selectOne(query); } + @Override + public AiOrder getAiOrderByPortalVideoTask(String taskId) { + return aiOrderMapper.getAiOrderByPortalVideoTask(taskId); + } + public int getChangerType(String aiType) { switch (aiType) { case "11": diff --git a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/ByteService.java b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/ByteService.java index cc315b8..120f9eb 100644 --- a/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/ByteService.java +++ b/web-api/ruoyi-system/src/main/java/com/ruoyi/ai/service/impl/ByteService.java @@ -6,8 +6,10 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.ai.domain.ByteBodyReq; import com.ruoyi.ai.domain.ByteBodyRes; import com.ruoyi.ai.service.IByteService; +import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.http.OkHttpUtils; +import okhttp3.HttpUrl; import okhttp3.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -30,6 +32,13 @@ public class ByteService implements IByteService { @Value("${byteapi.apiKey}") private String apiKey; + // 火山引擎配置 + @Value("${volcengine.ark.baseUrl:https://ark.cn-beijing.volces.com}") + private String volcBaseUrl; + + @Value("${volcengine.ark.apiKey}") + private String volcApiKey; + @Override public ByteBodyRes promptToImg(ByteBodyReq req) throws Exception { return this.imgToImg(req); @@ -75,71 +84,148 @@ public class ByteService implements IByteService { @Override public ByteBodyRes imgToVideo(ByteBodyReq req) throws Exception { + return imgToVideo(req, volcApiKey); + } - // 1. 验证请求参数(可选,根据业务需求) -// if (StringUtils.isBlank(req.getPrompt())) { -// throw new Exception("imgToVideo error:prompt is null"); -// } + @Override + public ByteBodyRes imgToVideo(ByteBodyReq req, String arkApiKey) throws Exception { + if (req == null) { + throw new Exception("imgToVideo error:req is null"); + } + if (StringUtils.isBlank(arkApiKey)) { + throw new Exception("imgToVideo error:apiKey is null"); + } - // 2. 构建请求体JSON(基于ByteBodyReq的字段) - // 注意:ByteBodyReq需包含与API参数对应的字段(model、prompt等) String jsonBody = objectMapper.writeValueAsString(req); - // 3. 构建请求 + Request request = new Request.Builder() - .url(API_URL + "/contents/generations/tasks") + .url(volcBaseUrl + "/api/v3/contents/generations/tasks") .header("Content-Type", "application/json") - .header("Authorization", "Bearer " + apiKey) + .header("Authorization", "Bearer " + arkApiKey) .post(RequestBody.create( MediaType.parse("application/json; charset=utf-8"), jsonBody )) .build(); - // 4. 发送同步请求(因方法需要返回值,使用execute而非enqueue) + Response response = OkHttpUtils.newCall(request).execute(); - // 5. 处理响应 + if (!response.isSuccessful()) { - // 非200状态:返回错误信息(假设ByteBodyRes有error字段) String errorMsg = response.body() != null ? response.body().string() : "imgToVideo error"; throw new Exception("imgToVideo error:" + errorMsg); } - // 6. 解析成功响应为ByteBodyRes + if (response.body() == null) { throw new Exception("imgToVideo response null"); } + String responseBody = response.body().string(); return objectMapper.readValue(responseBody, ByteBodyRes.class); } @Override public ByteBodyRes uploadVideo(String id) throws Exception { - // 1. 验证请求参数(可选,根据业务需求) + return uploadVideo(id, volcApiKey); + } + + @Override + public ByteBodyRes uploadVideo(String id, String arkApiKey) throws Exception { if (StringUtils.isBlank(id)) { throw new Exception("uploadVideo error:id is null"); } + if (StringUtils.isBlank(arkApiKey)) { + throw new Exception("uploadVideo error:apiKey is null"); + } - // 2. 构建请求体JSON(基于ByteBodyReq的字段) - // 注意:ByteBodyReq需包含与API参数对应的字段(model、prompt等) - //String jsonBody = objectMapper.writeValueAsString(req); - // 3. 构建请求 Request request = new Request.Builder() - .url(API_URL + "/contents/generations/tasks/" + id) + .url(volcBaseUrl + "/api/v3/contents/generations/tasks/" + id) .header("Content-Type", "application/json") - .header("Authorization", "Bearer " + apiKey) + .header("Authorization", "Bearer " + arkApiKey) .get() .build(); - // 4. 发送同步请求(因方法需要返回值,使用execute而非enqueue) + Response response = OkHttpUtils.newCall(request).execute(); - // 5. 处理响应 + if (!response.isSuccessful()) { - // 非200状态:返回错误信息(假设ByteBodyRes有error字段) String errorMsg = response.body() != null ? response.body().string() : "uploadVideo error"; throw new Exception("uploadVideo error:" + errorMsg); } - // 6. 解析成功响应为ByteBodyRes + if (response.body() == null) { throw new Exception("uploadVideo response null"); } + String responseBody = response.body().string(); return objectMapper.readValue(responseBody, ByteBodyRes.class); } + + @Override + public AjaxResult cancelVideoTask(String id) throws Exception { + return cancelVideoTask(id, volcApiKey); + } + + @Override + public AjaxResult cancelVideoTask(String id, String arkApiKey) throws Exception { + if (StringUtils.isBlank(id)) { + return AjaxResult.error("任务ID不能为空"); + } + if (StringUtils.isBlank(arkApiKey)) { + return AjaxResult.error("API Key 无效"); + } + + try { + Request request = new Request.Builder() + .url(volcBaseUrl + "/api/v3/contents/generations/tasks/" + id) + .header("Content-Type", "application/json") + .header("Authorization", "Bearer " + arkApiKey) + .delete() + .build(); + + Response response = OkHttpUtils.newCall(request).execute(); + + if (!response.isSuccessful()) { + String errorMsg = response.body() != null ? response.body().string() : "cancel failed"; + return AjaxResult.error("取消任务失败:" + errorMsg); + } + + return AjaxResult.success("任务已取消,余额已退回"); + } catch (Exception e) { + return AjaxResult.error("取消任务异常:" + e.getMessage()); + } + } + + @Override + public String listVideoGenerationTasks(int pageNum, int pageSize, String arkApiKey) throws Exception { + if (StringUtils.isBlank(arkApiKey)) { + throw new Exception("listVideoGenerationTasks error:apiKey is null"); + } + int pn = pageNum > 0 ? pageNum : 1; + int ps = pageSize > 0 ? Math.min(pageSize, 500) : 10; + + HttpUrl parsed = HttpUrl.parse(volcBaseUrl + "/api/v3/contents/generations/tasks"); + if (parsed == null) { + throw new Exception("listVideoGenerationTasks error:invalid base url"); + } + HttpUrl url = parsed.newBuilder() + .addQueryParameter("page_num", String.valueOf(pn)) + .addQueryParameter("page_size", String.valueOf(ps)) + .build(); + + Request request = new Request.Builder() + .url(url) + .header("Content-Type", "application/json") + .header("Authorization", "Bearer " + arkApiKey) + .get() + .build(); + + Response response = OkHttpUtils.newCall(request).execute(); + if (response.body() == null) { + throw new Exception("listVideoGenerationTasks response null"); + } + String body = response.body().string(); + if (!response.isSuccessful()) { + throw new Exception("listVideoGenerationTasks error:" + body); + } + return body; + } } diff --git a/web-api/sql/aisql.sql b/web-api/sql/aisql.sql index 8025d5f..42fa9de 100644 --- a/web-api/sql/aisql.sql +++ b/web-api/sql/aisql.sql @@ -23,6 +23,7 @@ SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS `ai_balance_change_record`; CREATE TABLE `ai_balance_change_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联订单号', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -33,7 +34,8 @@ CREATE TABLE `ai_balance_change_record` ( `type` tinyint(1) NULL DEFAULT NULL COMMENT '操作类型', `change_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '变更金额', `result_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '变更后金额', - PRIMARY KEY (`id`) USING BTREE + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_order_no` (`order_no`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1159 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '余额使用记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -1449,7 +1451,7 @@ CREATE TABLE `ai_manager` ( `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', - `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'AI标题', `price` decimal(10, 2) NULL DEFAULT 0.00 COMMENT '价格', @@ -1464,12 +1466,12 @@ CREATE TABLE `ai_manager` ( -- ---------------------------- -- Records of ai_manager -- ---------------------------- -INSERT INTO `ai_manager` VALUES (1, '0', 'admin', '2025-11-13 20:05:27', 'admin', '2025-12-23 14:30:07', NULL, '图生图1', 10.00, 0, '1girl, solo, exact same character as reference image, identical face eye color hairstyle accessories expression pose background lighting, (completely nude:1.2), naked, no clothes, breasts fully exposed, {胸部大小}, nipples perfectly matching skin tone, {动作}, pose that naturally conceals lower body from front view, legs positioned to avoid frontal genital exposure, side profile or back view emphasis, subtle natural body contours without explicit details, perfect anatomy, exactly two arms and two legs only, perfect hands with exactly 5 clearly separated fingers each no fusion no extra fingers, smooth natural skin texture, realistic proportions, masterpiece, best quality, ultra detailed, 8k, soft lighting, depth of field, high resolution, intricate details, cinematic composition, (if multiple characters: all characters following same rules no frontal exposure:1.1)(negative: clothes, bra, panties, underwear, bikini, swimsuit, any fabric even one pixel, censored, mosaic, bar censor, any censorship, pasties, nipple covers, frontal genital exposure, visible slit, visible pussy, exposed crotch, swollen labia, puffy labia, deformed genital area, dark mismatched crotch skin, any pubic details, extra arms, extra legs, extra hands, extra fingers, third arm, third leg, mutated limbs, more than two arms, more than two legs, fused fingers, deformed hands, bad hands, unnatural poses, violating human anatomy, loli, child, old, realistic photo, lowres:1.8, blurry, artifacts, overexposed, underexposed, pixelated, jpeg artifacts, watermark, text, signature, ugly, deformed, mutated, extra limbs, poorly drawn face, poorly drawn hands, missing limbs, floating limbs, disconnected limbs)', '11', '1,17'); -INSERT INTO `ai_manager` VALUES (2, '0', 'admin', '2025-11-21 22:24:28', 'admin', '2025-12-14 20:20:56', NULL, '图生图2', 10.00, 0, '生成{主题},{风格}包含{细节},分辨率{技术参数}的图像', '12', NULL); -INSERT INTO `ai_manager` VALUES (3, '0', 'admin', '2025-11-13 20:06:02', 'admin', '2025-12-24 15:03:00', NULL, '一键换脸', 10.00, 1, '保持参考图1的内容风格不变,用参考图2的脸部对参考图1的脸部进行替换', '13', ''); -INSERT INTO `ai_manager` VALUES (4, '0', 'admin', '2025-11-13 20:07:33', 'admin', '2025-12-23 14:47:10', NULL, '快捷生图', 8.00, 0, '1girl, solo, detailed face with {发型} {眼睛颜色} {配饰} {表情} {姿势} in {背景}, {服装描述} {胸部大小} no pubic hair at all, no body hair anywhere from neck to toes, pose that naturally conceals lower body from front view, legs positioned to avoid frontal genital exposure, side profile or back view emphasis, subtle natural body contours without explicit details, perfect anatomy, exactly two arms and two legs only, perfect hands with exactly 5 clearly separated fingers each no fusion no extra fingers, smooth natural skin texture, realistic proportions, masterpiece, best quality, ultra detailed, 8k, soft lighting, depth of field, high resolution, intricate details, cinematic composition, (if multiple characters: {多人描述}, all characters following same rules no frontal exposure:1.1)(negative: everyday clothes, casual outfit, school uniform, regular dress, any non-specified clothing, clothing glitch, fabric clipping, pubic hair, body hair, happy trail, hair on abdomen, hair on stomach, hair on torso, hair around navel, any hair below neck except head hair, frontal genital exposure, visible slit, visible pussy, exposed crotch, swollen labia, puffy labia, deformed genital area, dark mismatched crotch skin, any pubic details, extra arms, extra legs, extra hands, extra fingers, third arm, third leg, mutated limbs, more than two arms, more than two legs, fused fingers, deformed hands, bad hands, unnatural poses, violating human anatomy, bad anatomy, loli, child, old, realistic photo, lowres:1.9, blurry, artifacts, overexposed, underexposed, pixelated, jpeg artifacts, watermark, text, signature, ugly, deformed, mutated, extra limbs, poorly drawn face, poorly drawn hands, missing limbs, floating limbs, disconnected limbs, clothes if nude mode, bra if nude mode, panties if nude mode, underwear if nude mode, bikini if nude mode, swimsuit if nude mode, any fabric even one pixel if nude mode, censored if nude mode, mosaic if nude mode, bar censor if nude mode, any censorship if nude mode, pasties if nude mode, nipple covers if nude mode)\n', '1', '8,5,11,64,66,68,70,72,74'); -INSERT INTO `ai_manager` VALUES (5, '0', 'admin', '2025-11-13 20:07:47', 'admin', '2026-01-08 14:58:37', '', '快捷生视频', 35.00, 0, '跳舞', '21', ''); -INSERT INTO `ai_manager` VALUES (7, '0', 'admin', '2025-11-25 19:41:23', 'admin', '2025-11-25 19:41:23', NULL, '视频换脸', 35.00, 1, NULL, '22', NULL); +INSERT INTO `ai_manager` VALUES (1, '0', 'admin', '2025-11-13 20:05:27', 'admin', '2025-12-23 14:30:07', NULL, '图生图', 10.00, 0, '1girl, solo, exact same character as reference image, (completely nude:1.2), naked, no clothes, breasts fully exposed, {胸部大小}, perfect anatomy, masterpiece, best quality', '11', NULL); +INSERT INTO `ai_manager` VALUES (2, '0', 'admin', '2025-11-21 22:24:28', 'admin', '2025-12-14 20:20:56', NULL, '图生图-高级', 12.00, 0, '生成{主题},{风格}包含{细节},分辨率{技术参数}的图像', '12', NULL); +INSERT INTO `ai_manager` VALUES (3, '0', 'admin', '2025-11-13 20:06:02', 'admin', '2025-12-24 15:03:00', NULL, '一键换脸', 10.00, 1, '保持参考图1的内容风格不变,用参考图2的脸部对参考图1的脸部进行替换', '13', NULL); +INSERT INTO `ai_manager` VALUES (4, '0', 'admin', '2025-11-13 20:07:33', 'admin', '2025-12-23 14:47:10', NULL, '快捷生图', 8.00, 0, '1girl, solo, detailed face with {发型} {眼睛颜色} {配饰} {表情} {姿势} in {背景}, {服装描述} {胸部大小}, perfect anatomy, masterpiece, best quality', '11', NULL); +INSERT INTO `ai_manager` VALUES (5, '0', 'admin', '2025-11-13 20:07:47', 'admin', '2026-01-08 14:58:37', NULL, '快捷生视频', 35.00, 0, '跳舞', '21', NULL); +INSERT INTO `ai_manager` VALUES (7, '0', 'admin', '2025-11-25 19:41:23', 'admin', '2025-11-25 19:41:23', NULL, '视频换脸', 35.00, 1, '视频换脸功能', '22', NULL); -- ---------------------------- -- Table structure for ai_order @@ -1494,7 +1496,15 @@ CREATE TABLE `ai_order` ( `is_top` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否置顶:N-否 Y-是', `img1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '首帧图片', `img2` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '第二张图片', - PRIMARY KEY (`id`) USING BTREE + `mode` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成模式:text-to-video 或 image-to-video', + `duration` int NULL DEFAULT 5 COMMENT '视频时长(秒)', + `resolution` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '720p' COMMENT '分辨率', + `ratio` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '9:16' COMMENT '宽高比', + `model` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '火山模型 endpoint', + `video_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '视频生成提交参数JSON', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_order_num` (`order_num`) USING BTREE, + KEY `idx_user_id` (`user_id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1310 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'API订单记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -2792,6 +2802,7 @@ CREATE TABLE `ai_pay_setting` ( DROP TABLE IF EXISTS `ai_rebate_record`; CREATE TABLE `ai_rebate_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联订单号', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -2801,7 +2812,8 @@ CREATE TABLE `ai_rebate_record` ( `superior_id` bigint NULL DEFAULT NULL COMMENT '上级ID', `subordinate_id` bigint NULL DEFAULT NULL COMMENT '下级ID', `amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '返佣金额', - PRIMARY KEY (`id`) USING BTREE + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_order_no` (`order_no`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '返佣记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -2866,7 +2878,7 @@ CREATE TABLE `ai_recharge` ( `gift_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '到账金额', `give_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '赠送金额', `pay_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付方式', - `pay_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付链接', + `pay_url` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付链接', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 118 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '充值记录' ROW_FORMAT = DYNAMIC; @@ -3103,6 +3115,7 @@ INSERT INTO `ai_sample_amount` VALUES (2, '0', 'admin', '2025-11-14 22:37:01', ' DROP TABLE IF EXISTS `ai_sample_amount_record`; CREATE TABLE `ai_sample_amount_record` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `order_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联订单号', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', @@ -3113,7 +3126,8 @@ CREATE TABLE `ai_sample_amount_record` ( `sample_amount` decimal(10, 2) NULL DEFAULT NULL COMMENT '体验金额', `recycle_time` datetime NULL DEFAULT NULL COMMENT '回收时间', `status` tinyint NULL DEFAULT 0 COMMENT '回收状态:0-已发放 1-已回收', - PRIMARY KEY (`id`) USING BTREE + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_order_no` (`order_no`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 34 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '体验金领取记录' ROW_FORMAT = DYNAMIC; -- ---------------------------- @@ -3527,6 +3541,7 @@ CREATE TABLE `ai_user` ( `source` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '来源', `ip` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户IP', `country` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '隶属国家', + `dept_id` bigint NULL DEFAULT NULL COMMENT '归属部门(sys_dept.dept_id)', PRIMARY KEY (`id`) USING BTREE, UNIQUE INDEX `uuid`(`user_id` ASC) USING BTREE, UNIQUE INDEX `invitation_code`(`invitation_code` ASC) USING BTREE, @@ -3537,35 +3552,37 @@ CREATE TABLE `ai_user` ( -- ---------------------------- -- Records of ai_user -- ---------------------------- -INSERT INTO `ai_user` VALUES (14, '0', '', '2025-11-28 11:42:33', '', '2026-01-06 16:04:21', NULL, 'ww123', NULL, 2, '', '', '$2a$10$bxNPP2cfo9OlJxiOQJJDiu4QOrQet8enUOCiu3QF6qLHaOSLA6G1.', NULL, 0, 'xpchb40121@outlook.com', NULL, 'RM3XZ8z3', NULL, '2026-01-06 16:04:21', 235.00, NULL, 'L8AJXFPT', 'XM001', '2605:52c0:1:446:a425:64ff:fe47:36c6', '美国'); -INSERT INTO `ai_user` VALUES (15, '0', '', '2025-12-07 14:52:38', '', '2025-12-08 17:20:37', NULL, 'u30', NULL, 2, '', '', '$2a$10$tXkZP66AWniOcCbhk2LJpOFOSzHEIMLDbGsow4B7maYswco5HShg.', NULL, 0, 'u30@163.com', NULL, 'wHSf4N2v', NULL, '2025-12-08 17:20:37', 10.00, NULL, 'SNLMZXPH', 'XM001', '208.86.32.27', '美国'); -INSERT INTO `ai_user` VALUES (16, '0', '', '2025-12-07 17:15:46', '', '2026-01-08 09:08:03', NULL, 'test001', NULL, 2, '', '', '$2a$10$M4ZD5kRehFycoTmgrA1b4.XNnwsvULaQm9ySdSxttRzPVn7ngbE6y', NULL, 0, 'fgerghbrthbrt@gmail.com', NULL, 'XrtN5DDW', NULL, '2026-01-08 09:08:03', 99921.00, NULL, '2LZ9RAC2', '', '15.204.58.244', '美国'); -INSERT INTO `ai_user` VALUES (17, '0', '', '2025-12-07 17:28:57', '', '2025-12-07 09:28:57', NULL, 'zz3534217@gmail.com', NULL, 2, '', '', '$2a$10$sxNmfnayqUroy66CgCATf.VkmxsECKv1jTUgFUMN.CQY.3yFBWGO.', NULL, 0, 'zz3534217@gmail.com', NULL, 'qnUwmXYS', NULL, '2025-12-07 21:18:48', 0.00, NULL, '82FR6YTZ', 'XM001', NULL, NULL); -INSERT INTO `ai_user` VALUES (18, '0', '', '2025-12-08 12:53:23', '', '2025-12-08 17:00:57', NULL, '3545486624@qq.com', NULL, 2, '', '', '$2a$10$9siQceU./ZfmW.iDwVf9sehBJWsxzyP10fJvkzStAbyzw4yQEHAUa', NULL, 0, '3545486624@qq.com', NULL, 'ujfTuFNA', NULL, '2025-12-08 17:00:56', 0.00, NULL, 'OEEO8YJQ', 'XM001', '119.246.86.101', '香港'); -INSERT INTO `ai_user` VALUES (19, '0', '', '2025-12-08 15:47:59', '', '2025-12-08 15:48:14', NULL, 'walb0501', NULL, 2, '', '', '$2a$10$KnHIeNIOtva0saZVasbfBeJhvCKpU/cjZXEwBJ655jrJcBnCR1s/q', NULL, 0, 'pereadesen2@gmail.com', NULL, 'DqmbQS8q', NULL, '2025-12-08 15:48:14', 8.00, NULL, '9Q889UMZ', 'XM001', '188.253.121.195', '新加坡'); -INSERT INTO `ai_user` VALUES (20, '0', '', '2025-12-08 15:50:03', '', '2025-12-08 15:50:23', NULL, 'xu89026719@gmail.com', NULL, 2, '', '', '$2a$10$xdGHiEVaGC7gyXldojpiUO0GOgyu5Pcgtw/WRTuf.TA1e.NbB8Ogu', NULL, 0, 'xu89026719@gmail.com', NULL, 'XnQAfPvA', NULL, '2025-12-08 15:50:23', 0.00, NULL, '209HPBTF', 'XM001', '38.207.136.194', '日本'); -INSERT INTO `ai_user` VALUES (21, '0', '', '2025-12-08 17:20:31', '', '2025-12-08 17:22:26', NULL, '1686228', NULL, 2, '', '', '$2a$10$MpUYTeWBI6gVTqjtJBz.3.sMOz6ul.eqLQyrvY3VL2WRbFeK666fW', NULL, 0, '1686228@gmail.com', NULL, 'RyZlK7YG', NULL, '2025-12-08 17:22:26', 10.00, NULL, '9CUIDFW4', 'XM001', '208.86.32.27', '美国'); -INSERT INTO `ai_user` VALUES (22, '0', '', '2025-12-08 19:45:16', '', '2025-12-09 03:12:37', NULL, 'a424569211@gmail.com', NULL, 2, '', '', '$2a$10$3TEa4ufju1sMPJdw8K0Ik.ic10m6Ms4LQFxYK2h27/pbI2qR5nJDK', NULL, 0, 'a424569211@gmail.com', NULL, '4JLEc4vd', NULL, '2025-12-09 03:12:37', 0.00, NULL, '0N5NEU38', 'XM001', '205.185.125.114', '美国'); -INSERT INTO `ai_user` VALUES (23, '0', '', '2025-12-09 10:33:05', '', '2025-12-09 10:33:21', NULL, 'cc123', NULL, 2, 'https://images.iqyjsnwv.com/2025/12/09/37b754c5_706d42be-ad9a-4f11-a3ec-c0742e97ed64.png', '', '$2a$10$V.SDRP4RgM/qfAmNMSqIdOOM259j064oJCvAbDkhrSZLB99L9nhaK', NULL, 0, 'cherrylux098@gmail.com', NULL, 'rlmhwbhF', NULL, '2025-12-09 10:33:21', 4.00, NULL, 'NU8BE6J2', 'XM001', '2605:52c0:3:1a3:c05b:4bff:fe2c:115a', '美国'); -INSERT INTO `ai_user` VALUES (25, '0', '', '2025-12-09 13:46:13', '', '2025-12-09 14:31:51', NULL, 'test1', NULL, 2, '', '', '$2a$10$7v6PPfozY7PHR.ep.GKobePag1aq0ZuS9j.R6lWcKloy9j1R6HgoS', NULL, 0, '123@gmail.com', NULL, 'VBb72Ym3', NULL, '2025-12-09 14:31:50', 8.00, NULL, 'UQ9WZN3V', 'XM001', '2407:cdc0:b00a::19', '香港'); -INSERT INTO `ai_user` VALUES (26, '0', '', '2025-12-09 14:13:17', '', '2025-12-09 14:53:48', NULL, 'test2', NULL, 2, '', '', '$2a$10$OirrwiDFruMJQLLnNufEv.BiQzyL.KxCz1x.XVWt5R5e.ggq5m/RS', NULL, 0, '1@gmail.com', NULL, '3WFmGuER', NULL, '2025-12-09 14:53:48', 10.00, NULL, '0NEK09R6', 'XM001', '2407:cdc0:b00a::19', '香港'); -INSERT INTO `ai_user` VALUES (27, '0', '', '2025-12-09 14:57:14', '', '2025-12-09 15:01:08', NULL, 'test3', NULL, 2, '', '', '$2a$10$aCcA6Mq/.xOfs6FCJwPot.ttBFv7YjULPQsF3axMz3Gm98MzMafrO', NULL, 0, '2@gmail.com', NULL, 'pqU7mW5R', NULL, '2025-12-09 15:01:08', 10000.00, NULL, '4R80E3NI', 'XM001', '2407:cdc0:b00a::19', '香港'); -INSERT INTO `ai_user` VALUES (29, '0', '', '2025-12-11 10:48:59', '', '2025-12-11 10:49:08', NULL, 'test4', NULL, 2, '', '', '$2a$10$he3GMBisX7UeEHFRQYVxU.vcavkDxWWNyCSuz2QvfPKBAEZd17Xuu', NULL, 0, '3@gmail.com', NULL, 'FWzJWjjQ', NULL, '2025-12-11 10:49:08', 0.00, NULL, 'KLSC4HK0', 'ALL', '2407:cdc0:b00a::19', '香港'); -INSERT INTO `ai_user` VALUES (30, '0', '', '2025-12-11 10:50:31', '', '2025-12-11 11:00:47', NULL, 'test5', NULL, 2, '', '', '$2a$10$QVUfOv2FbwhRwj35ETn0we.k76tfHNqxXZPKy0vvzxfz1jgh2cB7m', NULL, 0, '4@gmail.com', NULL, 'Rdp7l3db', NULL, '2025-12-11 11:00:47', 28.22, NULL, '1S8WYOXT', 'ALL', '2407:cdc0:b00a::19', '香港'); -INSERT INTO `ai_user` VALUES (31, '0', '', '2025-12-14 01:35:44', '', '2025-12-13 17:35:44', NULL, 'whsksmhxud', NULL, 2, '', '', '$2a$10$sJ1pA9uBfgzv8O5X5Ui5G.7uVKRoZDqDqQ9BG848y7njgFtlgzWpq', NULL, 0, 'w809277959@outlook.com', NULL, 'bZEVdu4b', NULL, NULL, 0.00, NULL, '7I7TJC30', 'XM001', '103.82.93.21', '印尼'); -INSERT INTO `ai_user` VALUES (32, '0', '', '2025-12-14 01:58:22', '', '2025-12-14 01:58:47', NULL, 'devin', NULL, 2, '', '', '$2a$10$NUNiFbS6WEXznA0LzlW10eH5FjX437NxO05VSnMFII4FIsPQOuoxe', NULL, 0, 'devinhe46@gmail.com', NULL, 'BZNhTE5M', NULL, '2025-12-14 01:58:47', 0.00, NULL, 'BN7FJCGI', 'XM001', '134.122.184.12', '日本'); -INSERT INTO `ai_user` VALUES (33, '0', '', '2025-12-14 10:22:49', '', '2025-12-14 10:23:08', NULL, 'djwnx1123', NULL, 2, '', '', '$2a$10$z5dYmkZzGdi9G2nVSPZqJutN2Z/8FN0.cPRilsZdjzgVZKc2QCydi', NULL, 0, '2451855921@qq.com', NULL, 'nc3yv7WQ', NULL, '2025-12-14 10:23:08', 0.00, NULL, '4HF1953W', 'XM001', '103.147.45.37', '香港'); -INSERT INTO `ai_user` VALUES (34, '0', '', '2025-12-14 14:52:58', '', '2025-12-14 14:54:08', NULL, 'djwnx', NULL, 2, '', '', '$2a$10$YwtgWJOnElfAn4vuvYRprO5zXrTBZx8fvx/lVIyopVdph7RkeSisS', NULL, 0, 'tianyangyu1123@gmail.com', NULL, 'pFpHVX2y', NULL, '2025-12-14 14:54:08', 0.00, NULL, 'BH9DLPCJ', 'XM001', '43.228.227.211', '香港'); -INSERT INTO `ai_user` VALUES (35, '0', '', '2025-12-15 18:05:01', '', '2025-12-24 15:08:10', NULL, 'test6', NULL, 2, '', '', '$2a$10$AOJg.25lz16afHa3OfPMhuxu8oorFGeL4MqMgcxpRKjd4iY0LsmAG', NULL, 0, '5@gmail.com', NULL, 'heNUTHUX', NULL, '2025-12-24 15:08:09', 323.00, 30, 'PJCZNE1M', 'ALL', '2602:fbf1:b001::36', '美国'); -INSERT INTO `ai_user` VALUES (36, '0', '', '2025-12-15 18:07:56', '', '2026-01-08 14:53:02', NULL, 'test7', NULL, 2, '', '', '$2a$10$xXtOsMjz5Zd9dsJvUBz5be.6ZphexWOedfe.TLW9bdDtzFBYESzIG', NULL, 0, '6@gmail.com', NULL, 'RXQLfyjy', NULL, '2026-01-08 14:53:01', 100419.00, 35, '24SRSLFG', 'ALL', '2407:cdc0:d002::195', '新加坡'); -INSERT INTO `ai_user` VALUES (37, '0', '', '2025-12-16 14:07:46', '', '2025-12-16 14:08:05', NULL, 'test8', NULL, 2, '', '', '$2a$10$Z967MUQ6I5CCgfVJTV0l2ug2BysZmfRNvpq6c.vBVlVIX7ekM3GJi', NULL, 0, '7@gmail.com', NULL, 'kEZx2eps', NULL, '2025-12-16 14:08:04', 0.00, NULL, 'H4AFA8CH', 'ALL', '37.9.33.202', '美国'); -INSERT INTO `ai_user` VALUES (38, '0', '', '2025-12-19 22:04:18', '', '2025-12-24 20:57:53', NULL, 'ghypnus', NULL, 2, '', '', '$2a$10$Cr7AQ7D9Jxk6BRE7cYn1su5B4x4aOxkf9JQMwk06Tyt5X1dn8Qr6K', NULL, 0, '1954579286@qq.com', NULL, '3tMwDlMH', NULL, '2025-12-24 20:57:52', 0.00, NULL, 'JPL28UHV', 'XM001', '85.234.69.52', '英国'); -INSERT INTO `ai_user` VALUES (39, '0', '', '2025-12-27 16:48:23', '', '2026-01-06 16:32:09', NULL, 'xiaxiaxia', NULL, 2, '', '', '$2a$10$aci4cfcpANfKt1EPdVY1cORUACqXJHGx49gjD72Cc2p62K5TKT6bG', NULL, 0, 'pianochen606@gmail.com', NULL, 'yWQK4jBC', NULL, '2026-01-06 16:32:09', 9829.00, NULL, 'K0G1NBAI', 'XM001', '216.167.64.103', '美国'); -INSERT INTO `ai_user` VALUES (40, '0', '', '2025-12-30 11:28:25', '', '2025-12-30 11:28:35', NULL, 'test9', NULL, 2, '', '', '$2a$10$RrqVCQk2eKBrk4LqVlVLg.MCSmKlIJidSpw/aH3jlA4oGf8AEvbYi', NULL, 0, '8@gmail.com', NULL, 'wSsxXKeH', NULL, '2025-12-30 11:28:35', 336.00, 35, 'Z6UI3X6S', 'ALL', '2602:fbf1:b001::36', '美国'); -INSERT INTO `ai_user` VALUES (41, '0', '', '2025-12-30 11:58:13', '', '2025-12-30 11:58:20', NULL, 'test10', NULL, 2, '', '', '$2a$10$iyc.quT3QzzzROdjLN1S8.GLE.epyFAo4FvBDOlokDbu4JMODrr3S', NULL, 0, '9@gmail.com', NULL, 'lRbwts88', NULL, '2025-12-30 11:58:20', 110.00, 40, 'LJSSMAQO', 'ALL', '2602:fbf1:b001::36', '美国'); -INSERT INTO `ai_user` VALUES (42, '0', '', '2025-12-30 13:42:02', '', '2025-12-30 13:42:09', NULL, 'test11', NULL, 2, '', '', '$2a$10$ke66b3aOZ67NaUT2WQepyO2EmVYkSEBYLB/NFSRID.S3ejHaU5Og.', NULL, 0, '10@gmail.com', NULL, 'BrEg6XmM', NULL, '2025-12-30 13:42:09', 225.00, NULL, 'IHOF63N5', 'ALL', '2602:fbf1:b001::36', '美国'); -INSERT INTO `ai_user` VALUES (43, '0', '', '2025-12-31 14:20:06', '', '2025-12-31 14:20:12', NULL, 'a001', NULL, 2, '', '', '$2a$10$Z02VVJ5/LaiTzTp22b2zXOTV8YE/6BMNVrboTj5cuEthXuPpP97Mi', NULL, 0, '11@gmail.com', NULL, 'Xf38CXD6', NULL, '2025-12-31 14:20:12', 1089.00, NULL, 'LXNFP1VS', 'ALL', '2602:fbf1:b001::36', '美国'); -INSERT INTO `ai_user` VALUES (44, '0', '', '2025-12-31 14:26:20', '', '2025-12-31 14:26:25', NULL, 'a002', NULL, 2, '', '', '$2a$10$4ZnF/zh3q3E07GBpthtL.ufsxQOt2u/eu8YzcFnmPO5dUa1RJ6mkG', NULL, 0, 'c46258724hk@gmail.com', NULL, 'knt2yT2r', NULL, '2025-12-31 14:26:25', 230.00, 43, 'JW07BAHC', 'ALL', '2602:fbf1:b001::36', '美国'); +INSERT INTO `ai_user` VALUES (14, '0', '', '2025-11-28 11:42:33', '', '2026-01-06 16:04:21', NULL, 'ww123', NULL, 2, '', '', '$2a$10$bxNPP2cfo9OlJxiOQJJDiu4QOrQet8enUOCiu3QF6qLHaOSLA6G1.', NULL, 0, 'xpchb40121@outlook.com', NULL, 'RM3XZ8z3', NULL, '2026-01-06 16:04:21', 235.00, NULL, 'L8AJXFPT', 'XM001', '2605:52c0:1:446:a425:64ff:fe47:36c6', '美国', NULL); +INSERT INTO `ai_user` VALUES (15, '0', '', '2025-12-07 14:52:38', '', '2025-12-08 17:20:37', NULL, 'u30', NULL, 2, '', '', '$2a$10$tXkZP66AWniOcCbhk2LJpOFOSzHEIMLDbGsow4B7maYswco5HShg.', NULL, 0, 'u30@163.com', NULL, 'wHSf4N2v', NULL, '2025-12-08 17:20:37', 10.00, NULL, 'SNLMZXPH', 'XM001', '208.86.32.27', '美国', NULL); +INSERT INTO `ai_user` VALUES (16, '0', '', '2025-12-07 17:15:46', '', '2026-01-08 09:08:03', NULL, 'test001', NULL, 2, '', '', '$2a$10$M4ZD5kRehFycoTmgrA1b4.XNnwsvULaQm9ySdSxttRzPVn7ngbE6y', NULL, 0, 'fgerghbrthbrt@gmail.com', NULL, 'XrtN5DDW', NULL, '2026-01-08 09:08:03', 99921.00, NULL, '2LZ9RAC2', '', '15.204.58.244', '美国', NULL); +INSERT INTO `ai_user` VALUES (17, '0', '', '2025-12-07 17:28:57', '', '2025-12-07 09:28:57', NULL, 'zz3534217@gmail.com', NULL, 2, '', '', '$2a$10$sxNmfnayqUroy66CgCATf.VkmxsECKv1jTUgFUMN.CQY.3yFBWGO.', NULL, 0, 'zz3534217@gmail.com', NULL, 'qnUwmXYS', NULL, '2025-12-07 21:18:48', 0.00, NULL, '82FR6YTZ', 'XM001', NULL, NULL, NULL); +INSERT INTO `ai_user` VALUES (18, '0', '', '2025-12-08 12:53:23', '', '2025-12-08 17:00:57', NULL, '3545486624@qq.com', NULL, 2, '', '', '$2a$10$9siQceU./ZfmW.iDwVf9sehBJWsxzyP10fJvkzStAbyzw4yQEHAUa', NULL, 0, '3545486624@qq.com', NULL, 'ujfTuFNA', NULL, '2025-12-08 17:00:56', 0.00, NULL, 'OEEO8YJQ', 'XM001', '119.246.86.101', '香港', NULL); +INSERT INTO `ai_user` VALUES (19, '0', '', '2025-12-08 15:47:59', '', '2025-12-08 15:48:14', NULL, 'walb0501', NULL, 2, '', '', '$2a$10$KnHIeNIOtva0saZVasbfBeJhvCKpU/cjZXEwBJ655jrJcBnCR1s/q', NULL, 0, 'pereadesen2@gmail.com', NULL, 'DqmbQS8q', NULL, '2025-12-08 15:48:14', 8.00, NULL, '9Q889UMZ', 'XM001', '188.253.121.195', '新加坡', NULL); +INSERT INTO `ai_user` VALUES (20, '0', '', '2025-12-08 15:50:03', '', '2025-12-08 15:50:23', NULL, 'xu89026719@gmail.com', NULL, 2, '', '', '$2a$10$xdGHiEVaGC7gyXldojpiUO0GOgyu5Pcgtw/WRTuf.TA1e.NbB8Ogu', NULL, 0, 'xu89026719@gmail.com', NULL, 'XnQAfPvA', NULL, '2025-12-08 15:50:23', 0.00, NULL, '209HPBTF', 'XM001', '38.207.136.194', '日本', NULL); +INSERT INTO `ai_user` VALUES (21, '0', '', '2025-12-08 17:20:31', '', '2025-12-08 17:22:26', NULL, '1686228', NULL, 2, '', '', '$2a$10$MpUYTeWBI6gVTqjtJBz.3.sMOz6ul.eqLQyrvY3VL2WRbFeK666fW', NULL, 0, '1686228@gmail.com', NULL, 'RyZlK7YG', NULL, '2025-12-08 17:22:26', 10.00, NULL, '9CUIDFW4', 'XM001', '208.86.32.27', '美国', NULL); +INSERT INTO `ai_user` VALUES (22, '0', '', '2025-12-08 19:45:16', '', '2025-12-09 03:12:37', NULL, 'a424569211@gmail.com', NULL, 2, '', '', '$2a$10$3TEa4ufju1sMPJdw8K0Ik.ic10m6Ms4LQFxYK2h27/pbI2qR5nJDK', NULL, 0, 'a424569211@gmail.com', NULL, '4JLEc4vd', NULL, '2025-12-09 03:12:37', 0.00, NULL, '0N5NEU38', 'XM001', '205.185.125.114', '美国', NULL); +INSERT INTO `ai_user` VALUES (23, '0', '', '2025-12-09 10:33:05', '', '2025-12-09 10:33:21', NULL, 'cc123', NULL, 2, 'https://images.iqyjsnwv.com/2025/12/09/37b754c5_706d42be-ad9a-4f11-a3ec-c0742e97ed64.png', '', '$2a$10$V.SDRP4RgM/qfAmNMSqIdOOM259j064oJCvAbDkhrSZLB99L9nhaK', NULL, 0, 'cherrylux098@gmail.com', NULL, 'rlmhwbhF', NULL, '2025-12-09 10:33:21', 4.00, NULL, 'NU8BE6J2', 'XM001', '2605:52c0:3:1a3:c05b:4bff:fe2c:115a', '美国', NULL); +INSERT INTO `ai_user` VALUES (25, '0', '', '2025-12-09 13:46:13', '', '2025-12-09 14:31:51', NULL, 'test1', NULL, 2, '', '', '$2a$10$7v6PPfozY7PHR.ep.GKobePag1aq0ZuS9j.R6lWcKloy9j1R6HgoS', NULL, 0, '123@gmail.com', NULL, 'VBb72Ym3', NULL, '2025-12-09 14:31:50', 8.00, NULL, 'UQ9WZN3V', 'XM001', '2407:cdc0:b00a::19', '香港', NULL); +INSERT INTO `ai_user` VALUES (26, '0', '', '2025-12-09 14:13:17', '', '2025-12-09 14:53:48', NULL, 'test2', NULL, 2, '', '', '$2a$10$OirrwiDFruMJQLLnNufEv.BiQzyL.KxCz1x.XVWt5R5e.ggq5m/RS', NULL, 0, '1@gmail.com', NULL, '3WFmGuER', NULL, '2025-12-09 14:53:48', 10.00, NULL, '0NEK09R6', 'XM001', '2407:cdc0:b00a::19', '香港', NULL); +INSERT INTO `ai_user` VALUES (27, '0', '', '2025-12-09 14:57:14', '', '2025-12-09 15:01:08', NULL, 'test3', NULL, 2, '', '', '$2a$10$aCcA6Mq/.xOfs6FCJwPot.ttBFv7YjULPQsF3axMz3Gm98MzMafrO', NULL, 0, '2@gmail.com', NULL, 'pqU7mW5R', NULL, '2025-12-09 15:01:08', 10000.00, NULL, '4R80E3NI', 'XM001', '2407:cdc0:b00a::19', '香港', NULL); +INSERT INTO `ai_user` VALUES (29, '0', '', '2025-12-11 10:48:59', '', '2025-12-11 10:49:08', NULL, 'test4', NULL, 2, '', '', '$2a$10$he3GMBisX7UeEHFRQYVxU.vcavkDxWWNyCSuz2QvfPKBAEZd17Xuu', NULL, 0, '3@gmail.com', NULL, 'FWzJWjjQ', NULL, '2025-12-11 10:49:08', 0.00, NULL, 'KLSC4HK0', 'ALL', '2407:cdc0:b00a::19', '香港', NULL); +INSERT INTO `ai_user` VALUES (30, '0', '', '2025-12-11 10:50:31', '', '2025-12-11 11:00:47', NULL, 'test5', NULL, 2, '', '', '$2a$10$QVUfOv2FbwhRwj35ETn0we.k76tfHNqxXZPKy0vvzxfz1jgh2cB7m', NULL, 0, '4@gmail.com', NULL, 'Rdp7l3db', NULL, '2025-12-11 11:00:47', 28.22, NULL, '1S8WYOXT', 'ALL', '2407:cdc0:b00a::19', '香港', NULL); +INSERT INTO `ai_user` VALUES (31, '0', '', '2025-12-14 01:35:44', '', '2025-12-13 17:35:44', NULL, 'whsksmhxud', NULL, 2, '', '', '$2a$10$sJ1pA9uBfgzv8O5X5Ui5G.7uVKRoZDqDqQ9BG848y7njgFtlgzWpq', NULL, 0, 'w809277959@outlook.com', NULL, 'bZEVdu4b', NULL, NULL, 0.00, NULL, '7I7TJC30', 'XM001', '103.82.93.21', '印尼', NULL); +INSERT INTO `ai_user` VALUES (32, '0', '', '2025-12-14 01:58:22', '', '2025-12-14 01:58:47', NULL, 'devin', NULL, 2, '', '', '$2a$10$NUNiFbS6WEXznA0LzlW10eH5FjX437NxO05VSnMFII4FIsPQOuoxe', NULL, 0, 'devinhe46@gmail.com', NULL, 'BZNhTE5M', NULL, '2025-12-14 01:58:47', 0.00, NULL, 'BN7FJCGI', 'XM001', '134.122.184.12', '日本', NULL); +INSERT INTO `ai_user` VALUES (33, '0', '', '2025-12-14 10:22:49', '', '2025-12-14 10:23:08', NULL, 'djwnx1123', NULL, 2, '', '', '$2a$10$z5dYmkZzGdi9G2nVSPZqJutN2Z/8FN0.cPRilsZdjzgVZKc2QCydi', NULL, 0, '2451855921@qq.com', NULL, 'nc3yv7WQ', NULL, '2025-12-14 10:23:08', 0.00, NULL, '4HF1953W', 'XM001', '103.147.45.37', '香港', NULL); +INSERT INTO `ai_user` VALUES (34, '0', '', '2025-12-14 14:52:58', '', '2025-12-14 14:54:08', NULL, 'djwnx', NULL, 2, '', '', '$2a$10$YwtgWJOnElfAn4vuvYRprO5zXrTBZx8fvx/lVIyopVdph7RkeSisS', NULL, 0, 'tianyangyu1123@gmail.com', NULL, 'pFpHVX2y', NULL, '2025-12-14 14:54:08', 0.00, NULL, 'BH9DLPCJ', 'XM001', '43.228.227.211', '香港', NULL); +INSERT INTO `ai_user` VALUES (35, '0', '', '2025-12-15 18:05:01', '', '2025-12-24 15:08:10', NULL, 'test6', NULL, 2, '', '', '$2a$10$AOJg.25lz16afHa3OfPMhuxu8oorFGeL4MqMgcxpRKjd4iY0LsmAG', NULL, 0, '5@gmail.com', NULL, 'heNUTHUX', NULL, '2025-12-24 15:08:09', 323.00, 30, 'PJCZNE1M', 'ALL', '2602:fbf1:b001::36', '美国', NULL); +INSERT INTO `ai_user` VALUES (36, '0', '', '2025-12-15 18:07:56', '', '2026-01-08 14:53:02', NULL, 'test7', NULL, 2, '', '', '$2a$10$xXtOsMjz5Zd9dsJvUBz5be.6ZphexWOedfe.TLW9bdDtzFBYESzIG', NULL, 0, '6@gmail.com', NULL, 'RXQLfyjy', NULL, '2026-01-08 14:53:01', 100419.00, 35, '24SRSLFG', 'ALL', '2407:cdc0:d002::195', '新加坡', NULL); +INSERT INTO `ai_user` VALUES (37, '0', '', '2025-12-16 14:07:46', '', '2025-12-16 14:08:05', NULL, 'test8', NULL, 2, '', '', '$2a$10$Z967MUQ6I5CCgfVJTV0l2ug2BysZmfRNvpq6c.vBVlVIX7ekM3GJi', NULL, 0, '7@gmail.com', NULL, 'kEZx2eps', NULL, '2025-12-16 14:08:04', 0.00, NULL, 'H4AFA8CH', 'ALL', '37.9.33.202', '美国', NULL); +INSERT INTO `ai_user` VALUES (38, '0', '', '2025-12-19 22:04:18', '', '2025-12-24 20:57:53', NULL, 'ghypnus', NULL, 2, '', '', '$2a$10$Cr7AQ7D9Jxk6BRE7cYn1su5B4x4aOxkf9JQMwk06Tyt5X1dn8Qr6K', NULL, 0, '1954579286@qq.com', NULL, '3tMwDlMH', NULL, '2025-12-24 20:57:52', 0.00, NULL, 'JPL28UHV', 'XM001', '85.234.69.52', '英国', NULL); +INSERT INTO `ai_user` VALUES (39, '0', '', '2025-12-27 16:48:23', '', '2026-01-06 16:32:09', NULL, 'xiaxiaxia', NULL, 2, '', '', '$2a$10$aci4cfcpANfKt1EPdVY1cORUACqXJHGx49gjD72Cc2p62K5TKT6bG', NULL, 0, 'pianochen606@gmail.com', NULL, 'yWQK4jBC', NULL, '2026-01-06 16:32:09', 9829.00, NULL, 'K0G1NBAI', 'XM001', '216.167.64.103', '美国', NULL); +INSERT INTO `ai_user` VALUES (40, '0', '', '2025-12-30 11:28:25', '', '2025-12-30 11:28:35', NULL, 'test9', NULL, 2, '', '', '$2a$10$RrqVCQk2eKBrk4LqVlVLg.MCSmKlIJidSpw/aH3jlA4oGf8AEvbYi', NULL, 0, '8@gmail.com', NULL, 'wSsxXKeH', NULL, '2025-12-30 11:28:35', 336.00, 35, 'Z6UI3X6S', 'ALL', '2602:fbf1:b001::36', '美国', NULL); +INSERT INTO `ai_user` VALUES (41, '0', '', '2025-12-30 11:58:13', '', '2025-12-30 11:58:20', NULL, 'test10', NULL, 2, '', '', '$2a$10$iyc.quT3QzzzROdjLN1S8.GLE.epyFAo4FvBDOlokDbu4JMODrr3S', NULL, 0, '9@gmail.com', NULL, 'lRbwts88', NULL, '2025-12-30 11:58:20', 110.00, 40, 'LJSSMAQO', 'ALL', '2602:fbf1:b001::36', '美国', NULL); +INSERT INTO `ai_user` VALUES (42, '0', '', '2025-12-30 13:42:02', '', '2025-12-30 13:42:09', NULL, 'test11', NULL, 2, '', '', '$2a$10$ke66b3aOZ67NaUT2WQepyO2EmVYkSEBYLB/NFSRID.S3ejHaU5Og.', NULL, 0, '10@gmail.com', NULL, 'BrEg6XmM', NULL, '2025-12-30 13:42:09', 225.00, NULL, 'IHOF63N5', 'ALL', '2602:fbf1:b001::36', '美国', NULL); +INSERT INTO `ai_user` VALUES (43, '0', '', '2025-12-31 14:20:06', '', '2025-12-31 14:20:12', NULL, 'a001', NULL, 2, '', '', '$2a$10$Z02VVJ5/LaiTzTp22b2zXOTV8YE/6BMNVrboTj5cuEthXuPpP97Mi', NULL, 0, '11@gmail.com', NULL, 'Xf38CXD6', NULL, '2025-12-31 14:20:12', 1089.00, NULL, 'LXNFP1VS', 'ALL', '2602:fbf1:b001::36', '美国', NULL); +INSERT INTO `ai_user` VALUES (44, '0', '', '2025-12-31 14:26:20', '', '2025-12-31 14:26:25', NULL, 'a002', NULL, 2, '', '', '$2a$10$4ZnF/zh3q3E07GBpthtL.ufsxQOt2u/eu8YzcFnmPO5dUa1RJ6mkG', NULL, 0, 'c46258724hk@gmail.com', NULL, 'knt2yT2r', NULL, '2025-12-31 14:26:25', 230.00, 43, 'JW07BAHC', 'ALL', '2602:fbf1:b001::36', '美国', NULL); + +-- 已有库升级:ALTER TABLE ai_user ADD COLUMN dept_id bigint NULL DEFAULT NULL COMMENT '归属部门(sys_dept.dept_id)' AFTER country; -- ---------------------------- -- Table structure for ai_user_message @@ -4178,6 +4195,7 @@ CREATE TABLE `sys_dept` ( `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人', `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话', `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱', + `byte_api_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'Byte API Key', `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)', `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', @@ -4190,21 +4208,23 @@ CREATE TABLE `sys_dept` ( -- ---------------------------- -- Records of sys_dept -- ---------------------------- -INSERT INTO `sys_dept` VALUES (100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:46', '', NULL); -INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); -INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); -INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); -INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); -INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:48', '', NULL); -INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:48', '', NULL); -INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); -INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); -INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); -INSERT INTO `sys_dept` VALUES (200, 100, '0,100', '胸部', 3, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:07:38', '', NULL); -INSERT INTO `sys_dept` VALUES (201, 200, '0,100,200', '大奶', 1, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:07:48', '', NULL); -INSERT INTO `sys_dept` VALUES (202, 201, '0,100,200,201', '水滴型', 1, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:04', '', NULL); -INSERT INTO `sys_dept` VALUES (203, 200, '0,100,200', '小奶', 2, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:13', '', NULL); -INSERT INTO `sys_dept` VALUES (204, 201, '0,100,200,201', '粉色', 2, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:25', '', NULL); +INSERT INTO `sys_dept` VALUES (100, 0, '0', '若依科技', 0, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:46', '', NULL); +INSERT INTO `sys_dept` VALUES (101, 100, '0,100', '深圳总公司', 1, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); +INSERT INTO `sys_dept` VALUES (102, 100, '0,100', '长沙分公司', 2, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); +INSERT INTO `sys_dept` VALUES (103, 101, '0,100,101', '研发部门', 1, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); +INSERT INTO `sys_dept` VALUES (104, 101, '0,100,101', '市场部门', 2, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:47', '', NULL); +INSERT INTO `sys_dept` VALUES (105, 101, '0,100,101', '测试部门', 3, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:48', '', NULL); +INSERT INTO `sys_dept` VALUES (106, 101, '0,100,101', '财务部门', 4, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:48', '', NULL); +INSERT INTO `sys_dept` VALUES (107, 101, '0,100,101', '运维部门', 5, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); +INSERT INTO `sys_dept` VALUES (108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); +INSERT INTO `sys_dept` VALUES (109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', NULL, '0', '0', 'admin', '2025-11-09 01:56:49', '', NULL); +INSERT INTO `sys_dept` VALUES (200, 100, '0,100', '胸部', 3, NULL, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:07:38', '', NULL); +INSERT INTO `sys_dept` VALUES (201, 200, '0,100,200', '大奶', 1, NULL, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:07:48', '', NULL); +INSERT INTO `sys_dept` VALUES (202, 201, '0,100,200,201', '水滴型', 1, NULL, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:04', '', NULL); +INSERT INTO `sys_dept` VALUES (203, 200, '0,100,200', '小奶', 2, NULL, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:13', '', NULL); +INSERT INTO `sys_dept` VALUES (204, 201, '0,100,200,201', '粉色', 2, NULL, NULL, NULL, NULL, '0', '2', 'admin', '2025-11-25 13:08:25', '', NULL); + +-- 已有数据库升级可执行:ALTER TABLE sys_dept ADD COLUMN byte_api_key varchar(255) NULL DEFAULT NULL COMMENT 'Byte API Key' AFTER email; -- ---------------------------- -- Table structure for sys_dict_data @@ -4672,6 +4692,11 @@ INSERT INTO `sys_menu` VALUES (1058, '导入代码', 116, 4, '#', '', '', '', 1, INSERT INTO `sys_menu` VALUES (1059, '预览代码', 116, 5, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 'admin', '2025-11-09 01:57:14', '', NULL, ''); INSERT INTO `sys_menu` VALUES (1060, '生成代码', 116, 6, '#', '', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 'admin', '2025-11-09 01:57:14', '', NULL, ''); INSERT INTO `sys_menu` VALUES (2000, '综合管理', 0, 4, 'ai-manager', NULL, NULL, '', 1, 0, 'M', '0', '0', '', 'redis-list', 'admin', '2025-11-12 20:19:15', 'admin', '2025-11-20 20:06:49', ''); +INSERT INTO `sys_menu` VALUES (2100, 'AI部门管理', 2003, 0, 'aiDept', 'ai/dept/index', NULL, '', 1, 0, 'C', '0', '0', 'ai:dept:list', 'tree', 'admin', '2026-03-30 10:00:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2101, 'AI部门查询', 2100, 1, '', '', NULL, '', 1, 0, 'F', '0', '0', 'ai:dept:query', '#', 'admin', '2026-03-30 10:00:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2102, 'AI部门新增', 2100, 2, '', '', NULL, '', 1, 0, 'F', '0', '0', 'ai:dept:add', '#', 'admin', '2026-03-30 10:00:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2103, 'AI部门修改', 2100, 3, '', '', NULL, '', 1, 0, 'F', '0', '0', 'ai:dept:edit', '#', 'admin', '2026-03-30 10:00:00', '', NULL, ''); +INSERT INTO `sys_menu` VALUES (2104, 'AI部门删除', 2100, 4, '', '', NULL, '', 1, 0, 'F', '0', '0', 'ai:dept:remove', '#', 'admin', '2026-03-30 10:00:00', '', NULL, ''); INSERT INTO `sys_menu` VALUES (2001, 'AI用户管理', 2003, 1, 'aiUser', 'ai/user/index', NULL, '', 1, 0, 'C', '0', '0', 'ai:user:list', 'user', 'admin', '2025-11-12 20:45:34', 'admin', '2025-11-13 22:19:09', ''); INSERT INTO `sys_menu` VALUES (2002, 'AI管理', 2000, 4, 'aiManager', 'ai/manager/index', NULL, '', 1, 0, 'C', '0', '0', 'ai:manager:list', 'online', 'admin', '2025-11-13 19:18:54', 'admin', '2025-11-13 22:49:28', ''); INSERT INTO `sys_menu` VALUES (2003, '用户管理', 2000, 1, 'aiUserManger', NULL, NULL, '', 1, 0, 'M', '0', '0', NULL, 'peoples', 'admin', '2025-11-13 22:18:42', '', NULL, ''); @@ -5813,4 +5838,36 @@ INSERT INTO `user_message` VALUES (2, 2); INSERT INTO `user_message` VALUES (2, 3); INSERT INTO `user_message` VALUES (2, 4); +-- ---------------------------- +-- Table structure for ai_template +-- ---------------------------- +DROP TABLE IF EXISTS `ai_template`; +CREATE TABLE `ai_template` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '自增ID', + `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模版名称', + `chinese_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模版中文内容', + `english_content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '模版英文内容', + `image_url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模版图片URL', + `ai_id` bigint NULL DEFAULT NULL COMMENT '关联AI类型ID', + `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态(0禁用 1启用)', + `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者', + `create_time` datetime NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者', + `update_time` datetime NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)', + PRIMARY KEY (`id`) USING BTREE, + KEY `idx_ai_id` (`ai_id`) USING BTREE, + KEY `idx_status` (`status`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1001 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'AI模板表' ROW_FORMAT = DYNAMIC; + +-- ---------------------------- +-- Records of ai_template +-- ---------------------------- +INSERT INTO `ai_template` (`name`, `chinese_content`, `english_content`, `image_url`, `ai_id`, `status`, `remark`) VALUES +('默认写真模板', '一个穿着衣服的年轻女性,微笑面对镜头,高清写真风格', 'A young woman wearing clothes, smiling at the camera, high-definition portrait style', 'https://seedance-1331490964.cos.ap-guangzhou.myqcloud.com/ai/default-template.jpg', 11, 1, '默认写真模板'), +('艺术裸体模板', '一个优雅的艺术裸体女性,柔和光线,专业摄影风格', 'An elegant artistic nude female with soft lighting, professional photography style', 'https://seedance-1331490964.cos.ap-guangzhou.myqcloud.com/ai/nude-art.jpg', 11, 1, '艺术裸体模板'), +('时尚都市模板', '时尚都市年轻女性写真,现代潮流风格', 'Fashionable urban young woman portrait, modern trendy style', 'https://seedance-1331490964.cos.ap-guangzhou.myqcloud.com/ai/fashion.jpg', 21, 1, '时尚写真模板'), +('性感写真模板', '性感迷人女性写真,专业灯光和构图', 'Sexy and charming female portrait with professional lighting and composition', 'https://seedance-1331490964.cos.ap-guangzhou.myqcloud.com/ai/sexy.jpg', 11, 1, '性感写真模板'); + SET FOREIGN_KEY_CHECKS = 1;