1.接口文档配置
基础知识:SpringDoc注解的使用,它是基于OpenAPI 3和Swagger 3的现代化解决方案,相较于旧版的Swagger2即SpringFox,SpringDoc提供了更简洁、更直观的注解方式。
详见springboot集成springdoc-openapi(模拟前端请求)_springdoc-openapi-ui-优快云博客
doc文档配置类
修改公共参数
/**
* 构建 Tenant 租户编号请求头参数
*
* @return 多租户参数
*/
private static Parameter buildTenantHeaderParameter() {
return new Parameter()
.name(HEADER_TENANT_ID) // header 名
.description("租户编号") // 描述
.in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header
.schema(new IntegerSchema()._default(1L).name(HEADER_TENANT_ID).description("租户编号")); // 默认:使用租户编号为 1
}
有个不算bug的buffer,浏览器不会默认勾选http请求头参数tenant-id,需要手动勾选,如果项目不需要,可以在配置中设置忽略该请求,application.yaml
tenant: # 多租户相关配置项
ignore-urls
统一参数在TenantSecurityWebFilter.java类拦截,
修改文档名称
配置信息在appplication.yaml 147行170行
可修改title,显示自己的文档名称
文档增加group的选项值
配置文档类中重点是下面这个代码,代码参考InfraWebConfiguration.java,复制一下改个名称就可以了
/**
* 所有模块的 API 分组
*/
@Bean
public GroupedOpenApi allGroupedOpenApi() {
return buildGroupedOpenApi("all", "");
}
2.Controller增加统一url前缀
WebProperties.java类实现,只要符合**.conroller.app.**的包路径就为/app-api
接口文档
对应代码中的tag
3.编写自己的逻辑
增加包扫描,修改YudaoServerApplication.java类@SpringbootApplication(scanBasePackages ...
增加数据库扫描
@MapperScan("cn.xxx.xxx.module.domestic.biz.dao")
@Configuration
public class MybatisPlusConfig
4.Uni-app登录逻辑
本地短信登录debug发送验证码为9999,登录后前端将返回的值保存在header里的参数Authorization
必须登录则在controller上加入注解@PreAuthenticated,注解的实现类为PreAuthenticatedAspect.java。登录是将用户对象转换成string,使用key-value方式保存到redis中。
5.城市地区信息
城市地区信息保存在area.csv文件,启动时加载到内存,使用AreaUtils.java获取城市信息。AppAreaController
6.文件上传
/admin-api/infra/file/upload
AppFileController
6.1文件下载
FileController
在管理界面修改存储主配置
7.站内信息
NotifyMessageController
8.maven编译打包项目
如果打包不了,一定是maven版本不对,maven版本不能低于3.5.4,所以安装3.8版本的maven就可以了,具体安装方式如下:
(真保姆级)Mac系统Maven下载,配置环境变量,配置本地仓库、阿里云镜像_maven阿里云镜像-优快云博客
其次检查最外层的pom文件modules的引用是否正确,少引用了mavne会首先从本地服务器查找,本地缺失就会从服务器下载,下载不到就编译报错。
9.定时任务启用
① 导入 sql
目录下,对应数据库的 quartz.sql
文件,初始化 Quartz 表结构。
② 在 application-local.yaml (opens new window) 配置文件中,通过 spring.quartz
配置项,设置 Quartz 使用 MySQL 实现集群。考虑到 local
本地和 dev
测试环境使用相同的数据库,如果 local
也跑定时任务,可能会影响 dev
测试环境的执行。所以默认配置下,local
禁用了定时任务。
重要!!!如果你要开启 local
的定时任务,可以删除 - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration
那一行即可开启。
③ 启动项目后,调用 JobController 提供的
#syncJob()
接口,将 infra_job
表的任务同步到 Quartz 中。
SchedulerManager YudaoQuartzAutoConfiguration
10多租户问题
url无需Header 必须带上 tenant-id,
通过 yudao.tenant.ignore-urls
配置项,可以设置哪些 URL 无需带该请求头。
表无须添加多租户字段,需要添加表名到 yudao.tenant.ignore-tables
配置项目。
redis的多租户隔离方案:例如说,假设 Redis Key 是 user:%d
,示例是 user:1024
;对应到多租户 1 的 Redis Key 是 user:t1:1024
。
11websocket的使用
使用客户端连接 websocket在线测试 本地默认url ws://127.0.0.1:8080/ws?token=xxx
。
判断是否进行了连接请求,在OAuth2TokenServiceImpl.getAccessToken()方法上打断点,
未能连接可能错误:nginx未配置
发送消息处理类JsonWebSocketMessageHandler.handleTextMessage()
消息文本为{"type":"demo-message-send","content":"{\"toUserId\":null,\"text\":\"fsdfsd\"}"}
实现原理:基于Spring WebSocket实现
WebSocket 建立时,通过 QueryString 的 token
参数,进行认证。例如说:ws://127.0.0.1:48080/ws?token=xxx
。
认证完成后获取用户信息,使用WebSocketFrameworkUtils.getLoginUser();
会话WebSocketSession 的管理,由 WebSocketSessionManager (opens new window) 定义接口,由 WebSocketSessionManagerImpl (opens new window) 具体实现。
// 添加和移除 Session
void addSession(WebSocketSession session);
void removeSession(WebSocketSession session);
// 获得 Session,多种维度
WebSocketSession getSession(String id); // Session 编号
Collection<WebSocketSession> getSessionList(Integer userType); // 用户类型
Collection<WebSocketSession> getSessionList(Integer userType, Long userId); // 用户编号
Message .消息推送
① 项目的 WebSocketMessageSender (opens new window) 接口,定义了给 Session 发送消息的方法。如下所示:
// WebSocketMessageSender.java
// ① 发送消息给指定用户
void send(Integer userType, Long userId, String messageType, String messageContent);
default void sendObject(Integer userType, Long userId, String messageType, Object messageContent) {
send(userType, userId, messageType, JsonUtils.toJsonString(messageContent));
}
// ② 发送消息给指定用户类型
void send(Integer userType, String messageType, String messageContent);
default void sendObject(Integer userType, String messageType, Object messageContent) {
send(userType, messageType, JsonUtils.toJsonString(messageContent));
}
// ③ 发送消息给指定 Session
void send(String sessionId, String messageType, String messageContent);
default void sendObject(String sessionId, String messageType, Object messageContent) {
send(sessionId, messageType, JsonUtils.toJsonString(messageContent));
}
前端代码 对应 /views/infra/websocket/index.vue
12.缺少数据库脚本
需要购买或自己根据类进行反向工程,有真需要的直接留言我发你反向好的。
13.微服务调用,feign调用
以保存文件为例,在调用的工程中找到RpcCofiguration类,添加FileApi.class
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class}) // 如有多个可用,隔开添加 {FileApi.class,xxx.class}
public class RpcConfiguration {
}
然后在需要调用的类中添加以下代码
@Resource
private FileApi fileApi;
这样就可以调用fileApi类的方法了。新增被调用的微服务,参考FileApi的写法。
14.支付回调
一般回调url为/trade/order/update-paid
15.一些小bug
A.充值不了,需要修改PayWalletRechargeServiceImpl.java类中的appid
B.订单创建报错,注释掉运费模板报错的代码
C.无法加载除基础模块外的其它模块,访问的时候出现404,修改二个pom,最外层的和youdao-server的pom