diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..e96534f
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/bwie/annotation/Idempotent.java b/src/main/java/com/bwie/annotation/Idempotent.java
new file mode 100644
index 0000000..a86d08a
--- /dev/null
+++ b/src/main/java/com/bwie/annotation/Idempotent.java
@@ -0,0 +1,14 @@
+package com.bwie.annotation;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 接口幂等性校验注解
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.METHOD)
+public @interface Idempotent {
+}
diff --git a/src/main/java/com/bwie/aspect/IdempotentAspect.java b/src/main/java/com/bwie/aspect/IdempotentAspect.java
new file mode 100644
index 0000000..7b80e37
--- /dev/null
+++ b/src/main/java/com/bwie/aspect/IdempotentAspect.java
@@ -0,0 +1,40 @@
+package com.bwie.aspect;
+
+import com.bwie.annotation.Idempotent;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * 切面进行幂等性实现
+ */
+public class IdempotentAspect {
+
+ @Around("@annotation(idempotent)")
+ public Object independent(ProceedingJoinPoint joinPoint, Idempotent idempotent) {
+ Object result=null;
+ Map map=new ConcurrentHashMap();
+ String id = generateId(joinPoint.getArgs());
+ try {
+ if (map.containsKey(id)){
+ System.out.println("不要重复提交请求");
+ return map.get(id);
+ }
+ result= joinPoint.proceed();
+ } catch (Throwable throwable) {
+ throwable.printStackTrace();
+ }
+ map.put(id,result);
+ return result;
+ }
+
+ private String generateId(Object[] args){
+ StringBuilder stringBuilder = new StringBuilder();
+ for (Object arg : args) {
+ stringBuilder.append(arg.hashCode());
+ }
+ return stringBuilder.toString();
+ }
+}
diff --git a/src/main/java/com/bwie/common/LoginRequest.java b/src/main/java/com/bwie/common/LoginRequest.java
new file mode 100644
index 0000000..64eb688
--- /dev/null
+++ b/src/main/java/com/bwie/common/LoginRequest.java
@@ -0,0 +1,9 @@
+package com.bwie.common;
+
+import lombok.Data;
+
+@Data
+public class LoginRequest {
+ private String userName;
+ private String userPwd;
+}
diff --git a/src/main/java/com/bwie/common/Result.java b/src/main/java/com/bwie/common/Result.java
new file mode 100644
index 0000000..23192a8
--- /dev/null
+++ b/src/main/java/com/bwie/common/Result.java
@@ -0,0 +1,75 @@
+package com.bwie.common;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author DongZl
+ * @description: 响应信息主体
+ */
+@Data
+public class Result implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+ /**
+ * 成功
+ */
+ public static final int SUCCESS = 200;
+ /**
+ * 失败
+ */
+ public static final int FAIL = 500;
+ /**
+ * 返回状态码
+ */
+ private int code;
+ /**
+ * 响应信息
+ */
+ private String msg;
+ /**
+ * 响应数据
+ */
+ private T data;
+
+ public static Result success() {
+ return restResult(null, SUCCESS, "操作成功");
+ }
+
+ public static Result success(T data) {
+ return restResult(data, SUCCESS, "操作成功");
+ }
+
+ public static Result success(T data, String msg) {
+ return restResult(data, SUCCESS, msg);
+ }
+
+ public static Result error() {
+ return restResult(null, FAIL, "操作失败");
+ }
+
+ public static Result error(String msg) {
+ return restResult(null, FAIL, msg);
+ }
+
+ public static Result error(T data) {
+ return restResult(data, FAIL, "操作失败");
+ }
+
+ public static Result error(T data, String msg) {
+ return restResult(data, FAIL, msg);
+ }
+
+ public static Result error(int code, String msg) {
+ return restResult(null, code, msg);
+ }
+
+ private static Result restResult(T data, int code, String msg) {
+ Result apiResult = new Result();
+ apiResult.setCode(code);
+ apiResult.setData(data);
+ apiResult.setMsg(msg);
+ return apiResult;
+ }
+}
diff --git a/src/main/java/com/bwie/controller/UserController.java b/src/main/java/com/bwie/controller/UserController.java
new file mode 100644
index 0000000..bc3892a
--- /dev/null
+++ b/src/main/java/com/bwie/controller/UserController.java
@@ -0,0 +1,25 @@
+package com.bwie.controller;
+
+import com.bwie.common.LoginRequest;
+import com.bwie.common.Result;
+import com.bwie.service.impl.UserServiceImpl;
+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.RestController;
+
+@RestController
+public class UserController {
+ @Autowired
+ private UserServiceImpl userService;
+
+ /**
+ * 登录
+ * @param loginRequest
+ * @return
+ */
+ @PostMapping("login")
+ public Result login(@RequestBody LoginRequest loginRequest){
+ return userService.login(loginRequest);
+ }
+}
diff --git a/src/main/java/com/bwie/mapper/UserMapper.java b/src/main/java/com/bwie/mapper/UserMapper.java
new file mode 100644
index 0000000..3c8d556
--- /dev/null
+++ b/src/main/java/com/bwie/mapper/UserMapper.java
@@ -0,0 +1,11 @@
+package com.bwie.mapper;
+
+import com.bwie.common.LoginRequest;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Component;
+
+@Mapper
+@Component
+public interface UserMapper {
+ LoginRequest login(LoginRequest loginRequest);
+}
diff --git a/src/main/java/com/bwie/service/UserService.java b/src/main/java/com/bwie/service/UserService.java
new file mode 100644
index 0000000..8cc56db
--- /dev/null
+++ b/src/main/java/com/bwie/service/UserService.java
@@ -0,0 +1,8 @@
+package com.bwie.service;
+
+import com.bwie.common.LoginRequest;
+import com.bwie.common.Result;
+
+public interface UserService {
+ Result login(LoginRequest loginRequest);
+}
diff --git a/src/main/java/com/bwie/service/impl/UserServiceImpl.java b/src/main/java/com/bwie/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..c262134
--- /dev/null
+++ b/src/main/java/com/bwie/service/impl/UserServiceImpl.java
@@ -0,0 +1,29 @@
+package com.bwie.service.impl;
+
+import com.bwie.annotation.Idempotent;
+import com.bwie.common.LoginRequest;
+import com.bwie.common.Result;
+import com.bwie.mapper.UserMapper;
+import com.bwie.service.UserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class UserServiceImpl implements UserService {
+ @Autowired
+ private UserMapper userMapper;
+
+ /**
+ * |登录
+ * @param loginRequest
+ * @return
+ */
+ @Idempotent
+ public Result login(LoginRequest loginRequest) {
+ LoginRequest loginRequest1 = userMapper.login(loginRequest);
+ if (loginRequest1==null){
+ return Result.error("账号密码错误");
+ }
+ return Result.success();
+ }
+}
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
new file mode 100644
index 0000000..45dcc4d
--- /dev/null
+++ b/src/main/resources/application.yml
@@ -0,0 +1,35 @@
+
+server:
+ port: 8080
+spring:
+ datasource:
+ driver-class-name: com.mysql.jdbc.Driver
+ url: jdbc:mysql://localhost:3306/chat?useUnicode=true&characterEncoding=utf8
+ username: root
+ password: root
+ name: defaultDataSource
+mybatis:
+ mapper-locations: mappers/*xml
+ mybatis:
+ configuration:
+ map-underscore-to-camel-case: true
+
+xfxh:
+ # 服务引擎使用 讯飞星火认知大模型V2.0,如果使用 V1.5 需要将 hostUrl 修改为 https://spark-api.xf-yun.com/v1.1/chat
+ hostUrl: https://spark-api.xf-yun.com/v2.1/chat
+ # 发送请求时指定的访问领域,如果是 V1.5版本 设置为 general,如果是 V2版本 设置为 generalv2
+ domain: generalv2
+ # 核采样阈值。用于决定结果随机性,取值越高随机性越强即相同的问题得到的不同答案的可能性越高。取值 [0,1]
+ temperature: 0.5
+ # 模型回答的tokens的最大长度,V1.5取值为[1,4096],V2.0取值为[1,8192]。
+ maxTokens: 2048
+ # 大模型回复问题的最大响应时长,单位 s
+ maxResponseTime: 30
+ # 允许同时连接大模型的 websocket 数,如果是普通(免费)用户为 2,超过这个数连接响应会报错,具体参考官网。
+ QPS: 2
+ # 用于权限验证,从服务接口认证信息中获取
+ appId: 4c5ea24c
+ # 用于权限验证,从服务接口认证信息中获取
+ apiKey: d53d6f5aae8cfee01420eeff6584057f
+ # 用于权限验证,从服务接口认证信息中获取
+ apiSecret: Mzg3YTYxZjYyYTE0MTdiOTMyZTdlMTFi
diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml
new file mode 100644
index 0000000..4073a41
--- /dev/null
+++ b/src/main/resources/mapper/UserMapper.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+