## ChatGLM项目的总结
这里面主要包含项目中重要的逻辑,是准备面试用的。
具体的总体架构设计参考这个仓库https://github.com/Halukisan/MyChatGLM
### 支付领域
下图是关于支付的大概流程,里面的细节以及各种补偿处理,后续补充(可能在文章其他部分写着)。
1. 可能出现HTTP请求超时
2. 支付回调时系统宕机
3. 支付成功发送MQ消息丢失
4. 长时间未支付,超时
用户下单部分是通过购物车下单,然后创建订单然后支付,用户下单后,要先落库,再去创建支付单,根据创建的结果,再去更新库。
更新时可发送消息eventBus.post(tradeNo),mq中会进行发货处理,对于这整个流程会有三个任务:
1. 订单获取,查看订单状态
2. 订单补货
超时三分钟,已支付,待发货未发货的订单。这是一个定时任务,数据库中查询已支付的未发货的订单,如果由,再次eventBus.post(orderId)
```sql
select order_id as orderId
From openai_order
Where order_status = 1
AND pay_status = 1
AND NOW()>=order_time + INTERVAL 3 MINUTE
ORDER BY id ASC
LIMIT 10;
```
4. 超时关单
定时任务中调用接口查询数据库中是否由未支付订单
```sql
select order_id as orderId
From openai_order
where order_status = 0 AND NOW() >= order_time + INTERVAL 30 MINUTE
ORDER BY id ASC
LIMIT 50;
```
如果有,修改订单状态,组装支付宝client用AlipayTradeCloseRequest实现关单
![image](https://github.com/Halukisan/ProjectLearn/assets/102407304/d1496b51-9800-49ce-893f-b8a50e4491d1)
![image](https://github.com/Halukisan/ProjectLearn/assets/102407304/0e1c24aa-ef09-4936-be64-8afab75bb4a4)
### 敏感词过滤
1. 检测用户是否在白名单上。如果在,返回成功,不对聊天内容进行修改
2. 如果用户不在白名单上,则创建一个新的聚合对象,用于存储过滤后的聊天内容
3. 对于原始聊天内容中的每条消息,使用words对象来替换其中的敏感词,并将修改过的消息存储在新的聊天中
4. 返回成功响应,返回数据
![image](https://github.com/Halukisan/ProjectLearn/assets/102407304/4b6a01db-5aa4-44f8-9db8-050cdf554741)
### SDK开发
1. 定义实体类
2. 配置基础信息
3. 配置拦截器,将请求的头部添加到Authorization等信息,最后通过chain.proceed(request)执行新构建的请求
4. 会话工厂中配置日志,开启HTTP客户端,创建API服务,封装工厂,提供接口
5. 拦截器头部中的Authorization,由签名工具包创建JWT Token
6. Token:30分钟过期,缓存29分钟
![image](https://github.com/Halukisan/ProjectLearn/assets/102407304/bbfc9551-eac5-4345-b01f-99c48c367e46)
### 流式应答-后端
1. SDK中Completions方法,创建request对象,包含URL、请求方式、请求体信息等,然后返回:
```java
return this.factory.newEventSource(request.eventSource,Listener);
```
向API发送Post请求,并将EventSource与指定的eventSourceListener关联,以便处理从服务器端推送的事件流
```java
chatGLMOpenAiSession.completions(request,new EventSourceListener(){
@Override
public void onEvent......
log.info(data);
chatCompletionsReponse reponse = JSON序列化data数据为......
......
responseBodyEmitter.send(response,getData());
}
)
```
### 流式应答-前端
**用户提问**
1. 获取当前对话session
2. 更新消息,加入新的会话消息
3. 使用当前会话的属性获取会话开始时的活动消息,用户会点击新会话来清除当前的会话索引
4. 格式化活动消息
5. 创建消息系统作为发送消息的占位符
6. 调用接口,将用户发送的消息传递给后端
**模型流式应答**
1. 读取返回来的body
2. 创建文本解码器
3. 创建可读流对象
4. 异步push()方法,用于向回答队列中塞入应答消息的内容
后端流式应答接口为前端提供的数据结构是一字一字返回
![image](https://github.com/Halukisan/ProjectLearn/assets/102407304/5cbcfd08-93f6-4266-83b4-84ff5797e1a1)
### 什么是跨域