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 @@ + + + + + +