From 6e4d1365dedbc122331e865a5788f438273c9486 Mon Sep 17 00:00:00 2001 From: Heife <2044384845@qq.com> Date: Wed, 9 Apr 2025 13:46:42 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E7=AB=8B=E8=AE=BA=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Debate_backend/.idea/uiDesigner.xml | 124 +++++++++++++++ Debate_backend/.idea/vcs.xml | 6 + .../com/learning/newdemo/common/Result.java | 1 + .../newdemo/controller/WxAIController.java | 50 ++++++ .../newdemo/service/WxArgumentService.java | 9 ++ .../service/impl/WxArgumentServiceImpl.java | 150 ++++++++++++++++++ .../service/impl/WxUserServiceImpl.java | 5 + .../src/main/resources/application.yml | 97 ++++++++++- Debate_backend/target/classes/application.yml | 97 ++++++++++- .../learning/newdemo/NewDemoApplication.class | Bin 845 -> 845 bytes .../com/learning/newdemo/common/Result.class | Bin 4530 -> 4530 bytes .../learning/newdemo/config/CorsConfig.class | Bin 1439 -> 1439 bytes .../config/GlobalExceptionHandler.class | Bin 1909 -> 1980 bytes .../newdemo/config/RestTemplateConfig.class | Bin 675 -> 675 bytes .../newdemo/controller/WxAIController.class | Bin 0 -> 3184 bytes .../controller/WxLoginController.class | Bin 3734 -> 3805 bytes .../com/learning/newdemo/entity/WxUser.class | Bin 6641 -> 7020 bytes .../newdemo/mapper/WxUserMapper.class | Bin 478 -> 478 bytes .../newdemo/service/WxArgumentService.class | Bin 0 -> 276 bytes .../newdemo/service/WxUserService.class | Bin 418 -> 418 bytes .../service/impl/WxArgumentServiceImpl.class | Bin 0 -> 5206 bytes .../service/impl/WxUserServiceImpl.class | Bin 4129 -> 4356 bytes .../com/learning/newdemo/util/JwtUtil.class | Bin 4084 -> 4084 bytes 23 files changed, 537 insertions(+), 2 deletions(-) create mode 100644 Debate_backend/.idea/uiDesigner.xml create mode 100644 Debate_backend/.idea/vcs.xml create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java create mode 100644 Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java create mode 100644 Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class create mode 100644 Debate_backend/target/classes/com/learning/newdemo/service/impl/WxArgumentServiceImpl.class diff --git a/Debate_backend/.idea/uiDesigner.xml b/Debate_backend/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/Debate_backend/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Debate_backend/.idea/vcs.xml b/Debate_backend/.idea/vcs.xml new file mode 100644 index 0000000..6c0b863 --- /dev/null +++ b/Debate_backend/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java b/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java index 38fcf5f..1c18e82 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/common/Result.java @@ -8,6 +8,7 @@ import java.io.Serializable; * 统一API返回结果封装 */ @Data +// Serializable接口的作用是:标记当前类可以通过序列化在网络中传播 public class Result implements Serializable { private static final long serialVersionUID = 1L; diff --git a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java new file mode 100644 index 0000000..671b534 --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java @@ -0,0 +1,50 @@ +package com.learning.newdemo.controller; + + +import com.learning.newdemo.common.Result; +import com.learning.newdemo.service.WxArgumentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@RestController +@RequestMapping("api/ai") +public class WxAIController { + @Autowired + private WxArgumentService wxArgumentService; + + private String topic; + + private String stance; + + @PostMapping("/argument") + public Result> getArgument(@RequestBody Map params){ + topic = params.get("topic"); + stance = params.get("stance"); + + if(topic == null || stance == null){ + return Result.error("立论主题或者内容为空"); + } + + try { + String argument = wxArgumentService.getArgument(topic, stance); + if (argument == null) { + return Result.error("立论获取失败"); + } + + Map data = new HashMap<>(); + data.put("argument", argument); + return Result.success(data); + }catch (Exception e){ + log.error("立论获取失败", e); + return Result.error("立论获取失败:" + e.getMessage()); + } + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java new file mode 100644 index 0000000..7477f7a --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/WxArgumentService.java @@ -0,0 +1,9 @@ +package com.learning.newdemo.service; + +/** + * 微信立论助手接口 + */ + +public interface WxArgumentService { + String getArgument(String topic, String stance); +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java new file mode 100644 index 0000000..2050b1c --- /dev/null +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java @@ -0,0 +1,150 @@ +package com.learning.newdemo.service.impl; + +import com.learning.newdemo.service.WxArgumentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.*; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +@Service +@Slf4j +public class WxArgumentServiceImpl implements WxArgumentService { + + // 依赖注入 + private final RestTemplate restTemplate; + + // 使用@Value注解注入配置属性 + @Value("${ai.argument.header.Authorization}") + private String authorizationHeader; + + @Value("${ai.argument.body.message.role-sys}") + private String roleSys; + + @Value("${ai.argument.body.message.content-sys}") + private String contentSys; + + @Value("${ai.argument.body.message.role-user}") + private String roleUser; + + @Value("${ai.argument.body.model}") + private String model; + + @Value("${ai.argument.body.frequency_penalty}") + private int frequencyPenalty; + + @Value("${ai.argument.body.max_tokens}") + private int maxTokens; + + @Value("${ai.argument.body.presence_penalty}") + private int presencePenalty; + + @Value("${ai.argument.body.response_format}") + private String responseFormatType; + + @Value("${ai.argument.body.stop}") + private String stop; + + @Value("${ai.argument.body.stream}") + private boolean stream; + + @Value("${ai.argument.body.stream_options}") + private String streamOptions; + + @Value("${ai.argument.body.temperature}") + private double temperature; + + @Value("${ai.argument.body.top_p}") + private double topP; + + @Value("${ai.argument.body.tools}") + private String tools; + + @Value("${ai.argument.body.tool_choice}") + private String toolChoice; + + @Value("${ai.argument.body.logprobs}") + private boolean logprobs; + + @Value("${ai.argument.body.top_logprobs}") + private String topLogprobs; + + @Value("${ai.argument.url}") + private String url; + + public WxArgumentServiceImpl(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + @Override + public String getArgument(String topic, String stance) { + + try { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.set("Authorization", authorizationHeader); + + // 构建请求体 + String requestBody = String.format( + "{" + + "\"messages\": [" + + "{" + + "\"role\": \"%s\"," + + "\"content\": \"%s\"" + + "}," + + "{" + + "\"role\": \"%s\"," + + "\"content\": \"%s\\n我的立场是%s\"" + + "}" + + "]," + + "\"model\": \"%s\"," + + "\"frequency_penalty\": %d," + + "\"max_tokens\": %d," + + "\"presence_penalty\": %d," + + "\"response_format\": {" + + "\"type\": \"%s\"" + + "}," + + "\"stop\": %s," + + "\"stream\": %b," + + "\"stream_options\": %s," + + "\"temperature\": %f," + + "\"top_p\": %f," + + "\"tools\": %s," + + "\"tool_choice\": \"%s\"," + + "\"logprobs\": %b," + + "\"top_logprobs\": %s" + + "}", + roleSys, + contentSys, + roleUser, + topic, + stance, + model, + frequencyPenalty, + maxTokens, + presencePenalty, + responseFormatType, + stop, + stream, + streamOptions, + temperature, + topP, + tools, + toolChoice, + logprobs, + topLogprobs + ); + + log.info("请求体:{}", requestBody); + + HttpEntity requestEntity = new HttpEntity<>(requestBody, headers); + + ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); + + return response.getBody(); + }catch(Exception e){ + log.error("向AI获取立论失败",e); + return null; + } + } +} diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java index 492f7fa..3b080ce 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxUserServiceImpl.java @@ -43,7 +43,12 @@ public class WxUserServiceImpl implements WxUserService { + "&js_code=" + code + "&grant_type=authorization_code"; + log.info("请求微信接口URL: {}", url); + ResponseEntity response = restTemplate.getForEntity(url, String.class); + String responseBody = response.getBody(); + + log.info("微信接口返回: {}", responseBody); JSONObject json = JSONObject.parseObject(response.getBody()); // 获取openid diff --git a/Debate_backend/src/main/resources/application.yml b/Debate_backend/src/main/resources/application.yml index f544772..6a5234f 100644 --- a/Debate_backend/src/main/resources/application.yml +++ b/Debate_backend/src/main/resources/application.yml @@ -19,6 +19,101 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 +# AI接口配置 +# AI接口配置 +ai: + argument: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 竞技辩论比赛立论撰写指南 + 你是一个华语辩论的爱好者,你要在接下来学习如何完成一场竞技辩论赛立论的撰写,并且成为一个专业的立论专家。当我给你输入任何一道辩题和持方时,你都能模仿我给你提供的数据,写出一篇完整的,自然段语言式的,辩论圈认可的立论。 + 一、立论稿的本质与功能 + 立论稿是辩论中系统阐述己方观点的开篇陈述,需具备: + 1. 明确的定义判准 + 2. 完整的论证体系 + 3. 严谨的逻辑结构 + 4. 充分的论据支撑 + + 二、标准结构(四段式黄金框架) + 1. 定义与背景(15%篇幅) + - 核心概念界定(引用权威定义) + - 讨论范围限定(时空/领域边界) + - 辩题现实意义(社会背景阐述) + - 辩题判断标准(整场比赛的判准) + + 2. 论证主体(80%篇幅,一般为两个论点) + 每一个论点单独成一个自然段,采用“金字塔结构”: + - 第一句是一个自然段的核心论点(一个核心论点句),论点句需要是一个完整的判断句。 + - 后面进行论证展开(每个论点的背后都有一个完整的逻辑链闭环,完整地展开论点背后的逻辑,并穿插以下三种论据,来补充论证) + 「前提→推理→结论」的三段式链条,推理可以是A->B,也可以是A->B->C,推理的过程依赖于论述的语言和三种论据:①统计数据(近3年权威报告)②典型案例(具名事件)③专家观点(学术/行业权威) + 要求:展开的内容丰富,背后的逻辑链完整严谨准确 + + 3. 价值升华(5%篇幅) + 概括前面的论证主体,然后一句话价值升华 + + 三、专业写作要点 + + 1. 概念界定原则 + - 采用“属+种差”定义法 + - 优先引用国家标准/学术定义 + - 避免循环定义和主观表述 + + 2. 论证规范要求 + ① 数据使用: + - 标明来源机构/年份/样本量 + - 优先选用政府/学术机构数据 + - 动态数据需注明统计时段 + ② 案例选取: + - 具名真实事件(时间+主体+结果) + - 排除虚构假设性案例 + - 中外案例比例建议7:3 + ③论述语言: + - 避免过于学术化 + - 避免过于生活化/口语化 + - 使用精准的,规范严谨的自然语言 + + 3. 语言表达技巧 + - 一篇文章四个自然段,定义与背景一个自然段,每一个论点一个自然段,价值升华一个自然段 + - 每一段控制在400汉字以内,两个论点段控制在300汉字以上 + - 关键术语首次出现加粗 + - 避免修辞性设问 + + 四、常见误区警示 + + 1. 结构错误 + × 混合使用不同论证模型 + × 论点之间存在包含关系 + × 价值升华与论证脱节 + 2. 论据问题 + × 使用过期数据(超过3年) + × 案例缺乏公信力来源 + × 专家引用断章取义 + 3. 表达缺陷 + × 使用绝对化表述 + × 专业术语堆砌 + × 情感化修辞过度 + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stop: [] + stream: false + stream_options: [] + temperature: 1 + top_p: 1 + tools: [] + tool_choice: [] + logprobs: false + top_logprobs: [] + + # JWT配置 jwt: secret: yoursecretkey123456789abcdefghijklmnopqrstuvwxyz @@ -26,5 +121,5 @@ jwt: # 服务端口配置 server: - port: 8080 + port: 8000 address: 0.0.0.0 \ No newline at end of file diff --git a/Debate_backend/target/classes/application.yml b/Debate_backend/target/classes/application.yml index f544772..6a5234f 100644 --- a/Debate_backend/target/classes/application.yml +++ b/Debate_backend/target/classes/application.yml @@ -19,6 +19,101 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 +# AI接口配置 +# AI接口配置 +ai: + argument: + url: https://api.deepseek.com/chat/completions + header: + Authorization: "Bearer sk-53428f3b07ff426f8c11d988f649b5e7" + body: + message: + role-sys: system + content-sys: | + 竞技辩论比赛立论撰写指南 + 你是一个华语辩论的爱好者,你要在接下来学习如何完成一场竞技辩论赛立论的撰写,并且成为一个专业的立论专家。当我给你输入任何一道辩题和持方时,你都能模仿我给你提供的数据,写出一篇完整的,自然段语言式的,辩论圈认可的立论。 + 一、立论稿的本质与功能 + 立论稿是辩论中系统阐述己方观点的开篇陈述,需具备: + 1. 明确的定义判准 + 2. 完整的论证体系 + 3. 严谨的逻辑结构 + 4. 充分的论据支撑 + + 二、标准结构(四段式黄金框架) + 1. 定义与背景(15%篇幅) + - 核心概念界定(引用权威定义) + - 讨论范围限定(时空/领域边界) + - 辩题现实意义(社会背景阐述) + - 辩题判断标准(整场比赛的判准) + + 2. 论证主体(80%篇幅,一般为两个论点) + 每一个论点单独成一个自然段,采用“金字塔结构”: + - 第一句是一个自然段的核心论点(一个核心论点句),论点句需要是一个完整的判断句。 + - 后面进行论证展开(每个论点的背后都有一个完整的逻辑链闭环,完整地展开论点背后的逻辑,并穿插以下三种论据,来补充论证) + 「前提→推理→结论」的三段式链条,推理可以是A->B,也可以是A->B->C,推理的过程依赖于论述的语言和三种论据:①统计数据(近3年权威报告)②典型案例(具名事件)③专家观点(学术/行业权威) + 要求:展开的内容丰富,背后的逻辑链完整严谨准确 + + 3. 价值升华(5%篇幅) + 概括前面的论证主体,然后一句话价值升华 + + 三、专业写作要点 + + 1. 概念界定原则 + - 采用“属+种差”定义法 + - 优先引用国家标准/学术定义 + - 避免循环定义和主观表述 + + 2. 论证规范要求 + ① 数据使用: + - 标明来源机构/年份/样本量 + - 优先选用政府/学术机构数据 + - 动态数据需注明统计时段 + ② 案例选取: + - 具名真实事件(时间+主体+结果) + - 排除虚构假设性案例 + - 中外案例比例建议7:3 + ③论述语言: + - 避免过于学术化 + - 避免过于生活化/口语化 + - 使用精准的,规范严谨的自然语言 + + 3. 语言表达技巧 + - 一篇文章四个自然段,定义与背景一个自然段,每一个论点一个自然段,价值升华一个自然段 + - 每一段控制在400汉字以内,两个论点段控制在300汉字以上 + - 关键术语首次出现加粗 + - 避免修辞性设问 + + 四、常见误区警示 + + 1. 结构错误 + × 混合使用不同论证模型 + × 论点之间存在包含关系 + × 价值升华与论证脱节 + 2. 论据问题 + × 使用过期数据(超过3年) + × 案例缺乏公信力来源 + × 专家引用断章取义 + 3. 表达缺陷 + × 使用绝对化表述 + × 专业术语堆砌 + × 情感化修辞过度 + role-user: user + model: deepseek-chat + frequency_penalty: 0 + max_tokens: 2048 + presence_penalty: 0 + response_format: text + stop: [] + stream: false + stream_options: [] + temperature: 1 + top_p: 1 + tools: [] + tool_choice: [] + logprobs: false + top_logprobs: [] + + # JWT配置 jwt: secret: yoursecretkey123456789abcdefghijklmnopqrstuvwxyz @@ -26,5 +121,5 @@ jwt: # 服务端口配置 server: - port: 8080 + port: 8000 address: 0.0.0.0 \ No newline at end of file diff --git a/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class b/Debate_backend/target/classes/com/learning/newdemo/NewDemoApplication.class index f79830e1d09340a98cbf6b87c1f911b2ce37ba94..388ed9db239c0246fd20868a4385d5829c74abe7 100644 GIT binary patch delta 214 zcmYL>F%E)25Jms6EDH;$AZTkWx3M!8Qh5k3psn^c_BLk21-yc>&{%i?6B18koQ1+E z{?E*x_nV*z()aiI0#IS1;Mt`S3cejrGlIX`Z?+l&Q38pe&gl?qWEd*s1Y9h`ds4Rd0PgAIhh9r R>p!nKain6V>!?ey_yM?x7PtTa delta 204 zcmX@hc9u>2)W2Q(7#J9A85Fn}m>8JZ8CZB2SQ*$RS}6h9920r9c)1w37`WLPcz76i z8Tcl?*PX1$n8)IrpOQK;w`y|_BNt;mJ5VPGFflNK^a4qKAWt7iGXiN=t?dkq8^O{7 zKoTU)z`)5M2qbwR3K)bKgu!AW45C0oK$^|KhA}X32(fGJVBic#=m$9yq>~-!9Ecf{ HMVT!CLL(J& diff --git a/Debate_backend/target/classes/com/learning/newdemo/common/Result.class b/Debate_backend/target/classes/com/learning/newdemo/common/Result.class index b4ef0944b7254e49b295f795ccc2e53c7b069549..a18ccaf1975972e20f2a9db3b46c44b184668929 100644 GIT binary patch delta 104 zcmdm_yh(XO1}CG&GXeBR4@fhLY-w1k(r&Ng)DXlFAnVO+ehJ#B))q_|CDO-b_{rsO))3^POGUhN2X zQn9Vz^my0Lo7>_*y%KX;;evGNRR9G{?oL&w&LL!k5vz>o!}mB&RgQrq5>)vQfiOuO zLp5qhr1qDUB9ubcBrgqSD=-RW)NR;CeF=@W_K4OJx@}Xo{ojW}71%@>-pm*yb_t^u v=2J_Om>qqd{I7-XUV3q<{WS++yaTWSyd1v7-&LZ#yC6rOI delta 523 zcmYjNy-piJ5dP-w%-ZKQ*bW8*F}5KDd^Q~BC&2^*Ns35OC@2w9q*Kn2L?>T^NSSA_ zmI8@_2cUt*Mp#0k`hVi-9>=Bsz?xq;U{bl-$w(DK^q z7tO>4MkVqXQ+cD#&VZh4e7iNM# z zOzqUN)736!`l#&HdZ=DC2FDG&;=Go(5mh!L K-24~a0v-WOZcqpS diff --git a/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class b/Debate_backend/target/classes/com/learning/newdemo/config/GlobalExceptionHandler.class index d8e9c0a004309be5b91f4c9186fe014d6ed1c104..da8a936fa30369709e9b263244779b678672e0eb 100644 GIT binary patch delta 819 zcmZvYO-~b16o%hBGwqb=KxwPAP!&O_6sjX13etk|B_Yc9MY{}I3tCRIob zJ=~N-t80Qp*sTepDHI=*p*+kWcf@8GlrcMFX{d!yMIC2SlS@ZE{5&G{X*FO7>Tto$ zXQY_lophWUWQ27zK;uuO6`qtoaK9X81N^xw&ZA1I$Ai-h`tJJH?$)cF?Wa4HiWf0- zspuqjyOcE+^Y{C5M#|1+t&)y7&a8g!XT}Q_b$6pzrD?laJ7L7p$7fg~#K0_aUbD&% z?92_bWEQNlRa)dFWsd()?(%O+bKE;RGCn&!ar4f^t=k?9G5GdAt?aEm`~GrcA3?(< zjHtNG(8O01G36-6_*d4(XI=I(ZG+ZLZ(>+dl_H@YQiaYMXcT!Vijj)1CcrAt*AaL_ zfrKM;3Ik}9N1Z>S9POxTGf2g&tMeT~|66>^jz{0mKqFxYcLc|%`EjS(2{e;7Qm2#j z(sBCo4LX;kMdNw%mvcKAt zyf{yV87@$=i%}p*`Y~`oa`6z7!9OGkhvaINBq&Id`y^c(7(Rrhg$%>3f58L~Sc24k S@Lv`QFh`$z~& z4Gwz{$B>L+6(dM6MD`Dx)=H*PUs`TuWCn54nA7!%1v|G=BA17#6odTT1DashNoF);g`5FXUJn#{6 z(3koQzkp!4iO32)Izpa?T@j(-J+@l6)3K`t1aJmtN%b7HNQ@F7V|S0@Je|E%K1R5l$@N{5kVSIDAxW*{SQCwQ7<+b%So+&oLVGMB8lOLi<;npp r`Ts0e>06HPSsEh+Yq^6;6NAY$$d<3H%~v0BOwgSRleVzs_7w0B+PH$V diff --git a/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class b/Debate_backend/target/classes/com/learning/newdemo/config/RestTemplateConfig.class index c5af04f8dcae3538d7fb7f31af62033c0d5b28a3..f96619c4ef41bc2664ff748964a7c4250bae2d43 100644 GIT binary patch delta 243 zcmYj}O%B0u5J%rs|5{Zat&duY9Zg8=t(?LdYe#T~#>U>xid7R52XF>wa0D@}1~bY0 zGBYplU=F5ve_d|CjGlufjFZQ>F74m6iqWqanJeN)0w@Ystx`J(5&eu)M==sSx|vyCYt7AaIb`ml=ew) U7C+ap@h5W&nMEhZx?f!cZ&mCSHvj+t delta 238 zcmYj}JrV&y5QSf_ot?2i*8hrSY@o;m$|=N%C30t&lF0W0L|a9b12~Gn5tQyh(ZTEL ze(!sQDpYoRp05C==!Ni5(ePs^1a{UBGz=lP_uPcgVnsF?Yl1)Dtk!n>*dJ)Q6H3Md z3C9}qHR4UY)vyGeoSm?W4MeE1#_s@9)cGPb(Bu+XCmQeti1J56q{a R#UZJ0yKu*87vFCNya2bE6!riB diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class new file mode 100644 index 0000000000000000000000000000000000000000..3e223b511c0b6bfb27ea9781d9e5f0d956656436 GIT binary patch literal 3184 zcmb7GZEqA+6n<{sX1g6|*-~B=0eNZ5wu49!-Ga6S1l<cH++u7Ugw6inI%xqtL zK{Uabm}ue$Li}j-gE1kXC~YyuPn!5UsMJsX0i&L~Gu@qSw}@?aX70J?oO_<yQB)AO& zZ$K0c3RD&Au%2OE!7}d|rq<7Mq@59DystI6(qp1+wMaoz+1e@3F|15IVrW*dQAGqT z44t~2)l9)1i{>;-Os7TG)^ywQ9NRR7qm9h;oarkL8DgP@e2<9;HWMP(iTA zqa}jv3_I?B^YPM+g?n>%|M=qi?;l-Tx^i{#!>fxo=I_ld-2ZwZibt_S!DA|RVi&{i zHG;`zZA%*zZr&vHwZd_1hv8_Lg&>l)Ia*IR*_M=rnn~HWESc}p%%^4aftIIws<66ymIN!xIbWnPH!k0d|v-s(? z#V>Cy-Tq2}MnFrIbeg;4R83KIqB?>@3=tjxlGS%uMHh}xspaxSb{WZj@g_pS1d?zt zfkoY&84b8Iiri5XV{iZ=5ZCz;yDW0v@^0mZ6~9- z=Gfs0Eoo;m!l4B9qEEpIS!O3`Ppnj6Xs=LAA)G_wjy=ssO_69Djv|5QRh-5dhA3sO zpOEnk)y>A%Fb_deV$=~{RFOnK!{#iX6ttIg?u{7UIDN@I;}I`qJGxlQCAfhoinBPU z;3XAeAjACpF z)j+Z2Xs#~Di3JLDQ_>EDn9VH%=_>cv9dZ;TGb9Q2%y9|h|JVhdq}{rd$Ms2yJRq{E zUwGqo`kahYc*3Dr>r+O?;$Ge%V4tmE>%s9A*LfID16Rv=c(CUpavyu4ELT+7v>4S! z4J#ckuyeNS5!M`)BVn(d;%1&e)oaU*jE<7>YA*6nR@Pk=%evBngW^(NxL&WFo}~pN z-MSf^-_ewvcXV;ekR{z*epq(Ol3Hu?R9?mPN@p!CRC(W3HZ25LBBhS!42>Jq?Rst7 zb3KRW{E~1Z$W!62J}3VC@pIN#hv_J0FstA#*|pwg*i&jlhBakR3e7JEzmXMN&h>Dc z2^9SWPjf463U^P^wkPws@bMAURcI%a84l5Qs-S)$q+j6x3S9JY(@YtjAQsg#mL;4* z>l3bm%hVHBVX73Wf-7``d9W(=0v{K4(MeQA-M$9f6O z-9_j5J2*Jd5qly&k0+}!(lLjpZuWnRW3f0%da4os0jC!50wDDX_965`&@nlHbm3hC ziQ)*|X+hV5M(m*forn`*n-#bMuGUt0Vl)&`M5~jaI)M~)E^~%e@>^lG<|PFO}zFmY**0uk5p6; zQ|JoB6pCHYd@UnKphaXZGle{^C)08I85h7@Okk4c6qz)WJ|f5#Q@M*|@~=J?o5R3& xI40A{3PkwnY@%dYB&&j5@GPq*N8?LH?+#oVM`%1nKM(KFh@!*0cn|Mm>%R>rnXv!> literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxLoginController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxLoginController.class index 13f32a4e35422dea1c37813fe92a5ea475ff62f1..bf1946ceb4b7930e37070f10c7380859a6d38a54 100644 GIT binary patch delta 1635 zcmZ8h?N=049DeTZ%+BoWfUtl9iYQ|8wk{B90-}Z_=7JbL{`Q_P zx>c0%>pych0c-_V;Ngc^-M9jYA#1=GHNpwQiiP*~4w%stgEwKv7=jTy84Ej!{eIr&XK4k8;M&nMrH(~CuEIVbS;QvQe3y;^OICgN5+)kL2zD?h*>HQRlrhHT_02=Yr( zp{yepd3;8y)BIpqp+km`x60+&zD5_R!HZQo3X#ced7Dor1#ydiDc4___qDJMD$1#9 zl&S_$iI9RS;^hh-NyQW4He*=FMuaDi)O6MS&yvnmGH%5*RO3kQvg z*MllHGvwdBaBcp^$MdJZy7%?O?ey7ur*7O%&)xlePQw;7D5z&B;XleHq@od9`7+j$ z#js6>A6fuA(5&DY{yPg%x)?iouBVbc%eQ;hgiHpRu5L zkfEZCPiRGa)|(vn@@_%~^{S3ZgBWVmd zQ@-3y!N^0{f|=A3QlF7B7#MX!-Xr;?vJHH*uay@oe%|4$=Rf(@@hbJN0u`eS{yUex zxO48zolj2*bH@bT^AMgkM;yea@w?#eNoG={6bQFBZuwLM`(ui#jjtnc9R=b)ZB}(FpVNBSBzi9%EvJ|E=FJ2fg-G?os3#*4N+X{Rx5ESiE8WUDLn+{ zU_G9ooFWQupb4>KJ4l;MbF(s7Hj4@men53w)z8qXW>9;9NN-9TczU|xJ2X|zV!H?J zp%Bf6%xlDw>Rz0|YWWN;*nW7E_K9n)>XqgTmP z@`%jNCzD=ZG>Oqom`~Jts6;+LpHb|Zvu2^-k~zY_e)?wNqI{1lQH3|4?tDbY9%3Qk r4SIX8leEsH_!)}5>%QN|S&E6?J_q?DOrhXkLdQ?o delta 1462 zcmYjR+fy556#t#%Uj81K5YW1_vYsvJNL)gwk2#q!CUVnPm9jk=ev_j^OG}Wm35wg4EJ_NQFv} zr?W>B9%%3=&~=o+ODM4mPvlbRaNJlBH>3_K6+XFgiw}Ms<)|PiDRXFkA$Q8|bXY}| z=#}feH3%rE)v*P2gl+lKYVn)HBQD58o(423*s7z6(@KEZ!<=DU8iJ5igt;u2ol9ga5*<1^u~X!o z18NN((y#UIWg7G={Kp9XSavZPHq*ztX2Y>;GMQM6s_5nX z`t`4G{`mP{7q6}V@WJ}`r`HPw5Bl-2f&q))py+p%ON2H?S}s0gmP;KwXt$;PE54Nv2cf-xP>U|dX4tyrS2{LOKvJiv1k1!{H6xtWwn*cr>0c2HF8c0`0% zsjKnD?kdJ=MG2H3RK`T!RjzU5S}+!kc~cB3!|vjGM0=uQQi+J)mF7#w9YZAkQEu^2 z)b8oDy)|OWy~cu{7JqA%^oDSH8q0hxyrtnR&M7!=(S2JqX*)z*``Ay=_h&MR#euY8 znh8_EyJDB8jouT6C$!waiwgc~tx4D(?*#~l*>|y>U@NobHRkhKj>2q-t+VY4=o@w% znB>#C25;nZeCovqcpg(65wDfO4Y-*4A+ZM}f_`NUZpSiyf-m0wGqm>0D7y%^zp{Yp z)wb_Y-@b-s2S!7`aI)1(UPEyF3PKS%Ap0K(t>HllV*$BcI~Eem}B diff --git a/Debate_backend/target/classes/com/learning/newdemo/entity/WxUser.class b/Debate_backend/target/classes/com/learning/newdemo/entity/WxUser.class index e8c6d59d6fb92abccdc6f36ae82880bef51e3981..2727c4765f48a7a11d61cd9236c706acaae20c7f 100644 GIT binary patch literal 7020 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 literal 6641 zcmcgwS$7;q6}~l^nVzLb`_|rK$77?#jv#DK%f^Xi*_JKIc4XOESkfMKq_IXl%1q0N z!;%EE2LgtW1Op*#F^eGy#CBph9C#p{!!u971N;J>IV70xR#nfm#vOY&hl7rK>ejvA zcf0CV-CH&D$A4e_4H504Uu7spEe6F+N>EZz`zhzNGg5NA`H{mXPq_tOP;zI{EBYT0 z)G{!5JWVM|8#~253-FrciMm-#u1bauGT;@D;yU8rci29QLqD+az*jc}^oU z@Oqm`BlJ$prr>zv53M*QK|KSZiL2O;4&KM$+f8~my+=@D-t{LCp`L-k5HtuTFXa17 zdOy2Oy6m&c%e!fa;rnn;5$vai@{ldr*-sMKW5Ti z)|=4Z6)XT7_L;Pw4H+25RKQt1Vba0C&k-GS)=!!=#d?F`2s`Tzn{*_=PU^_B{%(_I z=$N1!V?)933aic; zo1eUSp&CVoRaJ)dMlHtRaSV3K^%u%>N1O^OkdGlFg}@0?XjKmDxic*bOprOq7xZfR zq8zBqM8?3RGe)t3Ji)$W6S70;gPcI1SRcxSEVkt1l>G%R z+6D(M&jmRpHB!t9MmIj9scRc5Z{QOIl1+G?TNx`k)v8-H=!&2%*Uc$vs0O_* zXv2-6*m7!Kvu`#gZ+q zRkFoRO18K_$rg7e+2Tfob}in4J10Ju&>KN3&?bhika$JHJbbd5Ft{>4O$DH3dI&wi zmm++wCcjF?%P_{MPR>P=as7!P=Nidvkz`zlBFG($%(?o1Kn?nZJ~BpG+P2y$N| zxhIm0OIZYYO(VH4l8mcc1bKZU*@`6NeiuRB*hpR*NybGmg1otrygrhQ+hPQHYa{uV zNHXq@5#*sp@}@{~g{s(xyghBSF|^5{;Y(yhZ|+`&(3_h#K4+aEAG`z#Fj7d+3Z0H} znQPW1CveTB>O36nvZGm-TnlP0Rp*gtm)*^}B|?+T~EQF8Pe9x!fjQ;;XS5Wy?KiEgT`2hKF9HMEv6L?tgE}sdx!sCiruPPj9d-hc9d^=6Fedp1bzY#H zm9UZ_(5P(yG-{_TgFz_`GOSbxwA)StwA;>DX$EC9C~ajzpgndLpgp!}Wf^2@5Tp=j z+|B_sZns)F2DNHX&T0*T4%lq~9kAQ2HU_n8P@B~r0v)nD06JuMS{)4P)SwQlGX$Ep zy8xQDyR9w;b!$+U)g1yIwR-?MYWG?_4C>XO9;-J5nzj1?nzj3_J_hw`P@mNwfZ`WX z5nDp%ySf~_sTMS-pW+fdL7&79=n*f_SzH)mlo#jdQ_!{0ka&_l4Jl6hg-4%(l%OfG zK%a$_q>`AR&p|S%BF5pOq<$pKPGQ znHqlvE?SYo+uKKX#&^j?UDrOkfHY0D4__c-`(?W40oL!Z<7}|v+LGerRi;rpAx+3z zNlICXz_i;=N>j3CLN+Vb9@~&6B(i21foa@MNmHt3LV7FK0Xr>C$ZX9@2c|=IMw&7; z6Y^cLrtPdWA=Nc28<>vTrZkx~lNp$1?VL0r_cbdgP3xjl=P4CP9r+e9MBk)uA-`ujdMFV90!)0hO2d*NSRL7@)nH>axQ>r7XiDljN}UyL(?tB1t|kb4_+QR9&OfzB zn>9W2Hun14Z-mfJvTyIC?&l^T?aI8NtGc(Fz{1GD!@vs^hYIn5h4|5gfbs%BEldo80K^^;c>n+a delta 113 zcmcb|e2;m;94P_c)RK(+lz_yd#N5=9)S_ZW2Dbcy)V$1;iL)Xm^D%aKure}mFfcH1 u0x=IG10w?$5OWtZaIi2k@G$TKIqX0gpdvm72A~i>nh;Q404UGIAP4}qkq}w{ diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxArgumentService.class new file mode 100644 index 0000000000000000000000000000000000000000..b8934c4d870e8420a7b0782614ea585eac01296d GIT binary patch literal 276 zcmZWkyKcfj5S%r^=8=MmZy=4YMM4xbsS*Xr1@&=WIfv{!bUsMFEk!|$|eGQ1FG2YuG6 z*0S)mKd^~}X~pp&B`g;oPe~DjSg-obTb~l|PmbTd-0GkkjvQLTF#4l4gtU#?8752$ oe+q`*Z7pEl%b0h!QvzWij{+o-he!oyg2o9(UF!yzNKG)k0U=3EEC2ui literal 0 HcmV?d00001 diff --git a/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class b/Debate_backend/target/classes/com/learning/newdemo/service/WxUserService.class index ab1450cfabb38f48f524aa5977eb311ee5425509..76766647eeb6f7bbd497f55a2798f28ce523ace3 100644 GIT binary patch delta 77 zcmZ3)yoh;1Gb>ASeoE@ZM$w6LPg`*?Ffgz(GO#l+urM-kGH@|4GC+m6!9qL?ya*va OpkhV_ejv%jAOHXWWe5NO delta 93 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 delta 2004 zcmZWqYj6`)6#i~Do84?Sv`y(F(AGYn&$NLyAe6Se>3f7#vlB3{BK9bU;cI+@$9CcNG7}Y=DhBAzH`paq2ddL zEkFHz>n?ysOeioxkYH9J!orX~IU!43oKVO&4QjrFgjANQFs>K}?JVS*8nS4s{E4oFNifrU?k7;?S1m{yHb;qND zkYB-EHh*Bw;lG$cf?U+8@L&;x6o@sCMB)h}#XcSE z^D35LY4XV2RvF6}vL7D1F@5}WD(LjZs}HYVsxRET-$n#BNm#C81y)i<;i%so3-0s` zxjVvszZPW>wP-Xs9E8)hb>j@8QAqndlGXE`G^B$iTi3h?V85tq7}#AV7FWBLkG#s>J$eV8k0utkn`SqCBL`EmIK3 zsD#}r#;}JW=l^WCczyA3G{LW#JQfMBP;$xi{N%ngt8>F>C>|KmdXrZ(xr1%V%bmA( zO!EzT<257H+TKW{Ce^k38J6&foW;wTlmE$7(Y!i5pz%LU72GAX@*kx}o+h`7W}hzY zk@xZ2R)02wnV5?)uyzKy!51{9g`ZRg1R0<32e!eCGz%^$_!OT>xTp`sr4zO??y{ZD zVo=*dRLj*tZ!D(8Bz(azpD(n{rv$!YD4=b@ICXPJI6OQWK@qi$2@DBXFh_4tnlh6< zh$P!fdmF9$=-D5`tE8ZTd{!||3M%Z3!b0l-BMP-5$kkO2p$X}*aD0qjbp zE?%{X!nEkSHCH-y{fn-f=+@PAIvqm&*F^)i%~;LQQP&bypn_H@KCURYg!#Dzg0xZJYc!$!ggA3K970J(z zcX8AJF)~96QGjCxQO5~@PFO0&dlVyyagej{h)_^d$P#jmZ;^yD+5q-PM4Bn30h1`J z6BI;b6j7&}u9y_v_<&Y{WF8`>x9TSPOz3poN9k?!Z@B?)r>klbJ9HfpwbKNhKf`QX zx4S})g27S&B?}5_LklI{Mjg_QJglLMb}jMMX%JGFI_ODy9wT{1J{90NNkEbmLk9Z` zwGz=egSeW645x5<2JsYy5%l~QRNaF@@P_U~6eebXg-mG7I|s>p8D?R^sPV2;jfDvc zW2b2;CN}{~3>hlUx%riR8rAU-6S31?^K du7u$u5`0V#F^2Q>oWtkzOQGFme2K5&{0FH!c9#GE diff --git a/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class b/Debate_backend/target/classes/com/learning/newdemo/util/JwtUtil.class index fa443572c7f26102aa3cddcf8256647049e124b5..b6c742c240f38986a721c496c5bc55824db1b8c0 100644 GIT binary patch literal 4084 zcma)9`Fj)B6+Lgfj4cls#8MWMfHfo3oAtDglV8F3#f{bY(Nf}FHdu(Y&9gQ$< znxsfq>k5(r$zDGYPfxVZ?j&B#NNxNiE<*fn7aedRbU8f|_Kk9lj$x>08PJ3p- zT5!GjqRWOG@7G&IvRE zX4F+swg>iAE3RogX*;%mN}#T*ds3i&$jwoqyP{a7<-A#% zO`F9S_9EVd1B}HjT8^D-!AEgO$3bpXHKw6~cHGZEi)H5Ok?5X5CR33u!;vV8a3}_W z2Ml}!9Sk>gqTq0cRMftrfW~azvk zZE4G&b#oU@sV3j@xNCgI^2Zf1!=77El*<^77)at{!Ss*i-NfpYV>#}<|ij5%y zXK+>t-B%96nv8da0#On;!wN|0I47{Rs#7@_!!Y9VW5mD{7^SeMtZCOH`W;chsrB7g zV;I9l9ph`Yp?Xt@#=w)fB%rH?F+R-;$SVGVQYv1*l)^1Ei>X*|Q8MNwqz8RrRWQD9%l&&_1kTP*r+ zGNU>x=Sb@(VCuLoaPY(Y8<;|t&`N=4_EzQmc*q^wW!ba+#iVq54`}7imVs%^P-Igw zP=N#gFHB;!F|T8e&Hn?j8pxx-%q#waLK<0MwRYE(*=9E-?&9K;I*L?9jcEfO=uRiS zgKm!8?p)JeEoJ;wfgc+-}fmnf!wV&F~uRG_IueO#d@fy-e4>x%1M z{M9VLXq-Pc@C*Esx#Z2F$UD(SC5Ngaqr8N%dFCX2)J^r46AZL%Lc=z;wox;Fi{I<` zoxuK$wDJ2HE6ZDv$Da2G{E^*wa3FK`;eLV5E~~~VDdt-S8qnB++jvLEpKFM#YH#2# z@{DZEsl9Y83uxB{V_3x<9q+Q^Y{V61n#kV6U#W%Jf|+*wb!{-Hz#1Ku z`J1;E2N!*deIk}|%U;$Rw&e}a2rs-xsCi2*@pfUkKCdjvA!f#PEXPmb5TmZ+ zty<$BL+3Z0-&*)=;(v1qF;1|+H&1M#CDVphes1HMB%gxMhQuQrqcX2%Z78=Jyy7!g}BF@cDgphVKB=Anvh=&NNpTQlYzvBwpDUQ-x1=>EO6tpZnyU?Hmvx-@H#D7IL*OY+2t1Afno0)Wps@tru7Ia| zS1~9s)^`WPSErM`5Xi?>!nfNcatE1LQzRoQ3d7^%OQ2cGd=obh?!%dZqf00WmigO|V zY5Am(7ZdN``6awyF5`=1EBF!v{i+5g>vau%tN1oykciuOV--KH!=v?k>sRqJ_9eOs z-=PxId@TQ0-iwBV-^6MmjI+D6`l~~U)!Y(Gii59;iFB(1c;4PK9 z(;R&nzh>-fr9$wuPtZP8T&IeUmp~3l#ii*$<8#+-{DxuuX%%nFLRlK^S;2}#tf_*P m4Fo7~iK9?SZOeubG=XiT>3uBIrG~$$HFs49l5OMf!2bXfxB7Je literal 4084 zcma)9`&%4W8Gg@j8CWKSk`NO@YC=c?3uLt=NiAtoAXmad+9kv$ZSAmofPvkeb#^uc zYrWrXwe{M1ty--bt!az|np&&B_&okiKI(hU47&qMY@U5)X6IbK@BQBIa=!W3f8Kcy zz+?DF3M9GhIk8M;pSUu8HJru(> zY&X$nVFx}WurKZA5?N_`d55_3axo)wZbIW5UGy&zClSoby!32ePPz*+FR(wY-y7@&p?JHf0VB265 z_TWJiAGWX;`vi7uzKq;Zlfc2K=)e{0AcjLG_OEkV0K&upfo&CTPhU^Vg73I_h2fBe zZuDqI{L|M94oTq*E$j{{(3G4aRf8sa1)3|qQ-d+YQKN2$EhO*}dVE^WxSpiKD5ZLT z&y^S+!owy8EF8hnwaC%oHSD@{8TFdi>}*L+%#f1qD^V|mE9izt@G%pQS{TG}f$bZK zqmPR;r(k2r>L9L9)=Qx;C+jKJOxQbK6OKr&-W3qKYTRg~$H=lDwrCH6khD$VCCoX4m@ z-Lx`PV9)r0v82#-4iR_toaLKb##%0_CzD_p25wf)bb=!CMGRh!W846 zS_{RQq<7fOklXERffgw<^h6gvZs93agtiu#etycg(+iWHoz@|D)xy(wCJ-~}z0&gC>RCZvTKB_;@J4M0r`G-mmjQjw@)drp-@N1(QQ zv}a1i--3lKa#XKrSMl}W=ER5bM^0Q6OnlOU2U_1=&52(Q)kelgK)gVIG>L+`bnmTN zOUc4DEDAJH%K2ikBr`*-ABUrIf@It*9iniTEPP4{QsG)D42}3SUNG?)3!la31UfgO zQ7L2lB~K1zXI)0~99gP6mwM<3)4i)oW%X)p!xt=k5nmE$C{o&G3K6)pS(4n3yiF4+ zYUfuhd=+1#FL`VfY<0w~kH|3A8}SW%)5MDwUc$Eoc5gJC@26ziWwD`u>xYL@r;iQ@ zbW}mCtQ%C}`m%*r@Ez`8_Oqg}?nXj2RNaK{;rk|jVBv@AsHh5_ib%@IXb>h|6ELn0 z$M9qP#Kcc6{0u*5dDw_LT62hd%UsS*r{-){pffI`x}*E*a8QFcseCLTPnPmNvv0~N zI@4J>l+U}qK0YXFV9fPq6GfG~vooHZlZ&pmkeFtTFD7P4v+FG-?DB?$&b2|tiZ1^| z()IlOqJKDG+B_oV*+_<))=KX%mLx&`sOfDcf_@dpKC@&pE`k zf9wO>1HxE$-j=If

Rj$ah+I0SZOsU{s09^J_hdrNSDLBkPwQul9IkBs|$qP+&_^ z`g3lEXBO%7b)cy}WJ0%Ckv?Q+RnUb!hkzhEZ4v3^RzOj&`x8>HOD$~(iEDO>y1~&! zK=P0|wCPb$A!qHRCgO;ty6UhlG0fRFWYjAQZ^fa(Ky||KJYP#!*5z`=5I7&LX@q;9 zJVtwpvKt!~($jMkf+tI_hB z^}0i7U_;o79xZoous4)TDKtQt(!fUk2L3=Df8>6pJs5e5BY)yZ9UaYwz|As{H#k+x zvG#cHGIoylx5ie{Vc>mqCf`K;xJdThcrO zj5}PaSbUYD6!=aJKH0a5g979IcM&J2q_KYmAHA8ZRd;Q~ZgiB5*g;o&n!6+;GAaaMrtzo7m;A;|t7vfnV?zl_V8e}n1{l%dBFql^obHBN;SXvRfs z#}nAa7O#`--2tR<5R+_?rnEV6>O9D6jr+bb^u7?f!L`a;29y!>(|;+1U!2=WzDctM zZK_>w6hG?7i1NZe2|{ssHsn32o@D<@{5GCl# Date: Wed, 9 Apr 2025 16:58:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E7=AB=8B=E8=AE=BA=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../newdemo/controller/WxAIController.java | 4 + .../service/impl/WxArgumentServiceImpl.java | 175 ++++++------------ .../src/main/resources/application.yml | 9 +- Debate_backend/target/classes/application.yml | 7 +- .../newdemo/controller/WxAIController.class | Bin 3184 -> 3287 bytes .../service/impl/WxArgumentServiceImpl.class | Bin 5206 -> 5480 bytes .../service/impl/WxUserServiceImpl.class | Bin 4356 -> 4277 bytes 7 files changed, 67 insertions(+), 128 deletions(-) diff --git a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java index 671b534..80db15b 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/controller/WxAIController.java @@ -29,6 +29,7 @@ public class WxAIController { topic = params.get("topic"); stance = params.get("stance"); + if(topic == null || stance == null){ return Result.error("立论主题或者内容为空"); } @@ -41,6 +42,9 @@ public class WxAIController { Map data = new HashMap<>(); data.put("argument", argument); + // 查看data + log.info("立论获取成功:{}", argument); + return Result.success(data); }catch (Exception e){ log.error("立论获取失败", e); diff --git a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java index 2050b1c..cb6499b 100644 --- a/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java +++ b/Debate_backend/src/main/java/com/learning/newdemo/service/impl/WxArgumentServiceImpl.java @@ -3,7 +3,11 @@ package com.learning.newdemo.service.impl; import com.learning.newdemo.service.WxArgumentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.*; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; @@ -11,66 +15,23 @@ import org.springframework.web.client.RestTemplate; @Slf4j public class WxArgumentServiceImpl implements WxArgumentService { - // 依赖注入 private final RestTemplate restTemplate; - // 使用@Value注解注入配置属性 - @Value("${ai.argument.header.Authorization}") - private String authorizationHeader; - - @Value("${ai.argument.body.message.role-sys}") - private String roleSys; - - @Value("${ai.argument.body.message.content-sys}") - private String contentSys; - - @Value("${ai.argument.body.message.role-user}") - private String roleUser; - - @Value("${ai.argument.body.model}") - private String model; - - @Value("${ai.argument.body.frequency_penalty}") - private int frequencyPenalty; - - @Value("${ai.argument.body.max_tokens}") - private int maxTokens; - - @Value("${ai.argument.body.presence_penalty}") - private int presencePenalty; - - @Value("${ai.argument.body.response_format}") - private String responseFormatType; - - @Value("${ai.argument.body.stop}") - private String stop; - - @Value("${ai.argument.body.stream}") - private boolean stream; - - @Value("${ai.argument.body.stream_options}") - private String streamOptions; - - @Value("${ai.argument.body.temperature}") - private double temperature; - - @Value("${ai.argument.body.top_p}") - private double topP; - - @Value("${ai.argument.body.tools}") - private String tools; - - @Value("${ai.argument.body.tool_choice}") - private String toolChoice; - - @Value("${ai.argument.body.logprobs}") - private boolean logprobs; - - @Value("${ai.argument.body.top_logprobs}") - private String topLogprobs; - - @Value("${ai.argument.url}") - private String url; + @Value("${ai.argument.header.Authorization}") private String authorizationHeader; + @Value("${ai.argument.body.message.role-sys}") private String roleSys; + @Value("${ai.argument.body.message.content-sys}") private String contentSys; + @Value("${ai.argument.body.message.role-user}") private String roleUser; + @Value("${ai.argument.body.model}") private String model; + @Value("${ai.argument.body.frequency_penalty}") private int frequencyPenalty; + @Value("${ai.argument.body.max_tokens}") private int maxTokens; + @Value("${ai.argument.body.presence_penalty}") private int presencePenalty; + @Value("${ai.argument.body.response_format}") private String responseFormatType; + @Value("${ai.argument.body.stream}") private boolean stream; + @Value("${ai.argument.body.temperature}") private double temperature; + @Value("${ai.argument.body.top_p}") private double topP; + @Value("${ai.argument.body.tool_choice}") private String toolChoice; + @Value("${ai.argument.body.logprobs}") private boolean logprobs; + @Value("${ai.argument.url}") private String url; public WxArgumentServiceImpl(RestTemplate restTemplate) { this.restTemplate = restTemplate; @@ -78,73 +39,57 @@ public class WxArgumentServiceImpl implements WxArgumentService { @Override public String getArgument(String topic, String stance) { - try { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("Authorization", authorizationHeader); - // 构建请求体 - String requestBody = String.format( - "{" - + "\"messages\": [" - + "{" - + "\"role\": \"%s\"," - + "\"content\": \"%s\"" - + "}," - + "{" - + "\"role\": \"%s\"," - + "\"content\": \"%s\\n我的立场是%s\"" - + "}" - + "]," - + "\"model\": \"%s\"," - + "\"frequency_penalty\": %d," - + "\"max_tokens\": %d," - + "\"presence_penalty\": %d," - + "\"response_format\": {" - + "\"type\": \"%s\"" - + "}," - + "\"stop\": %s," - + "\"stream\": %b," - + "\"stream_options\": %s," - + "\"temperature\": %f," - + "\"top_p\": %f," - + "\"tools\": %s," - + "\"tool_choice\": \"%s\"," - + "\"logprobs\": %b," - + "\"top_logprobs\": %s" - + "}", - roleSys, - contentSys, - roleUser, - topic, - stance, - model, - frequencyPenalty, - maxTokens, - presencePenalty, - responseFormatType, - stop, - stream, - streamOptions, - temperature, - topP, - tools, - toolChoice, - logprobs, - topLogprobs - ); + // 构建请求体,使用字符串拼接 + String requestBody = "{" + + "\"messages\": [" + + "{" + + "\"role\": \"" + roleSys + "\"," + + "\"content\": \"" + escapeJson(contentSys) + "\"" + + "}," + + "{" + + "\"role\": \"" + roleUser + "\"," + + "\"content\": \"" + escapeJson(topic + ",我的立场是" + stance) + "\"" + + "}" + + "]," + + "\"model\": \"" + model + "\"," + + "\"frequency_penalty\": " + frequencyPenalty + "," + + "\"max_tokens\": " + maxTokens + "," + + "\"presence_penalty\": " + presencePenalty + "," + + "\"response_format\": {\"type\": \"" + responseFormatType + "\"}," + + "\"stop\": null," + + "\"stream\": " + stream + "," + + "\"stream_options\": null," + + "\"temperature\": " + temperature + "," + + "\"top_p\": " + topP + "," + + "\"tools\": null," + + "\"tool_choice\": \"" + toolChoice + "\"," + + "\"logprobs\": " + logprobs + "," + + "\"top_logprobs\": null" + + "}"; log.info("请求体:{}", requestBody); HttpEntity requestEntity = new HttpEntity<>(requestBody, headers); - ResponseEntity response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class); - return response.getBody(); - }catch(Exception e){ - log.error("向AI获取立论失败",e); + } catch (Exception e) { + log.error("向AI获取立论失败", e); return null; } } -} + + // 工具方法:转义 JSON 字符串中的特殊字符 + private String escapeJson(String input) { + if (input == null) return ""; + return input.replace("\\", "\\\\") + .replace("\"", "\\\"") + .replace("\n", "\\n") + .replace("\r", "\\r") + .replace("\t", "\\t"); + } +} \ No newline at end of file diff --git a/Debate_backend/src/main/resources/application.yml b/Debate_backend/src/main/resources/application.yml index 6a5234f..44b3272 100644 --- a/Debate_backend/src/main/resources/application.yml +++ b/Debate_backend/src/main/resources/application.yml @@ -19,7 +19,6 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 -# AI接口配置 # AI接口配置 ai: argument: @@ -103,15 +102,11 @@ ai: max_tokens: 2048 presence_penalty: 0 response_format: text - stop: [] stream: false - stream_options: [] temperature: 1 top_p: 1 - tools: [] - tool_choice: [] + tool_choice: "none" logprobs: false - top_logprobs: [] # JWT配置 @@ -121,5 +116,5 @@ jwt: # 服务端口配置 server: - port: 8000 + port: 8080 address: 0.0.0.0 \ No newline at end of file diff --git a/Debate_backend/target/classes/application.yml b/Debate_backend/target/classes/application.yml index 6a5234f..f81e75a 100644 --- a/Debate_backend/target/classes/application.yml +++ b/Debate_backend/target/classes/application.yml @@ -19,7 +19,6 @@ wechat: appid: wxf1f6d7657e01d48a secret: fc356336a118366f27c384079688bc15 -# AI接口配置 # AI接口配置 ai: argument: @@ -103,15 +102,11 @@ ai: max_tokens: 2048 presence_penalty: 0 response_format: text - stop: [] stream: false - stream_options: [] temperature: 1 top_p: 1 - tools: [] - tool_choice: [] + tool_choice: "none" logprobs: false - top_logprobs: [] # JWT配置 diff --git a/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class b/Debate_backend/target/classes/com/learning/newdemo/controller/WxAIController.class index 3e223b511c0b6bfb27ea9781d9e5f0d956656436..afbe62a725f7d131f1d7ea9306236fcd69ff985b 100644 GIT binary patch delta 769 zcmX|;TTj$*5XFE0ZK2)L09oR4U&V-^uA+cJK@=5SR1mLt0Rcf+xyZ`JE8uz;G*Oc# zKKSAXATc0`;zs=dz8d2vKz&mmd^75_5ZknK=A84N&P;z~ea^N%{7JkAs+pX%G|lo8 zV2jOGDxJ8N8!_3Y$ox9}@Y{>Tw@0rR9zXpu`DEe2^Y3q;jZLJmogD@>Happ+NRJIi zOGXBI%KJ(hV$o>#utM)0?1?FgoOfC%qp7p6yKA&+O|wNlwKjF^aWb`ts(0G8pyd|Z zXS0I+PC_d&BQ)9^pvn2E6(=9EIm{7fxn7rYjAn!5HYYea7t^bBHRep4d8rc?*NGe4 zaGf`uPv%Gcj-t>}{=#H~dy0_2kn_tQ+$^KXygpV@h~kvsWQi>vXR^$TnO@X{Px91O zr^X7FonG=n25o|E(Gf>G9TF95IU`xCz!o%g;ijA^t0VrBia=HP4b>X!=h;2e=n`Qe z_G*M*(U9OE%#$}GU6s7l4qMj SjLUP4TarqD+~zL#$^HkSG<`1s delta 752 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 literal 5206 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 delta 2021 zcmZWq+gDUo82{}#bIzGLa}XRv9ncX_K(14QrCby=Qw${Vf>(5a<1jeP(99@a8}FKx zMq5m?EHllL6cqvQJ!z}eYV{}d5ZFU6zVy_}zI_I1r7X_=_WADn_x<*nTNwv4lYaW= z&I14y7*JthDCSS?DcwzOmkKLGQoDDX*AwsteV)4JcB3V#Lg8N3QzHdJJ_ct^DD3k@ z0-Hq%~{}M*ST|b#R+M;%^QZRl#5=>W%tC!H5V6ggTl-TRe-6pb_>) zjn=a6-BbB-wJTGJ7%gEV$}oAxt}dgc%^NN1@CW_g&d#E^We<{-968 zLM&4826tPE=nQXSF|V;~wO8XU6-ya%c!p&HzhX%yTMcUYUzX{tj;Bg#NUV!e(HXkt+PkwqPy(H$nFYi-!X zldNf}bJ47$1r-dk5e|pK8X;ro*bELR*ZW4V^@XICf9Y+#SB(GkkCV@X(NeE-We$Tk?35#m)V)E~(hcljMmi4Y-8{ z%zv@<@OJyo6fvKJI+8KLfx|ee;t0b`v+!?n@)RBKfp|JDVg!i13wG3*2&j0U5hI@3 zGZQr&L#|kk>o|drc$t!IJB*KYaGd0RrC2A}y0)*37-3=#@0KU>X-Wc5*5+s;=u;hM z@fp9QWKz&M9bZt;ugavH^Tgqiv;8Bd`ktJ;JaTkUuw&n~`0?lf;ZPTyja756)@sx6 zEv~5ej#oKyXkI1g*M5cWL?Hwe?(UTZK5*disFB_a>AV5bAB1?*yg{J$G zj_3;(GgCizl&OJKq><|s3d@MfALqe+RRG+8dbee68R%=13sz zyaH#XbRW_H7Az|qz>*(OS!xw7%Uo8|XH+?aw@YQ0>|8Z~)uoC{c?5?`8Nj+T7%#jx zy6WZI@X`eO@`S#%k#e_*U3;HdF+>&L5oYQR2q1Y?UvtlV`V;6Q4ILir@M$#$R zOGDa2RV`E(W{!B|UW(jD8V{sr*aTGtQ&CC(F%{M3uAWvP;hA7e+$vn6*iTV1qlN_d z^c|qoV&bPsN+e4Nh6DMxama$&g2%|di(_jB@j-1t{(w1{0|ZOA1p=)xw?2xKOi0|| zS&42FgY