From d7e144b8776e62c1f5cbf23bffbc5e79f8f21c5f Mon Sep 17 00:00:00 2001 From: H1d3rOne Date: Wed, 11 Mar 2026 13:44:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0AI=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E5=8F=96=E5=90=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 实用工具页面添加取名申请入口 - 创建取名申请页面tool-naming.vue - 后端添加NamingController.java - 添加AI取名提示模板 --- .../xuan/controller/NamingController.java | 136 ++++++ .../java/xuan/service/PromptTemplates.java | 35 ++ xuan-deduct-uniapp/src/pages.json | 10 +- .../src/pages/tool-naming/tool-naming.vue | 432 ++++++++++++++++++ xuan-deduct-uniapp/src/pages/tools/tools.vue | 23 +- xuan-deduct-uniapp/src/utils/api.js | 11 + 6 files changed, 644 insertions(+), 3 deletions(-) create mode 100644 src/main/java/xuan/controller/NamingController.java create mode 100644 xuan-deduct-uniapp/src/pages/tool-naming/tool-naming.vue diff --git a/src/main/java/xuan/controller/NamingController.java b/src/main/java/xuan/controller/NamingController.java new file mode 100644 index 0000000..1c84393 --- /dev/null +++ b/src/main/java/xuan/controller/NamingController.java @@ -0,0 +1,136 @@ +package xuan.controller; + +import org.springframework.web.bind.annotation.*; +import xuan.service.HunYuanAiService; +import xuan.service.PromptTemplates; + +import java.util.*; + +@RestController +@RequestMapping("/api/naming") +public class NamingController { + + private final HunYuanAiService aiService = new HunYuanAiService(); + + @PostMapping("/generate") + public Map generate(@RequestBody NamingRequest request) { + Map result = new HashMap<>(); + try { + String surname = request.getSurname() != null ? request.getSurname() : "张"; + String gender = request.getGender() != null ? request.getGender() : "男"; + String requirements = request.getRequirements() != null ? request.getRequirements() : "寓意美好、朗朗上口"; + + String aiResponse = aiService.chat( + PromptTemplates.getNamingSystemPrompt(), + PromptTemplates.getNamingUserPrompt(surname, gender, requirements) + ); + + List> names = parseNamesFromAI(aiResponse, surname); + + Map data = new HashMap<>(); + data.put("surname", surname); + data.put("gender", gender); + data.put("requirements", requirements); + data.put("names", names); + data.put("aiAnalysis", aiResponse); + + result.put("success", true); + result.put("data", data); + } catch (Exception e) { + result.put("success", false); + result.put("error", e.getMessage()); + } + return result; + } + + private List> parseNamesFromAI(String aiResponse, String surname) { + List> names = new ArrayList<>(); + + try { + String[] lines = aiResponse.split("\n"); + for (String line : lines) { + line = line.trim(); + if (line.isEmpty()) continue; + + if (line.matches("^[1-3][.、.].*") || line.matches("^[①②③].*")) { + Map nameInfo = new HashMap<>(); + + String name = ""; + String meaning = ""; + + if (line.contains(":") || line.contains(":")) { + String[] parts = line.split("[::]", 2); + if (parts.length >= 2) { + String namePart = parts[0].replaceAll("^[1-3][.、.\\s]+", "") + .replaceAll("^[①②③\\s]+", "") + .trim(); + name = surname + namePart; + meaning = parts[1].trim(); + } + } else if (line.contains("(") || line.contains("(")) { + int bracketIndex = line.indexOf("("); + if (bracketIndex == -1) bracketIndex = line.indexOf("("); + + String namePart = line.substring(0, bracketIndex) + .replaceAll("^[1-3][.、.\\s]+", "") + .replaceAll("^[①②③\\s]+", "") + .trim(); + name = surname + namePart; + meaning = line.substring(bracketIndex).trim(); + } else { + String namePart = line.replaceAll("^[1-3][.、.\\s]+", "") + .replaceAll("^[①②③\\s]+", "") + .trim(); + if (namePart.length() >= 1 && namePart.length() <= 3) { + name = surname + namePart; + meaning = "寓意美好"; + } + } + + if (!name.isEmpty() && name.length() >= 2) { + nameInfo.put("name", name); + nameInfo.put("meaning", meaning.isEmpty() ? "寓意美好" : meaning); + names.add(nameInfo); + } + + if (names.size() >= 3) break; + } + } + + if (names.isEmpty()) { + String[] defaultNames = {"伟", "明", "华"}; + String[] defaultMeanings = { + "寓意伟大、卓越,前途光明", + "寓意聪明、睿智,前程似锦", + "寓意才华横溢,光耀门楣" + }; + for (int i = 0; i < 3; i++) { + Map nameInfo = new HashMap<>(); + nameInfo.put("name", surname + defaultNames[i]); + nameInfo.put("meaning", defaultMeanings[i]); + names.add(nameInfo); + } + } + } catch (Exception e) { + Map nameInfo = new HashMap<>(); + nameInfo.put("name", surname + "明"); + nameInfo.put("meaning", "寓意聪明、睿智,前程似锦"); + names.add(nameInfo); + } + + return names; + } + + public static class NamingRequest { + private String surname; + private String gender; + private String requirements; + + public String getSurname() { return surname; } + public void setSurname(String surname) { this.surname = surname; } + public String getGender() { return gender; } + public void setGender(String gender) { this.gender = gender; } + public String getRequirements() { return requirements; } + public void setRequirements(String requirements) { this.requirements = requirements; } + } +} diff --git a/src/main/java/xuan/service/PromptTemplates.java b/src/main/java/xuan/service/PromptTemplates.java index 8a99379..4b6a6bf 100644 --- a/src/main/java/xuan/service/PromptTemplates.java +++ b/src/main/java/xuan/service/PromptTemplates.java @@ -404,4 +404,39 @@ public class PromptTemplates { return sb.toString(); } + + public static String getNamingSystemPrompt() { + return "你是一位精通中华传统文化和姓名学的取名大师。" + + "你擅长根据姓氏、性别和取名要求,结合五行八字、诗词典故、音律美感等因素," + + "为人们取一个寓意美好、朗朗上口、符合传统文化的名字。" + + "你会给出3个最匹配的名字,并详细解释每个名字的含义和寓意。" + + "请用温暖、专业的语气进行取名建议。"; + } + + public static String getNamingUserPrompt(String surname, String gender, String requirements) { + StringBuilder sb = new StringBuilder(); + sb.append("请为以下情况取名:\n\n"); + sb.append("姓氏:").append(surname).append("\n"); + sb.append("性别:").append(gender).append("\n"); + sb.append("取名要求:").append(requirements).append("\n\n"); + + sb.append("请给出3个最匹配的名字,每个名字需要包含:\n"); + sb.append("1. 完整姓名(姓氏+名字)\n"); + sb.append("2. 名字的含义和寓意\n"); + sb.append("3. 名字的文化出处或典故(如有)\n"); + sb.append("4. 名字的音律特点\n\n"); + + sb.append("请按以下格式输出:\n"); + sb.append("1. 【姓名】含义:xxx\n"); + sb.append("2. 【姓名】含义:xxx\n"); + sb.append("3. 【姓名】含义:xxx\n\n"); + + sb.append("注意:\n"); + sb.append("- 名字要符合性别特点\n"); + sb.append("- 名字要有美好的寓意\n"); + sb.append("- 名字要朗朗上口,避免生僻字\n"); + sb.append("- 名字要有文化底蕴\n"); + + return sb.toString(); + } } diff --git a/xuan-deduct-uniapp/src/pages.json b/xuan-deduct-uniapp/src/pages.json index f5e2a8a..4a58112 100644 --- a/xuan-deduct-uniapp/src/pages.json +++ b/xuan-deduct-uniapp/src/pages.json @@ -253,7 +253,15 @@ "path": "pages/tool-xingzuo/tool-xingzuo", "style": { "navigationBarTitleText": "星座查询", - "navigationBarBackgroundColor": "#8B5CF6", + "navigationBarBackgroundColor": "#F59E0B", + "navigationBarTextStyle": "white" + } + }, + { + "path": "pages/tool-naming/tool-naming", + "style": { + "navigationBarTitleText": "AI智能取名", + "navigationBarBackgroundColor": "#A855F7", "navigationBarTextStyle": "white" } }, diff --git a/xuan-deduct-uniapp/src/pages/tool-naming/tool-naming.vue b/xuan-deduct-uniapp/src/pages/tool-naming/tool-naming.vue new file mode 100644 index 0000000..5a83131 --- /dev/null +++ b/xuan-deduct-uniapp/src/pages/tool-naming/tool-naming.vue @@ -0,0 +1,432 @@ +