MemoryAPI 忆汇廊-开发文档
本文最后更新于:2 个月前
MemoryAPI 忆汇廊
前端代码仓库:memory-api-frontend
☕ 项目概述
这个项目是一个基于 Spring Cloud + React 的全栈微服务架构 API 接口开放平台
,致力于提供丰富的 API 接口管理与调试 工具、灵活的 计费与限制管理 功能,为开发者提供高效
、安全
、易用
的服务,助力企业创新和数字化转型。
🥘 效果展示
用户登录
丰富的接口服务
接口调用
SDK 集成
流量监控
注册用户管理
接口发布/下线
个人信息管理
🍚 使用场景
开放平台的接口提供:适用于需要提供 API 接口给其他开发者或应用程序使用的项目。
接口管理和调试:管理员和开发者可以使用该平台进行接口管理、调试和监控。
应用程序开发:开发者可以在代码中使用提供的 SDK 快速调用接口,加速应用程序开发。
计费与限制管理:适用于需要对接口调用进行计费和限制的项目,提供了灵活的计费和充值系统。
🥩 核心功能与特点
多元 API 生态:平台提供多样化的 API 接口,涵盖各种应用场景和需求,满足不同开发者的需求。接口文档详尽,易于理解和使用,方便开发者快速集成和使用。
高效 SDK 集成:平台提供多种编程语言和框架的客户端 SDK,简化开发者调用接口的过程。SDK 稳定、兼容性好,提供简洁易用的 API,提高开发效率。
实时流量监控:平台提供热门接口调用排行榜,展示最受欢迎和最常用的接口。提供详细的流量统计分析,帮助开发者了解接口的使用情况和性能表现。
资源集中管理:管理员可以全面管理平台的资源,包括注册用户信息、接口的增删管理、发布上线等。提供灵活的权限设置和角色划分,确保不同管理员之间的权限互不干扰且职责明确。
个人信息管理:用户可以注册并登录平台,管理自己的个人信息,包括账户设置、密码修改等。平台保障用户信息的安全性和隐私性,遵守相关法律法规。
🍜 访问地址
暂未部署上线,点击跳转至:个人博客 MemorySearch 开发文档
🍝 架构设计
原图链接:项目架构图
🍺 技术选型
后端
- Java 核心知识:精通 Java 语言的核心特性,包括集合类、异常处理机制,以及泛型、注解等高级特性。
- Lambda 表达式:能够熟练运用 Lambda 表达式简化代码,提升代码的可读性和可维护性。
- 工具库:熟练运用 Hutool、Apache Commons 等工具库,为日常开发提供便捷和高效的支持。
- SSM + Spring Boot:熟悉 Spring、SpringMVC、MyBatis 组成的 SSM 框架,以及基于 Spring Boot 的快速开发模式。
- MyBatis Plus + MyBatis X:能够利用 MyBatis Plus 的增强功能,结合 MyBatis X 自动化工具,实现高效的 CRUD 代码生成。
- MySQL 数据库:精通 MySQL 数据库设计,掌握索引优化、性能调优等关键技能,通过 Explain 分析等手段不断提升数据库性能。
- API 签名认证 :熟悉 API 签名认证机制,确保数据传输的安全性。
- 用户权限管理:具备实现用户角色、权限管理的经验,能够设计并实现复杂的权限控制逻辑。
- Spring Boot Starter SDK:熟悉 Spring Boot Starter 的扩展机制,能够快速集成第三方 SDK,满足业务需求。
- Nacos:掌握 Nacos 作为服务注册与发现、配置管理中心的用法,为分布式系统提供稳定的支持。
- Dubbo RPC :熟悉 Dubbo RPC 框架,了解服务治理和远程调用机制,为微服务架构提供强大的通信能力。
- Spring Cloud Gateway:能够使用 Spring Cloud Gateway 实现 API 网关,提供统一的请求入口、访问控制等功能。
- Git:熟练使用 Git 进行版本控制,保证代码的安全和可追溯性。
- IDEA:精通 IntelliJ IDEA 开发工具,利用其强大的功能提升开发效率。
- ChatGPT:能够利用 ChatGPT 进行需求理解、代码片段生成等辅助开发工作。
- Swagger:熟悉 Swagger 文档生成工具,为 API 提供清晰、规范的文档支持。
- Navicat:掌握 Navicat 数据库管理工具,方便日常数据库操作和维护。
前端
- React 核心开发:掌握 React.js 框架,能够根据业务需求定制前端模板,实现高效的前端页面渲染。
- Ant Design Pro:熟悉 Ant Design Pro 框架,能够快速搭建企业级的前端应用。
- Ant Design:熟悉 Ant Design 组件库,能够快速构建美观、功能丰富的前端界面。
- Echarts:掌握 Echarts 数据可视化库,为前端界面提供丰富的图表展示功能。
- Axios:用于发送 HTTP 请求,与后端 API 进行交互。
- ECharts:用于数据可视化,展示统计图表。
- VS Code:精通 Visual Studio Code 开发工具,利用其丰富的插件和强大的功能提升开发体验。
- WebStorm IDE:熟悉 WebStorm IDE,为前端开发提供稳定的支持。
🍰 快速启动
拉取代码后,应该如何运行该项目?
后端
修改配置文件
- 配置 Nacos、MySQL、Redis 为本机地址:
1 |
|
1 |
|
1 |
|
额外安装
在本地安装 Nacos:Nacos 下载地址
在 Nacos bin 目录下执行以下命令,启动 Nacos:
1 |
|
启动微服务
- 依次启动 memory-core、memory-gateway、memory-client 微服务
前端
::: warning 注意
确保本地 Node.js 环境配置
完成,版本为 v18.x.x
及以上
:::
- 修改接收请求的后端地址:
1 |
|
- 执行以下命令,一键启动前端项目:
1 |
|
🦪 持续优化
随着项目的发展和用户需求的增加,我们将持续优化系统性能,提升用户体验。
加强系统的安全性措施,定期进行安全审计和漏洞扫描,确保用户数据的安全。引入微服务架构将项目向容器化部署发展,确保系统的可扩展性和灵活性。
同时将引入持续集成与部署的流程,实现自动化测试和部署上线,降低运维成本。
前端框架搭建
介绍
前端框架使用 ant desigin pro 快速搭建
官网:开始使用 - Ant Design Pro
搭建
1 |
|
1 |
|
1 |
|
1 |
|
踩坑经历
如上所示,这是因为项目启动时,会使用到yarn包管理工具
当我使用如下start:dev启动项目时,项目启动无误但登录不成功,这里先不深究,放一篇解决方法作为参照:
[🧐问题]【关于登录】本地新项目,使用隐身模式打开无法登录,一直跳/login页面 · Issue #5573 · ant-design/ant-design-pro · GitHub
后端框架搭建
介绍
后端框架直接拉取 springboot-init 项目模板,完成了后端框架的快速搭建
有关具体的模板功能介绍,请移步至:SQL之父:sql-father-backend-public
建库建表
1 |
|
实体类映射
将interface_info表映射为实体类,
这一步我们借助MybatisX-Generator插件来完成(具体使用方法可移步至《掌握-JetBrains-IntelliJ-IDEA:使用心得与技巧》一文中学习了解)
InterfaceInfo接口信息类:
1 |
|
前端请求参数封装
1 |
|
1 |
|
1 |
|
后端接口实现
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
前端开发
看起来好像是少了什么依赖,但我也没动这依赖啊,不好搞。
于是我直接全部重新构建了下前端项目,可以跑起来了
2023/10/03早,时隔3个月,终于解决了这个疑惑:
拿到 Ant Design Pro前端框架后,要做四件事:
修改登录页面
1 |
|
新增注册页面
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
生成请求接口
1 |
|
1 |
|
1 |
|
保存用户登录态
获取在线用户信息
1 |
|
自定义页面
注册页
用户信息页
1 |
|
1 |
|
1 |
|
接口信息页
1 |
|
1 |
|
新增接口
1 |
|
1 |
|
做了一下午,仅仅完成了接口信息的新增功能(—_—)(2023/07/26)
本来一切都很顺利,但是在设计新增接口表单时,我犯难了:简单来讲,有两种表单的写法,均可实现新增接口功能
在 TableList/InterfaceInfo 下新增 CreateForm.tsx文件:
1 |
|
1 |
|
这个很方便,自动识别字段,并填充表单,但对于各个字段的校验和单独处理,不是很方便(目前我这么认为)
所以我选择第二种方法,所有表单的校验都手动处理,简单粗暴,更适合我这种偏后端的程序员,设计表单更好理解:
1 |
|
对于用户信息的增删改,我觉得不是很现实,哪有管理员直接在后台改人家信息的,我就不做了
另外,鱼聪明真是我的得力干将,有不懂的代码直接问它就完事了
晚上继续快速开发剩下的修改和删除接口功能,再做后端调用接口的开发
更新接口
1 |
|
1 |
|
1 |
|
1 |
|
短短的几行代码,埋藏了不少坑,我前端也不扎实,太难搞了:
点击更新后携带id查询本行数据,那个id一直显示不是number值,record.id明明是string却用不了任何API,均报错,不知道怎么封装的
拿到本行数据后,又不会搞怎么接收返回值了,发现使用useState可以解决这个问题:
1 |
|
1 |
|
1 |
|
1 |
|
删除接口
1 |
|
1 |
|
模拟接口
Hutool工具类库:入门和安装 (hutool.cn)
新建一个项目MemoryClient,用来实现后台的接口服务,注意SpringBoot与JDK版本兼容问题
引入Hutool工具类库,导入依赖坐标:
1 |
|
1 |
|
1 |
|
1 |
|
API 签名认证
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
吐槽
这里启动MemoryClient服务之后,一定要留心是否抛出异常
测试的时候,这边accessKey没传输,MemoryClient服务下一直抛异常,我没看到,盯着测试类的终端看了半天(2023/07/31晚)
开发一个SDK
1 |
|
1 |
|
1 |
|
接口的发布/下线
后台接口开发
1 |
|
1 |
|
1 |
|
前端页面展示
1 |
|
接口调用
后端接口开发
1 |
|
前端页面开发
1 |
|
1 |
|
1 |
|
请求参数
1 |
|
1 |
|
统计接口调用次数
我们实现了:用户可以在前台页面,调用后台提供的接口服务
接下来,我们要实现用户调用每个接口调用的总次数、剩余的调用次数,以保证接口的规范性
这个功能实现很简单:
- 建立用户-接口信息表,统计调用总次数、剩余次数
- 实现某个接口调用后,该用户调用总次数+1,剩余次数-1
- 详细业务流程,日后再表
建立用户-接口信息表:
1 |
|
1 |
|
GateWay网关
有关网关的相关知识,可以在《深入理解GateWay网关:原理、功能和用途》一文中了解到
GateWay官网:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
接下来,我们着手使用 GateWay 网关转发请求路由:
编写GateWay网关全局过滤器:(2023/08/19晚)
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
整体架构
梳理网关业务逻辑
到此为止,我们梳理下引入网关服务后,用户调用接口时,整体项目的业务流程:(2023/08/23晚)
- 用户点击调用接口
- memory-api-backend处理HTTP请求
- 引入memory-client-sdk工具包,转发请求至GateWay网关
- GateWay网关统一鉴权、将路由转发至memory-client
- memory-client处理该请求,调用对应的后台接口,调用成功后返回响应结果
Dubbo远程调用
业务流程分析
这个步骤的作用是什么呢?
前面我们引入了GateWay网关,对调用后台接口的请求作统一鉴权,包括以下几方面:
- 确认调用者权限、是否分配accessKey、secretKey,是否剩余调用次数
- 确认被调用接口是否存在、是否发布上线
- 执行调用,做好后台用户-接口的调用次数统计,比如调用次数totalNum+1、剩余次数leftNum-1
以上业务流程执行完毕以后,GateWay网关才会把用户请求转发给后台接口,由后台接口响应请求(2023/08/23晚)
这些统一鉴权操作都涉及到对数据库的操作,在GateWay网关中,该如何实现呢?
而我们不希望在GateWay网关中实现这些方法,我们可以在网关中,调用其他项目的方法
如何调用其他项目的方法
- 复制代码、依赖和环境
- HTTP 请求(提供/暴露一个接口,供其他项目使用)
- RPC
- 把公共的代码打包 JAR 包,其他项目引用(客户端 SDK)
RPC
作用:像本地方法一样调用远程方法
- 对开发者更透明,减少了很多的沟通 成本
- RPC 想远程服务器发送请求时,未必要使用 HTTP 请求,比如还可以用 TCP/IP,性能更高(内部服务更适用)
Dubbo 框架(RPC 实现)
- GRPC、TRPC
官方文档:https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/quick-start/spring-boot/
两种使用方式:
Spring Boot 代码(注解 + 编程式):写 Java 接口,服务提供者和消费者都去引用这个接口
IDL(接口调用语言):创建一个公共的接口定义文件,服务提供者和消费者都去读取这个文件。优点是跨语言,所有的框架都熟悉。
底层是 Triple 协议:https://cn.dubbo.apache.org/zh/docs3-v2/java-sdk/concepts-and-architecture/triple/
示例学习
- zookeeper 注册中心:通过内嵌的方式运行,更方便
最先启动注册中心,先启动服务提供者,再启动服务消费者
有关 Dubbo 框架 + Nacos / ZooKeeper 实现调用远程服务,可以在官方文档中了解到:
Nacos 快速开始
Nacos | Apache Dubbo
当然,也可以在该文章下了解学习:《从零开始构建分布式服务架构:用Dubbo和注册中心实现远程调用、服务注册与发现、配置管理》(2023/08/23晚)
抽象公共服务
- 抽取User、InterfaceInfo等实体类到memory-commen中
- memory-commen提供三个接口:校验用户、校验接口、执行调用
- 由memory-api-backend实现这三个接口,提供对外服务,并注册服务至nacos注册中心
- GateWay网关向nacos注册中心调用服务,实现统一鉴权
这里使用Maven实现公共服务的抽取,非常值得学习参考,详情可见《Maven奇技淫巧:优化项目构建与性能调优》一文
统计分析功能
- 开发一个新页面,统计调用次数最多的接口(调用次数多:收费提高,调用次数少:下线)
后端接口开发
1 |
|
1 |
|
可视化数据图表
Apache ECharts:Apache ECharts
AntV:AntV | 蚂蚁数据可视化
使用详情可见《前端框架踩坑与技巧总结:Ant Design、Vite,助您无忧编程》一文,效果如下:
梳理全局业务流程
接下来,我们将梳理用户选择调用接口,到接口成功响应并返回结果的全过程:(2023/08/24早)
- 先后启动Nacos注册中心、memory-api-backend、GateWay网关服务、memory-client接口服务
- 用户调用接口,发起请求
- 处理请求,使用memory-client-sdk工具包,将请求转发至GateWay网关:
1
2
3
4
5
6
7
8
9
10// 用户调用接口
User LoginUser = userService.getLoginUser(request);
String accessKey = LoginUser.getAccessKey();
String secretKey = LoginUser.getSecretKey();
MemoryClient tempClient = new MemoryClient(accessKey, secretKey);
Gson gson = new Gson();
com.memory.clientsdk.model.User user = gson.fromJson(userRequestParams, com.memory.clientsdk.model.User.class);
//TODO 根据不同地址调用对应接口
String usernameByPost = tempClient.getUserByPost(user);1
2
3
4
5
6
7
8
9
10
11
12/**
* @param user
*/
public String getUserByPost(User user) {
String json = JSONUtil.toJsonStr(user);
return HttpRequest.post(GATEWAY_HOST + "/api/name/user")
.addHeaders(getHeaderMap(json))
.body(json)
.execute()
.body();
}- GateWay网关作统一鉴权:
1
2
3
4
5
6
7
8
9
10// 4.1.校验accessKey
// todo 从数据库中查询, accessKey是否分配给该用户
if (accessKey == null || !accessKey.equals("memory")) {
return handleNoAuth(response);
}
// accessKey是否分配给该用户
User invokeUser = innerUserService.getInvokeUser(accessKey);
if (invokeUser == null) {
return handleNoAuth(response);
}1
2
3
4
5
6
7
8
9
10
11
12// 4.5.校验sign
// todo 从数据库中查询, secretKey是否分配给该用户
// secretKey是否分配给该用户
String secretKey = invokeUser.getSecretKey();
if (secretKey == null || !secretKey.equals("123456")) {
return handleNoAuth(response);
}
String serverSign = SignUtils.getSign(body, secretKey);
if (sign == null || !sign.equals(serverSign)) {
return handleNoAuth(response);
}1
2
3
4
5
6// 5. 请求的模拟接口是否存在
// todo 从数据库中查询请求调用的接口是否存在 请求方法是否匹配 请求参数是否符合要求等
InterfaceInfo interfaceInfo = innerInterfaceInfoService.getInterfaceInfo(path, method);
if (interfaceInfo == null) {
return handleNoAuth(response);
}- GateWay转发请求,调用后台接口:
1
2
3
4
5
6
7
8
9spring:
# 网关过滤
cloud:
gateway:
routes:
- id: memory-api
uri: http://localhost:8123
predicates:
- Path=/api/**1
2// 6.调用接口
return handleResponse(exchange, chain, interfaceInfo.getId(), invokeUser.getId());1
2
3
4
5
6
7
8
9
10return super.writeWith(fluxBody.map(dataBuffer -> {
// todo 调用成功, 次数 + 1
// 7. 调用成功,接口调用次数 + 1 invokeCount
try {
innerUserInterfaceInfoService.invokeCount(interfaceInfoId, userId);
} catch (Exception e) {
log.error("invokeCount error", e);
}
.....................
}- 调用成功,返回响应结果:
1
2
3
4@PostMapping("/user")
public String getUserNameByPost(@RequestBody User user, HttpServletRequest request) {
return "POST 我的名字是: " + user.getName();
}
后续优化
接口添加
随机显示一条名言
- 在Mappper中写自定义SQL查询语句
1 |
|
总结下简单的流程:(2023/09/21午)
- 用户携带参数请求接口
- 根据请求接口Id,校验判断该接口的可用性,借助sdk工具包调用该接口
- sdk发送的调用接口的请求,首先来到 GateWay 作统一鉴权、统一业务处理、路由转发等操作
- 由网关转发接口请求到对应接口,处理完成后返回结果,完成接口调用
后续将进行页面优化,并提供多个简单的接口实现,目前有想法的接口实现为:(2023/09/21午)
- 自动生成头像
- 返回随即壁纸(这个计划使用Java爬虫爬取别的网页数据,正好复习下这方面的知识,巩固MemorySearch的学习经验)
- 在线翻译功能(暂时没有想法,接入别的在线翻译平台嘛)
获取随机壁纸
- 基本流程跑通:(2023/11/19晚)
1 |
|
- 接口改写成这样子了:
1 |
|
- 妈的,出现了这样的报错:
1 |
|
- 排了一个小时的错,可算发现了:Picture 不支持序列化
1 |
|
- 平时这种实体类都是使用 MybatisX-Generator 快速生成的,没注意到实体类要支持序列化 (2023/11/20晚)
根据不同url请求不同接口
每条接口的信息有:接口名、接口url、请求参数等等
当前情况是:用户调用接口时,前端传回了调用者的id,且仅实现了对后台一个接口的调用
问题是,当实现调用多个接口时,我们该如何保证用户对不同接口的调用,后台能够正确转发?
- 每个接口调用都写一个controller
- 统一controller接收接口调用请求,再分情况调用相应接口
我比较倾向于第二种方法,但如何根据用户调用情况来调用不同的接口呢?我还没想好,目前计划使用switch枚举接口id来确定调用的接口
因为现在开放的接口数量很少嘛,暂时这样也可行(2023/09/06午)
半个月前的想法还是很正确的,当时已经完成这个功能了,只不过没有记录实现思路(被GateWay网关传递中文乱码整麻了)
1 |
|
1 |
|
这里的实现方法还是挺丑陋的
- 因为接口调用时,传递了调用接口的id,在多次斟酌后,还是选择使用简单的if-else分支实现对不同接口的调用
在这里当时还记录了一个踩坑经验:mapper 注入为 null,这次经历确实让我记忆犹新(2023/09/21午)
用户登录/登出体验优化
- 在AvatarDropdown.tsx下,我修改了当用户未登录时的页面展示状态,并使用了umi插件的声明式页面跳转,完成用户登录跳转:
1 |
|
1 |
|
1 |
|
- 当前页面效果:
这里留下了疑问,也是我之前遇到的,即umi的声明式跳转使用不了,官方文档中的教程有问题(待解决,2023/09/22午)
在页面间跳转 | UmiJS
丰富项目首页
- 简单地优化了首页关于该项目的介绍和我的个人简介
区分管理员页面和普通用户页面
- 在管理员账号下
1 |
|
1 |
|
简单的主页画面优化
- 这个其实没什么好记录的,但是我最近一直在写 Vue,换成React后有点不适应,就先在此记录了
1 |
|
React的语法真神奇,计划将默认的侧边栏改掉,改成顶部导航栏
成功写好了接口广场首页,如图所示:
1 |
|
1 |
|
- 接口后台添加:接口封面图片字段(interfaceUrl) (2023/09/27晚)
接口大厅页面优化
前段时间参加了职业生涯规划大赛,参赛材料为:一份
生涯发展报告
(.pdf 文件) + 一份生涯发展展示
(PPT)本来还满心欢喜地盼着打到校赛,拿个实习 offer 啥的,结果昨晚通知群直接通知今晚7点开始院赛,我还没被评上。
奶奶的,一个院里六十来个参赛者,绝大部分都是 2022 级的,竟然还有好多大一的,大三大四的倒没几个
我这 PPT 也是花了心思的,我用文心一言大模型给我做了4份大学生职业生涯规划的PPT,然后取其精华,去其糟粕
凭借着我浅陋且贫瘠的审美he1设计灵感,选择了最合适的主题色,结合我自己的履历,拼凑出了一份完美的生涯发展展示
结果这份参赛材料竟然没有撑过第一轮筛选,连区区几个学弟学妹的履历都拼不过嘛。。。咱学校的比赛环境真的是一言难尽
他们究竟是什么样的可怕怪物,今晚7点见分晓,届时再到此处做评判
- 附上几张
生涯发展展示
的截图吧,自我感觉很满意的:(2023/11/09晚)
- 看到那几张个人项目展示的截图没?所以我才在这个栏目下唠闲话,hiahiahia
我观摩回来了,一群妖魔鬼怪,什么几把职业规划大赛,吹牛逼大赛
没有任何履历,不讲述自己的专业水平能力,张口闭口就是要做自动化工程师、软件测评师,我的专业水平还很欠缺,还需努力学习
我要做好大学生活的规划,有个家伙做规划,四个阶段,每个阶段10年,都特么规划到2049年了,关键还没细讲,一句话带过
全是写个指导老师就上去的:自我认知,职业评测,,职业规划,未来展望,他们的生涯发展展示跟一个模子里刻出来的一样
好多都是23级的,有着丰富的项目实战经验和优秀的专业水平能力,你特么上大学才两个月不到,这PPT抄的太不走心了吧
大学的这种比赛含金量真是让我一言难尽,还是把时间都放在个人提升上吧(2023/11/09晚)
用户头像链接
- 哈哈哈哈,直接在 itab标签页 上找到我的头像链接:
- 我只能说相当好用:(2023/11/18晚)
优化 API 文档描述
1 |
|
- 核心功能已经完成了,做好 API 文档、在线接口调试、错误码参照和示例代码的页面优化(2023/11/22晚)
1 |
|
代码块
- 如何实现代码块显示?
- 这里简单演示一下使用
ReactMonacoEditor
组件实现代码块: - 安装
ReactMonacoEditor
:
1 |
|
- 导入组件:
1 |
|
- 编辑代码和简单的样式设置:
1 |
|
- 使用
ReactMonacoEditor
组件:
1 |
|
开发者文档
- 拖欠很久的想法了,为我的项目做一个开发者文档:(2023/11/25晚)
- 使用 Vuepress 快速建站,并配置第三方主题:了解了整个 demo 文档的架构之后,着手修改,开启自定义配置:
区别各个接口调用页面显示
花费了将近半个月的时间,总算将基于 Vuepress 搭建文档站点的思路摸清楚了 (2023/12/07晚)
详细的搭建和部署流程都记录在《前端框架踩坑与技巧总结:Ant Design、Vite,助您无忧编程》一文中,如有需求可跳转至该文章下了解学习~
随着接口的增多,每个接口对应的 API 文档、请求参数配置、响应码等都各不相同,我们需要根据不同的接口,显示不同的页面
这就需要我们在外部文件编写页面,并在接口调用页面导入外部页面组件了:
如下,编写页面组件
RandomPoem
:
1 |
|
- 在需要引入该组件的页面导入该组件,并引入:
1 |
|
- 具体的思路是:根据当前接口(根据当前接口对应的 url 值,直接匹配展示对应的页面组件),简单的代码演示如下:(2023/12/08晚)
1 |
|
1 |
|
如上,用三元表达式来展示接口的
url
值成功实现:
1 |
|
- 基本完成了各个接口的调用页面区分:(2023/12/09晚)
自定义 Starter
- 之前我们开发过 memory-client-sdk 接口调用 SDK,但是不够完善,今天在保持原有功能不变的情况下,重构该 SDK:(2024/01/08晚)
新建 Spring Boot 项目
- 新建 Spring Boot 项目
memory-client-spring-boot-starter
:
1 |
|
依赖配置
- 在
pom.xml
文件下,新增如下依赖:
1 |
|
spring-boot-configuration-processor
在自定义 Spring Boot Starter 时的作用主要是生成配置元数据、提供代码提示和自动补全,以及确保配置属性的正确解析:- 生成配置元数据:该依赖会根据在项目中定义的带有
@ConfigurationProperties
注解的类,在META-INF
文件夹下生成spring-configuration-metadata.json
文件。这个文件是一种元数据文件,其中包含了关于配置属性的信息,如属性名称、类型、默认值等。这些信息可以用于在IDE中编辑配置文件时提供代码提示和自动补全等功能。 - 提供代码提示和自动补全:当你在IDE中编辑配置文件时,由于
spring-boot-configuration-processor
生成的元数据,IDE 会提供代码提示和自动补全功能。这使得在编写配置文件时更加方便,降低了因拼写错误或配置项不正确而导致的错误。 - 确保配置属性的正确解析:
spring-boot-configuration-processor
在编译时会对带有@ConfigurationProperties
注解的类进行处理,确保配置属性能够被正确地解析和绑定。这对于自定义的 Starter 来说非常重要,因为正确的解析和绑定配置属性是保证 Starter 功能正常的前提。
- 生成配置元数据:该依赖会根据在项目中定义的带有
- 注意,新建的 Spring Boot 项目的
pom.xml
文件下,都会有build标签
,记得移除 👇:
1 |
|
新增配置文件类
- 在 properties 目录下,新增配置文件类 MemoryClientProperties:
1 |
|
@ConfigurationProperties
注解能够自动获取 application.properties 配置文件中前缀为spring.girlfriend
节点下message
属性的内容
新增功能接口
- 在 service 目录下,新增功能接口 MemoryClientService,用来实现对各个接口发起调用:
1 |
|
新增功能接口实现类
- 在 service/impl 目录下,新增功能接口实现类 MemoryClientServiceImpl,用来实现对各个接口发起调用:
1 |
|
新增自动配置类
- 新增自动配置类 MemoryClientAutoConfiguration,实现自动化配置功能:
1 |
|
- 简单介绍下这几个注解的作用:
@Configuration
: 标注类为一个配置类,让 spring 去扫描它;- @ConditionalOnClass
:条件注解,只有在
classpath路径下存在指定 class 文件时,才会实例化 Bean
- @EnableConfigurationProperties
:使指定配置类生效;
- @Bean
: 创建一个实例类注入到 Spring Ioc 容器中;
- @ConditionalOnMissingBean`:条件注解,意思是,仅当 Ioc 容器不存在指定类型的 Bean 时,才会创建 Bean。
配置自动装配类路径
配置自动装配的类的路径,这样 Spring Boot 会在启动时,自动会去查找指定文件
/META-INF/spring.factories
,若有,就会根据配置的类的全路径去自动化配置:在 Spring Boot 2.x 中,在 resource/META-INF/spring.factories 文件下,添加如下配置来标记自动配置类:
1 |
|
- 而在 Spring Boot 3.x 中,在 resource/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件下,添加如下配置:
1 |
|
打包
- 是将
girl-friend-spring-boot-starter
打成jar
包,放到本地的maven
仓库中去在项目根路径下执行 maven 命令:
1 |
|
引用自定义 Starter
- 在需要引入
memory-client-spring-boot-starter
接口调用功能的Spring Boot 项目
中的pom.xml
文件中,导入依赖:
1 |
|
- 在
resouce
目录下的application.yaml
配置文件下,添加如下配置:
1 |
|
- 注入
MemoryClientService
,可以对任一接口服务发起调用:
1 |
|
随机壁纸优化
- 推荐该网站:
- 使用 Jsoup 库爬取该网页:
1 |
|
- 从结果中随机选取五条结果:
1 |
|
优化方向
看了别人的接口统计计费功能,很复杂呵:(2023/12/27早)
- 限制接口调用次数,支持购买接口调用次数
- 设计虚拟货币,比如说积分,开设相应的积分购买活动,用户发起支付即可获取对应积分,积分可用来换取接口调用次数
- 这就需要在用户管理中,增加积分管理功能
- 开设了相应的积分购买活动,还需要在管理员功能中,增加积分购买活动的管理功能,可支持活动的发布和下线
- 用户购买积分,生成一份订单,需要设计对应的订单管理功能
- 我时间精力有限,暂时不做这些复杂的功能,不过接口调用次数限制是很有必要的,可以简单实现每日获取50次接口调用的功能
- 暂时就这些想法
接口开放平台优化:
- 个人中心:个人信息设置、我的积分、签到免费领取、提供开发者 SDK 下载,快速接入 API 接口
- 接口调用:限制接口调用次数,做好提示
统计分析功能:
- 调用次数分析:
- 响应时间分析:
- 用户行为分析:
- 接口调用来源分析:
- 趋势分析:
完善用户信息管理,完善接口信息管理,完善接口服务
亮点
踩坑记录
mapper 注入为 null
- 半个月前,我新增了一条接口:随机返回一条名言
- 当时是这样调用接口的:
- 当请求转发到 GateWay 网关时,接受到的参数就变成乱码了(可惜截不到原图了,这是现在的调用效果):
- 这就是 GateWay 网关接收中文参数变成乱码的问题了,关于这个我尝试了各种配置去解决,但均无果
- 把我搜集到的这些:通过配置来解决中文乱码的解决方案(虽然没什么效果),简单的贴出来吧,有机会再研究:
1 |
|
1 |
|
- 于是我就想,我为什么非得传中文呢?写个枚举类,把名言类型枚举,改为传递对应的整数不就行了嘛
- 于是就有了现在的解决方案,详情可见上文中的 后续优化 -> 随机显示一条名言一栏 (2023/09/21)