ljt #6

Merged
pxunm4f7q merged 32 commits from 吕璟涛 into main 1 year ago

@ -1,195 +1,199 @@
<p align="center">
<a href="https://wx.xxccss.com/"><img src="image/logo.png" width="45%"></a>
</p>
<p align="center">
<strong>🍬Java版微信聊天记录备份与管理工具</strong>
</p>
<p align="center">
👉 <a href="https://wx.xxccss.com/">https://wx.xxccss.com/</a> 👈
</p>
<p align="center">
<a href="https://hellogithub.com/repository/5055dcceee434dc5851ac9897cb27396" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=5055dcceee434dc5851ac9897cb27396&claim_uid=AVv4KeNnZs2Ig3a" alt="FeaturedHelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
</p>
<p align="center">
<a href="https://github.com/xuchengsheng/spring-reading/stargazers"><img src="https://img.shields.io/github/stars/xuchengsheng/wx-dump-4j?logo=github&logoColor=%23EF2D5E&label=Stars&labelColor=%23000000&color=%23EF2D5E&cacheSeconds=3600" alt="Stars Badge"/></a>
<a href="https://github.com/xuchengsheng"><img src="https://img.shields.io/github/followers/xuchengsheng?label=Followers&logo=github&logoColor=%23FC521F&labelColor=%231A2477&color=%23FC521F&cacheSeconds=3600" alt="Follow Badge"></a>
<a href="https://github.com/xuchengsheng/wx-dump-4j/fork"><img src="https://img.shields.io/github/forks/xuchengsheng/wx-dump-4j?label=Forks&logo=github&logoColor=%23F2BB13&labelColor=%23BE2323&color=%23F2BB13" alt="Fork Badge"></a>
<a href="https://github.com/xuchengsheng/wx-dump-4j/watchers"><img src="https://img.shields.io/github/watchers/xuchengsheng/wx-dump-4j?label=Watchers&logo=github&logoColor=%23FF4655&labelColor=%234169E1&color=%23FF4655&cacheSeconds=3600" alt="Watchers Badge"></a>
</p>
<p align="center">
<img src="https://img.shields.io/badge/Java-11%2B-%23437291?logo=openjdk&logoColor=%23437291"/>
<img src="https://img.shields.io/badge/Spring-5.3.10-%23437291?logo=Spring&logoColor=%236DB33F&color=%236DB33F"/>
<img src="https://img.shields.io/badge/SpringBoot-2.5.5-%23437291?logo=SpringBoot&logoColor=%236DB33F&color=%236DB33F"/>
<img src="https://img.shields.io/badge/JNA-5.8.0-%23437291?logo=JNA&logoColor=%23228B22&color=%23228B22"/>
<img src="https://img.shields.io/badge/Hutool-5.8.16-%23437291?logo=JNA&logoColor=%23F08080&color=%23F08080"/>
<img src="https://img.shields.io/badge/easyexcel-5.8.16-%23437291?logo=JNA&logoColor=%23D2691E&color=%23D2691E"/>
<img src="https://img.shields.io/badge/protobuf-3.25.1-%23437291?logo=JNA&logoColor=%23800080&color=%23800080"/>
<img src="https://img.shields.io/badge/mapstruct-1.4.2-%23437291?logo=JNA&logoColor=%23DC143C&color=%23DC143C"/>
<img src="https://img.shields.io/badge/druid-1.2.20-%23437291?logo=JNA&logoColor=%23C71585&color=%23C71585"/>
<img src="https://img.shields.io/badge/mybatisPlus-3.5.4.1-%23437291?logo=JNA&logoColor=%234B0082&color=%234B0082"/>
<img src="https://img.shields.io/badge/sqlite-3.34.0-%23437291?logo=JNA&logoColor=%230000CD&color=%230000CD"/>
<img src="https://img.shields.io/badge/lombok-1.18.20-%23437291?logo=JNA&logoColor=%23008B8B&color=%23008B8B"/>
</p>
-------------------------------------------------------------------------------
## 📚 简介
wx-dump-4j是一款基于Java开发的微信数据分析工具。它准确显示好友数、群聊数和当日消息总量提供过去15天每日消息统计了解社交活跃度。识别展示最近一个月内互动频繁的前10位联系人。支持导出聊天记录、联系人、群聊信息及查看**超过三天限制的朋友圈**历史记录和**找回微信好友**。
## 💡 主要功能
- 👤 **获取用户信息**获取当前登录微信的详细信息包括昵称、账号、手机号、邮箱、秘钥、微信Id。
- 💬 **支持多种消息类型**:管理微信聊天对话中的文本、引用、图片、表情、卡片链接、系统消息等。
- 📊 **综合管理**:提供微信会话、联系人、群聊与朋友圈的全面管理功能。
- 📥 **记录导出**:支持导出微信聊天记录、联系人、已删除好友和群聊信息,便于备份和管理。
- 📅 **查看历史朋友圈**:突破三日限制,查看更久以前的朋友圈历史记录,方便回顾和管理。
- 📈 **微信统计功能**:展示微信好友数、群聊数及今日收发消息总量,了解社交活跃度。
- 📊 **消息统计**统计过去15天内每日微信消息数量掌握长期消息交流情况。
- 🔝 **互动联系人**展示最近一个月互动最频繁的前10位联系人了解重要社交联系。
- 🧩 **消息类别占比**:展示微信消息类别占比图表,分析不同类型消息的占比情况。
- ☁️ **关键字词云**:展示微信最近使用的关键字词云图,分析聊天内容重点。
- 🔄 **找回已删除好友**:支持找回已删除的微信好友,恢复重要联系人。
- 🖥️ **微信多开支持**:支持微信多开功能,方便管理多个账号,提高效率。
## 🚀 快速启动
本指南将帮助您快速启动并运行项目,无论是安装包部署还是本地部署。
### 环境准备
在开始之前,请确保您的开发环境满足以下要求:
- 安装 [Java](https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_windows-x64_bin.exe),版本为 JDK 11+。
- 安装 [Node.js](https://nodejs.org/en/),版本为 18+。
- 安装 [Maven](https://maven.apache.org/download.cgi),版本为 3.5.0+。
- 选择一款开发工具,比如 IntelliJ IDEA。
### 二进制部署
- 点击下载最新版 [wx-dump-4j-bin.tar.gz](https://github.com/xuchengsheng/wx-dump-4j/releases/download/v1.1.0/wx-dump-4j-bin.tar.gz)。
- 解压缩 `wx-dump-4j-bin.tar.gz` 文件,并进入 `bin` 目录。
- 双击 `start.bat` 启动文件。
- 启动成功后,在浏览器中访问 [http://localhost:8080](http://localhost:8080) 以查看应用。
### 本地部署
- 下载源码:
```bash
$ git clone https://github.com/xuchengsheng/wx-dump-4j.git
```
- 安装后端依赖:
```bash
$ cd wx-dump-4j mvn clean install
```
- 使用开发工具(如 IntelliJ IDEA启动 com.xcs.wx.WxDumpApplication。
- 安装前端依赖:
```bash
$ cd wx-dump-ui npm install
```
- 启动前端服务:
```bash
$ npm run start
```
- 前端服务启动成功后,在浏览器中访问 http://localhost:8000 以查看应用。
## ⚡ 技术栈
以下是本项目使用的技术栈:
| 技术 | 描述 | 版本 |
|--------------|---------------------------|-----------|
| Spring Boot | Web 和 Thymeleaf 框架 | 2.7.15 |
| SQLite | 轻量级数据库 | 3.34.0 |
| Lombok | 简化 Java 代码 | 1.18.20 |
| MyBatis Plus | ORM 框架扩展 | 3.5.4.1 |
| Dynamic Datasource | 动态数据源管理 | 4.2.0 |
| Druid | 数据库连接池 | 1.2.20 |
| MapStruct | Java Bean 映射工具 | 1.4.2.Final |
| Hutool | Java 工具库 | 5.8.16 |
| JNA | Java 本地访问 | 5.8.0 |
| Protobuf | 序列化框架 | 3.25.1 |
| gRPC | RPC 框架 | 1.11.0 |
| EasyExcel | Excel 操作工具 | 3.3.3 |
| Commons Compress | 压缩和解压缩工具 | 1.19 |
| Jackson Dataformat XML | XML 解析工具 | 2.13.5 |
| Commons Lang3 | 常用工具类库 | 3.12.0 |
## ⛔️️ 使用限制
本软件仅适用于Windows操作系统。我们目前不支持macOS、Linux或其他操作系统。如果你在尝试在非Windows系统上运行本软件时可能遇到兼容性问题这些问题可能导致软件无法正常运行或产生其他意外后果。
| 操作系统 | 支持情况 |
|:--------:|:----------:|
| Windows | 支持 |
| macOS | 不支持 |
| Linux | 不支持 |
## ⚠️免责声明
本软件仅供技术研究和教育目的使用,旨在解密用户个人微信聊天记录。严禁将本软件用于任何非法目的,包括但不限于侵犯隐私权或非授权数据访问。作为软件开发者,我不对因使用或滥用本软件产生的任何形式的损失或损害承担责任。
## ⛵欢迎贡献!
如果你发现任何错误🔍或者有改进建议🛠️,欢迎提交 issue 或者 pull request。你的反馈📢对于我非常宝贵💎
## 💻我的 GitHub 统计
[![Star History Chart](https://api.star-history.com/svg?repos=xuchengsheng/wx-dump-4j&type=Date)](https://star-history.com/#xuchengsheng/wx-dump-4j&Date)
## 🎉Stargazers
[![Stargazers123 repo roster for @xuchengsheng/wx-dump-4j](https://reporoster.com/stars/xuchengsheng/wx-dump-4j)](https://github.com/xuchengsheng/wx-dump-4j/stargazers)
## 🎉Forkers
[![Forkers repo roster for @xuchengsheng/wx-dump-4j](https://reporoster.com/forks/xuchengsheng/wx-dump-4j)](https://github.com/xuchengsheng/wx-dump-4j/network/members)
## 🍱请我吃盒饭?
作者晚上还要写博客✍️,平时还需要工作💼,如果帮到了你可以请作者吃个盒饭🥡
<div>
<img alt="logo" src="image/WeChatPay.png" style="width: 240px;height: 260px">
<img alt="logo" src="image/Alipay.png" style="width: 240px;height: 260px">
</div>
## ⭐️扫码关注微信公众号
关注后,回复关键字📲 **加群**📲,即可加入我们的技术交流群,与更多开发者一起交流学习。
在此我们真诚地邀请您访问我们的GitHub项目页面如果您觉得***wx-dump-4j***对您有帮助,请顺手点个⭐️**Star**⭐️!每一颗星星都是我们前进的动力,是对我们努力的最大肯定。非常感谢您的支持!
<div>
<img alt="logo" src="image/wechat-mp.png" height="180px">>
</div>
## 👀 演示图
<table>
<tr>
<td><img src="image/screenshot/dashboard.png"/></td>
<td><img src="image/screenshot/session.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/contact.png"/></td>
<td><img src="image/screenshot/recover-contact.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/feeds.png"/></td>
<td><img src="image/screenshot/chat.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/chatroom.png"/></td>
<td><img src="image/screenshot/chatroom-detail.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/database.png"/></td>
<td><img src="image/screenshot/database-list.png"/></td>
</tr>
</table>
<p align="center">
<a href="https://wx.xxccss.com/"><img src="image/logo.png" width="45%"></a>
</p>
<p align="center">
<strong>🍬Java版微信聊天记录备份与管理工具</strong>
</p>
<p align="center">
👉 <a href="https://wx.xxccss.com/">https://wx.xxccss.com/</a> 👈
</p>
<p align="center">
<a href="https://hellogithub.com/repository/5055dcceee434dc5851ac9897cb27396" target="_blank"><img src="https://api.hellogithub.com/v1/widgets/recommend.svg?rid=5055dcceee434dc5851ac9897cb27396&claim_uid=AVv4KeNnZs2Ig3a" alt="FeaturedHelloGitHub" style="width: 250px; height: 54px;" width="250" height="54" /></a>
</p>
<p align="center">
<a href="https://github.com/xuchengsheng/spring-reading/stargazers"><img src="https://img.shields.io/github/stars/xuchengsheng/wx-dump-4j?logo=github&logoColor=%23EF2D5E&label=Stars&labelColor=%23000000&color=%23EF2D5E&cacheSeconds=3600" alt="Stars Badge"/></a>
<a href="https://github.com/xuchengsheng"><img src="https://img.shields.io/github/followers/xuchengsheng?label=Followers&logo=github&logoColor=%23FC521F&labelColor=%231A2477&color=%23FC521F&cacheSeconds=3600" alt="Follow Badge"></a>
<a href="https://github.com/xuchengsheng/wx-dump-4j/fork"><img src="https://img.shields.io/github/forks/xuchengsheng/wx-dump-4j?label=Forks&logo=github&logoColor=%23F2BB13&labelColor=%23BE2323&color=%23F2BB13" alt="Fork Badge"></a>
<a href="https://github.com/xuchengsheng/wx-dump-4j/watchers"><img src="https://img.shields.io/github/watchers/xuchengsheng/wx-dump-4j?label=Watchers&logo=github&logoColor=%23FF4655&labelColor=%234169E1&color=%23FF4655&cacheSeconds=3600" alt="Watchers Badge"></a>
</p>
<p align="center">
<img src="https://img.shields.io/badge/Java-11%2B-%23437291?logo=openjdk&logoColor=%23437291"/>
<img src="https://img.shields.io/badge/Spring-5.3.10-%23437291?logo=Spring&logoColor=%236DB33F&color=%236DB33F"/>
<img src="https://img.shields.io/badge/SpringBoot-2.5.5-%23437291?logo=SpringBoot&logoColor=%236DB33F&color=%236DB33F"/>
<img src="https://img.shields.io/badge/JNA-5.8.0-%23437291?logo=JNA&logoColor=%23228B22&color=%23228B22"/>
<img src="https://img.shields.io/badge/Hutool-5.8.16-%23437291?logo=JNA&logoColor=%23F08080&color=%23F08080"/>
<img src="https://img.shields.io/badge/easyexcel-5.8.16-%23437291?logo=JNA&logoColor=%23D2691E&color=%23D2691E"/>
<img src="https://img.shields.io/badge/protobuf-3.25.1-%23437291?logo=JNA&logoColor=%23800080&color=%23800080"/>
<img src="https://img.shields.io/badge/mapstruct-1.4.2-%23437291?logo=JNA&logoColor=%23DC143C&color=%23DC143C"/>
<img src="https://img.shields.io/badge/druid-1.2.20-%23437291?logo=JNA&logoColor=%23C71585&color=%23C71585"/>
<img src="https://img.shields.io/badge/mybatisPlus-3.5.4.1-%23437291?logo=JNA&logoColor=%234B0082&color=%234B0082"/>
<img src="https://img.shields.io/badge/sqlite-3.34.0-%23437291?logo=JNA&logoColor=%230000CD&color=%230000CD"/>
<img src="https://img.shields.io/badge/lombok-1.18.20-%23437291?logo=JNA&logoColor=%23008B8B&color=%23008B8B"/>
</p>
## 📚 简介
wx-dump-4j是一款基于Java开发的微信数据分析工具。它准确显示好友数、群聊数和当日消息总量提供过去15天每日消息统计了解社交活跃度。识别展示最近一个月内互动频繁的前10位联系人。支持导出聊天记录、联系人、群聊信息及查看**超过三天限制的朋友圈**历史记录和**找回微信好友**。
## 💡 主要功能
- 👤 **获取用户信息**获取当前登录微信的详细信息包括昵称、账号、手机号、邮箱、秘钥、微信Id。
- 💬 **支持多种消息类型**:管理微信聊天对话中的文本、引用、图片、表情、卡片链接、系统消息等。
- 📊 **综合管理**:提供微信会话、联系人、群聊与朋友圈的全面管理功能。
- 📥 **记录导出**:支持导出微信聊天记录、联系人、已删除好友和群聊信息,便于备份和管理。
- 📅 **查看历史朋友圈**:突破三日限制,查看更久以前的朋友圈历史记录,方便回顾和管理。
- 📈 **微信统计功能**:展示微信好友数、群聊数及今日收发消息总量,了解社交活跃度。
- 📊 **消息统计**统计过去15天内每日微信消息数量掌握长期消息交流情况。
- 🔝 **互动联系人**展示最近一个月互动最频繁的前10位联系人了解重要社交联系。
- 🧩 **消息类别占比**:展示微信消息类别占比图表,分析不同类型消息的占比情况。
- ☁️ **关键字词云**:展示微信最近使用的关键字词云图,分析聊天内容重点。
- 🔄 **找回已删除好友**:支持找回已删除的微信好友,恢复重要联系人。
- 🖥️ **微信多开支持**:支持微信多开功能,方便管理多个账号,提高效率。
## 🚀 快速启动
本指南将帮助您快速启动并运行项目,无论是安装包部署还是本地部署。
### 环境准备
在开始之前,请确保您的开发环境满足以下要求:
- 安装 [Java](https://repo.huaweicloud.com/java/jdk/11.0.2+9/jdk-11.0.2_windows-x64_bin.exe),版本为 JDK 11+。
- 安装 [Node.js](https://nodejs.org/en/),版本为 18+。
- 安装 [Maven](https://maven.apache.org/download.cgi),版本为 3.5.0+。
- 选择一款开发工具,比如 IntelliJ IDEA。
### 二进制部署
- 点击下载最新版 [wx-dump-4j-bin.tar.gz](https://github.com/xuchengsheng/wx-dump-4j/releases/download/v1.1.0/wx-dump-4j-bin.tar.gz)。
- 解压缩 `wx-dump-4j-bin.tar.gz` 文件,并进入 `bin` 目录。
- 双击 `start.bat` 启动文件。
- 启动成功后,在浏览器中访问 [http://localhost:8080](http://localhost:8080) 以查看应用。
### 本地部署
- 下载源码:
```bash
$ git clone https://github.com/xuchengsheng/wx-dump-4j.git
```
- 安装后端依赖:
```bash
$ cd wx-dump-4j mvn clean install
```
- 使用开发工具(如 IntelliJ IDEA启动 com.xcs.wx.WxDumpApplication。
- 安装前端依赖:
```bash
$ cd wx-dump-ui npm install
```
- 启动前端服务:
```bash
$ npm run start
```
- 前端服务启动成功后,在浏览器中访问 http://localhost:8000 以查看应用。
## ⚡ 技术栈
以下是本项目使用的技术栈:
| 技术 | 描述 | 版本 |
|--------------|---------------------------|-----------|
| Spring Boot | Web 和 Thymeleaf 框架 | 2.7.15 |
| SQLite | 轻量级数据库 | 3.34.0 |
| Lombok | 简化 Java 代码 | 1.18.20 |
| MyBatis Plus | ORM 框架扩展 | 3.5.4.1 |
| Dynamic Datasource | 动态数据源管理 | 4.2.0 |
| Druid | 数据库连接池 | 1.2.20 |
| MapStruct | Java Bean 映射工具 | 1.4.2.Final |
| Hutool | Java 工具库 | 5.8.16 |
| JNA | Java 本地访问 | 5.8.0 |
| Protobuf | 序列化框架 | 3.25.1 |
| gRPC | RPC 框架 | 1.11.0 |
| EasyExcel | Excel 操作工具 | 3.3.3 |
| Commons Compress | 压缩和解压缩工具 | 1.19 |
| Jackson Dataformat XML | XML 解析工具 | 2.13.5 |
| Commons Lang3 | 常用工具类库 | 3.12.0 |
## ⛔️️ 使用限制
本软件仅适用于Windows操作系统。我们目前不支持macOS、Linux或其他操作系统。如果你在尝试在非Windows系统上运行本软件时可能遇到兼容性问题这些问题可能导致软件无法正常运行或产生其他意外后果。
| 操作系统 | 支持情况 |
|:--------:|:----------:|
| Windows | 支持 |
| macOS | 不支持 |
| Linux | 不支持 |
## ⚠️免责声明
本软件仅供技术研究和教育目的使用,旨在解密用户个人微信聊天记录。严禁将本软件用于任何非法目的,包括但不限于侵犯隐私权或非授权数据访问。作为软件开发者,我不对因使用或滥用本软件产生的任何形式的损失或损害承担责任。
## ⛵欢迎贡献!
如果你发现任何错误🔍或者有改进建议🛠️,欢迎提交 issue 或者 pull request。你的反馈📢对于我非常宝贵💎
## 💻我的 GitHub 统计
[![Star History Chart](https://api.star-history.com/svg?repos=xuchengsheng/wx-dump-4j&type=Date)](https://star-history.com/#xuchengsheng/wx-dump-4j&Date)
## 🎉Stargazers
[![Stargazers123 repo roster for @xuchengsheng/wx-dump-4j](https://reporoster.com/stars/xuchengsheng/wx-dump-4j)](https://github.com/xuchengsheng/wx-dump-4j/stargazers)
## 🎉Forkers
[![Forkers repo roster for @xuchengsheng/wx-dump-4j](https://reporoster.com/forks/xuchengsheng/wx-dump-4j)](https://github.com/xuchengsheng/wx-dump-4j/network/members)
## 🍱请我吃盒饭?
作者晚上还要写博客✍️,平时还需要工作💼,如果帮到了你可以请作者吃个盒饭🥡
<div>
<img alt="logo" src="image/WeChatPay.png" style="width: 240px;height: 260px">
<img alt="logo" src="image/Alipay.png" style="width: 240px;height: 260px">
</div>
## ⭐️扫码关注微信公众号
关注后,回复关键字📲 **加群**📲,即可加入我们的技术交流群,与更多开发者一起交流学习。
在此我们真诚地邀请您访问我们的GitHub项目页面如果您觉得***wx-dump-4j***对您有帮助,请顺手点个⭐️**Star**⭐️!每一颗星星都是我们前进的动力,是对我们努力的最大肯定。非常感谢您的支持!
<div>
<img alt="logo" src="image/wechat-mp.png" height="180px">>
</div>
## 👀 演示图
<table>
<tr>
<td><img src="image/screenshot/dashboard.png"/></td>
<td><img src="image/screenshot/session.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/contact.png"/></td>
<td><img src="image/screenshot/recover-contact.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/feeds.png"/></td>
<td><img src="image/screenshot/chat.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/chatroom.png"/></td>
<td><img src="image/screenshot/chatroom-detail.png"/></td>
</tr>
<tr>
<td><img src="image/screenshot/database.png"/></td>
<td><img src="image/screenshot/database-list.png"/></td>
</tr>
</table>
=======
# wx-dump-4j
>>>>>>> c4b6449ae2686772c4ab318ba75389b6a4df21ea

@ -12,8 +12,9 @@ import org.springframework.stereotype.Component;
/**
*
*
* @author xcs
* Aspect
*
* @author xcs.
* @date 202462714:29:32
*/
@Slf4j
@ -21,26 +22,44 @@ import org.springframework.stereotype.Component;
@Component
public class RepositoryAspect {
/**
*
* com.xcs.wx.repository
* @param joinPoint
* @return void null
* @throws Throwable .
*/
@Around("execution(public * com.xcs.wx.repository..*.*(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
// 获取当前正在使用的数据源名称并保存起来,以便后续在方法执行完毕后恢复到该数据源。
// peek()方法用于查看当前线程下设置的数据源名称,但不移除(如果有的话)。
String previousDs = DynamicDataSourceContextHolder.peek();
try {
// 获取拦截方法所在的类
// 获取拦截方法所在的类,通过连接点对象可以拿到目标对象,进而获取其对应的类。
// 后续会基于这个类去查找是否有特定的数据源切换相关注解。
Class<?> targetClass = joinPoint.getTarget().getClass();
// 获取类上的@DS注解
// 获取类上的@DS注解这个注解通常用于标记该类对应的方法操作应该使用哪个具体的数据源。
// AnnotationUtil是hutool工具库提供的用于操作注解的工具类这里用于获取指定类型的注解实例。
DS dsAnnotation = AnnotationUtil.getAnnotation(targetClass, DS.class);
// 有指定的注解
if (dsAnnotation != null) {
// 有指定的注解,说明该类对应的方法需要切换到特定的数据源进行操作。
if (dsAnnotation!= null) {
// 根据注解中配置的数据源相关信息通常是一个标识数据源的字符串等通过DSNameUtil工具类获取实际要切换到的数据源名称
// 然后将该数据源名称设置到DynamicDataSourceContextHolder中实现数据源的切换。
// push()方法会将指定的数据源名称设置到当前线程下,使得后续的数据操作可以使用该数据源。
DynamicDataSourceContextHolder.push(DSNameUtil.getDSName(dsAnnotation.value()));
}
// 执行被拦截的方法,让业务逻辑正常进行,其返回结果会作为整个环绕通知方法最终的返回值(如果有返回值的话)。
return joinPoint.proceed();
} finally {
// 恢复之前的ds
if (previousDs != null) {
// 恢复之前的ds无论方法执行过程中是否发生异常都需要保证数据源能恢复到之前的状态。
// 如果之前保存的数据源名称不为空,说明之前存在使用的数据源,那么将其重新设置回去,使得后续操作可以继续使用该数据源。
if (previousDs!= null) {
DynamicDataSourceContextHolder.push(previousDs);
} else {
// 如果之前保存的数据源名称为空,说明可能之前没有设置过数据源或者是需要清除当前线程下设置的数据源相关信息,
// 调用clear()方法进行清除操作,将数据源相关状态重置。
DynamicDataSourceContextHolder.clear();
}
}
}
}
}

@ -12,7 +12,12 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author xcs
* @date 20231225 1729
* @date 20231225 1729111
*
* Spring @RestControllerAdvice
* @Controller @RestController
* 使 @ResponseStatus(HttpStatus.OK) HttpStatus.OK
* 使HTTP200
**/
@Slf4j
@RestControllerAdvice
@ -20,7 +25,11 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
public class ExceptionAdviceConfig {
/**
* BizException
* BizException
* BizException
* @param e BizException
* @return ResponseVO<String>
* ResponseVOerrorBizExceptione.getCode()e.getMsg()
**/
@ExceptionHandler(BizException.class)
public ResponseVO<String> handleException(BizException e) {
@ -28,20 +37,31 @@ public class ExceptionAdviceConfig {
}
/**
* MyBatisSystemException
* MyBatisSystemException
* MyBatisSystemException
* @param e MyBatisSystemException
* @return ResponseVO<String>
**/
@ExceptionHandler(MyBatisSystemException.class)
public ResponseVO<String> myBatisSystemException(MyBatisSystemException e) {
// 数据库未就绪状态
// 判断异常原因链中最底层的异常是否是CannotFindDataSourceException类型
// 如果是,则说明是因为找不到数据源导致的数据库未就绪问题。
if (e.getCause().getCause() instanceof CannotFindDataSourceException) {
return ResponseVO.error(-1, "微信数据库未就绪状态,请先点击左侧解密工具进行数据解密!");
}
// 如果不是上述特定的数据源找不到的情况就记录下该MyBatisSystemException异常的详细信息到日志中通过log对象由lombok的@Slf4j注解生成
log.error("mybatis system exception", e);
// 然后统一返回一个表示系统异常的通用错误信息响应给客户端。
return ResponseVO.error(-1, "系统异常");
}
/**
* RuntimeException
* RuntimeException
* RuntimeExceptionJava
* @param e RuntimeException
* @return ResponseVO<String>RuntimeException
*
**/
@ExceptionHandler(RuntimeException.class)
public ResponseVO<String> handleException(RuntimeException e) {
@ -50,11 +70,16 @@ public class ExceptionAdviceConfig {
}
/**
* Exception
* Exception
* ExceptionError
* 使
* @param e Exception
* @return ResponseVO<String>Exception
*
**/
@ExceptionHandler(Exception.class)
public ResponseVO<String> handleException(Exception e) {
log.error("exception", e);
return ResponseVO.error(-1, "系统异常");
}
}
}

@ -8,22 +8,32 @@ import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MybatisPlus
* MybatisPlusMybatisPlus
*
* xcs202312291610
*
* @author xcs
* @date 20231229 1610
**/
@Configuration
@MapperScan({"com.xcs.wx.mapper"})
@Configuration // 表明这个类是一个配置类Spring会自动扫描并加载这个类中的配置信息
@MapperScan({"com.xcs.wx.mapper"}) // 配置Mybatis的Mapper接口扫描路径告诉Spring去哪里扫描Mybatis的Mapper接口
// 这样Spring就能自动创建对应的Mapper代理对象并注入到其他需要使用的地方此处指定扫描 "com.xcs.wx.mapper" 包下的所有Mapper接口
public class MybatisPlusConfig {
/**
*
* Spring @Bean Bean使Spring
* MybatisPlus
*
* @return MybatisPlusInterceptorMybatisPlus
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
// 创建一个MybatisPlusInterceptor对象它是MybatisPlus用于添加各种拦截器的总拦截器多个拦截器可以通过它来统一管理和添加
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 向MybatisPlusInterceptor中添加一个分页拦截器PaginationInnerInterceptor用于处理分页相关的逻辑。
// 这里指定了数据库类型为SQLITE意味着这个分页插件会针对SQLITE数据库的特点来进行分页操作
// 如果后续切换数据库,此处的数据库类型参数也需要相应修改以适配新的数据库分页语法等情况。
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQLITE));
return interceptor;
}
}
}

@ -6,15 +6,29 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Spring Web MVC
* WebMvcConfigurerxcs202401261146
*
* @author xcs
* @date 20240126 1146
* @date 202401261146
**/
@Configuration
@EnableWebMvc
@Configuration // 表明这是一个Spring配置类Spring容器会扫描并加载该类识别其中定义的Bean以及配置信息。
@EnableWebMvc // 启用Spring Web MVC的功能它会导入一系列默认的配置使得开发者可以更加灵活地定制Web相关的配置内容
// 例如视图解析、消息转换器等不过使用这个注解时需要注意可能会覆盖掉Spring Boot的一些自动配置内容通常用于需要完全自定义Web配置的场景。
public class UseStaticResourceConfig implements WebMvcConfigurer {
/**
* WebMvcConfigureraddResourceHandlers
* Spring MVC使Web访HTMLCSSJavaScript
*
* @param registry ResourceHandlerRegistry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 向ResourceHandlerRegistry中添加一个资源处理器的配置规则。
// addResourceHandler("/**")表示对所有路径即任意请求路径下的请求进行处理匹配所有的URL路径模式。
// addResourceLocations("file:../html/")指定了静态资源的实际位置这里是相对路径表示在项目的上级目录中的html文件夹下查找对应的静态资源文件
// 例如当浏览器请求某个静态页面时Spring MVC会根据这个配置去指定的位置查找并返回相应的文件内容从而实现静态资源的正确加载和展示。
registry.addResourceHandler("/**").addResourceLocations("file:../html/");
}
}
}

@ -7,25 +7,43 @@ import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
*
*
* Spring便
* xcs202312251005
*
* @author xcs
* @date 20231225 1005
* @date 202312251005
**/
@Data
// 使用Lombok的 @Data 注解会自动为类生成Getter、Setter、toString、equals和hashCode等方法简化代码编写减少样板代码量。
@Configuration(proxyBeanMethods = false)
// 表明这个类是一个Spring配置类但将proxyBeanMethods设置为false意味着在创建该类的Bean实例时
// 不会为其创建基于CGLIB的代理对象除非有其他明确需要代理的情况这样可以提高性能避免不必要的代理开销
// 适用于配置类中的方法只是简单返回配置相关对象,不存在方法调用间依赖关系的场景。
@ConfigurationProperties(prefix = "wechat-offset")
// 该注解用于将配置文件如application.properties或application.yml等中以 "wechat-offset" 为前缀的属性值绑定到这个类对应的属性上,
// 方便进行配置的集中管理和注入使用。
public class WeChatOffsetProperties {
/**
*
* Map
* VersionConfig
*
*/
private Map<String, VersionConfig> version;
/**
* VersionConfig
* Lombok @Data
*/
@Data
public static class VersionConfig {
// 对应微信昵称参数在特定版本下的偏移量以Long类型存储具体偏移量数值应该从配置文件中读取并绑定过来
// 偏移量的含义可能与微信数据存储结构、解析相关,用于在处理微信数据时进行相应的位置调整等操作(取决于具体业务场景)。
private Long nickname;
// 对应微信账号参数在特定版本下的偏移量,功能类似上述昵称偏移量,用于账号相关数据处理时的位置或数值调整等情况。
private Long account;
// 对应微信手机号参数在特定版本下的偏移量,用于手机号相关数据在特定版本下的适配处理。
private Long mobile;
}
}
}

@ -1,16 +1,24 @@
package com.xcs.wx.constant;
/**
*
* ChatRoomConstant
*
* 使
* xcs202401251634
*
* @author xcs
* @date 20240125 1634
* @date 202401251634
**/
public class ChatRoomConstant {
// 将构造函数设置为私有,这样外部就无法通过 new 关键字来实例化这个类,
// 因为这个类的作用只是用来定义常量,不需要创建它的实例对象,符合常量类的设计规范。
private ChatRoomConstant() {
}
// 定义一个公共的静态常量字符串,名为 CHATROOM_SUFFIX其值为 "@chatroom"。
// 从命名来看,这个常量可能用于标识群聊相关的一些特征,比如在处理聊天对象名称、消息发送目标等场景中,
// 通过判断是否包含这个后缀来确定是不是群聊相关的操作或者对象,方便在整个项目的群聊相关业务逻辑中统一使用。
public static final String CHATROOM_SUFFIX = "@chatroom";
}
}

@ -3,7 +3,6 @@ package com.xcs.wx.constant;
import cn.hutool.extra.spring.SpringUtil;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.xcs.wx.service.UserService;
import javax.sql.DataSource;
import java.util.Collections;
import java.util.Comparator;
@ -12,80 +11,132 @@ import java.util.Map;
import java.util.stream.Collectors;
/**
*
*
* 便使
* xcs202312251641
*
* @author xcs
* @date 20231225 1641
* @date 202312251641
**/
public class DataSourceType {
// 定义一个表示小程序数据库的常量字符串,其值为 "Applet.db"
// 在涉及到小程序相关数据存储和查询等操作时,可通过该常量来指定对应的数据源。
public static final String APPLET_DB = "Applet.db";
// 表示业务聊天数据库的常量字符串,用于业务聊天相关的数据持久化操作对应的数据源标识。
public static final String BIZ_CHAT_DB = "BizChat.db";
// 业务聊天消息数据库的常量字符串,用于存储业务聊天消息相关数据的数据源名称。
public static final String BIZ_CHAT_MSG_DB = "BizChatMsg.db";
// 普通聊天消息数据库的常量字符串,用于存放常规聊天消息数据的数据源指代。
public static final String CHAT_MSG_DB = "ChatMsg.db";
// 群聊用户数据库的常量字符串,可能用于与群聊中用户相关信息存储的数据源标识。
public static final String CHAT_ROOM_USER_DB = "ChatRoomUser.db";
// 客户端配置数据库的常量字符串,用于存储客户端相关配置数据的数据源名称。
public static final String CLIENT_CONFIG_DB = "ClientConfig.db";
// 客户端通用数据库的常量字符串,大概用于存放客户端通用性质的数据的数据源指代。
public static final String CLIENT_GENERAL_DB = "ClientGeneral.db";
// 客户服务数据库的常量字符串,用于与客户服务相关数据存储的数据源标识。
public static final String CUSTOMER_SERVICE_DB = "CustomerService.db";
// 表情数据库的常量字符串,用于存储表情相关数据的数据源名称。
public static final String EMOTION_DB = "Emotion.db";
// 收藏数据库的常量字符串,用于存放用户收藏相关数据的数据源指代。
public static final String FAVORITE_DB = "Favorite.db";
// 全文搜索联系人数据库的常量字符串,可能用于支持联系人信息全文搜索功能的数据存储的数据源标识。
public static final String FTS_CONTACT_DB = "FTSContact.db";
// 全文搜索收藏数据库的常量字符串,用于与收藏内容全文搜索相关数据存储的数据源名称。
public static final String FTS_FAVORITE_DB = "FTSFavorite.db";
// 全文搜索消息数据库的常量字符串,用于存储支持消息全文搜索相关数据的数据源指代。
public static final String FTS_MSG_DB = "FTSMsg.db";
// 功能消息数据库的常量字符串,用于存放具有特定功能消息(如系统通知等)相关数据的数据源标识。
public static final String FUNCTION_MSG_DB = "FunctionMsg.db";
// 硬链接文件数据库的常量字符串,可能用于存储文件硬链接相关数据的数据源名称。
public static final String HARD_LINK_FILE_DB = "HardLinkFile.db";
// 硬链接图片数据库的常量字符串,用于存放图片硬链接相关数据的数据源指代。
public static final String HARD_LINK_IMAGE_DB = "HardLinkImage.db";
// 硬链接视频数据库的常量字符串,用于存储视频硬链接相关数据的数据源名称。
public static final String HARD_LINK_VIDEO_DB = "HardLinkVideo.db";
// 图片翻译数据库的常量字符串,用于与图片翻译相关业务数据存储的数据源标识。
public static final String IMAGE_TRANSLATE_DB = "ImageTranslate.db";
// 链接历史数据库的常量字符串,用于存放链接访问历史相关数据的数据源指代。
public static final String LINK_HISTORY_DB = "LinkHistory.db";
// 媒体数据库的常量字符串,用于存储各种媒体(如图片、视频、音频等)相关数据的数据源名称。
public static final String MEDIA_DB = "Media.db";
// 微信消息数据库的常量字符串,用于存放微信相关消息数据的数据源指代,具体可能是核心的消息存储库。
public static final String MICRO_MSG_DB = "MicroMsg.db";
// 杂项数据库的常量字符串,用于存储一些杂项、不便于归类的数据的数据源名称。
public static final String MISC_DB = "Misc.db";
// 多搜索聊天消息数据库的常量字符串,可能用于支持多种搜索方式的聊天消息相关数据存储的数据源标识。
public static final String MULTI_SEARCH_CHAT_MSG_DB = "MultiSearchChatMsg.db";
// 新提示数据库的常量字符串,用于存放新提示(如新消息提醒等)相关数据的数据源指代。
public static final String NEW_TIPS_DB = "NewTips.db";
// 开放即时通讯联系人数据库的常量字符串,用于与开放即时通讯平台联系人相关数据存储的数据源标识。
public static final String OPEN_IM_CONTACT_DB = "OpenIMContact.db";
// 开放即时通讯媒体数据库的常量字符串,用于存放开放即时通讯中媒体相关数据的数据源指代。
public static final String OPEN_IM_MEDIA_DB = "OpenIMMedia.db";
// 开放即时通讯消息数据库的常量字符串,用于存储开放即时通讯消息相关数据的数据源名称。
public static final String OPEN_IM_MSG_DB = "OpenIMMsg.db";
// 开放即时通讯资源数据库的常量字符串,用于存放开放即时通讯相关资源(如文件、素材等)数据的数据源指代。
public static final String OPEN_IM_RESOURCE_DB = "OpenIMResource.db";
// 预下载数据库的常量字符串,可能用于存储预下载相关(如提前下载某些资源等)数据的数据源名称。
public static final String PRE_DOWNLOAD_DB = "PreDownload.db";
// 公共消息数据库的常量字符串,用于存放公共消息(如公众号推送等)相关数据的数据源指代。
public static final String PUBLIC_MSG_DB = "PublicMsg.db";
// 公共消息媒体数据库的常量字符串,用于存储公共消息中涉及的媒体(如图片、视频等)相关数据的数据源名称。
public static final String PUBLIC_MSG_MEDIA_DB = "PublicMsgMedia.db";
public static final String SNS_DB = "Sns.db";
// 社交网络数据库的常量字符串,用于存放社交网络(如朋友圈等)相关数据的数据源指代。
public static final String SNS_DB = "SNS.db";
// 商店表情数据库的常量字符串,可能用于存储商店中购买或下载的表情相关数据的数据源名称。
public static final String STORE_EMOTION_DB = "StoreEmotion.db";
// 网络电话数据库的常量字符串,用于存放网络电话(如语音通话、视频通话等)相关数据的数据源指代。
public static final String VOIP_DB = "Voip.db";
// 消息数据库的常量字符串,含义较宽泛,可能作为通用的消息存储相关数据源标识,具体需结合业务场景确定。
public static final String MSG_DB = "MSG.db";
// 消息数据库(可能是另一种消息分类或版本等情况)的常量字符串,具体作用依赖项目中的业务逻辑定义。
public static final String MSG0_DB = "MSG0.db";
/**
* MSG*.db
* MSG*.db
*
* null
*
* @return
* @return MSG*.db
*/
public static List<String> getMsgDb() {
// 通过SpringUtil工具类从Spring容器中获取UserService的实例
// 并调用其currentUser方法获取当前用户信息这里假设currentUser方法返回的是用户的唯一标识比如用户ID等
String wxId = SpringUtil.getBean(UserService.class).currentUser();
// 空校验
// 进行空校验如果获取到的用户标识为null说明无法确定当前用户
// 此时直接返回一个空的列表,避免后续操作出现空指针异常等问题。
if (wxId == null) {
return Collections.emptyList();
}
// 如果用户标识不为空则调用私有方法getDb传入根据用户标识构建的匹配模式字符串获取符合要求的数据库名称列表。
return getDb(wxId + "#" + "MSG.*\\.db");
}
/**
* pattern
*
* Spring
*
*
* @param pattern
* @return
* @param pattern
* @return
*/
private static List<String> getDb(String pattern) {
// 获取动态数据源
// 通过SpringUtil工具类从Spring容器中获取DynamicRoutingDataSource的实例
// 该数据源类型支持动态切换数据源,用于获取项目中配置的所有数据源相关信息。
DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
// 获取所有数据源
// 调用DynamicRoutingDataSource的getDataSources方法获取所有已配置的数据源
// 返回一个Map其中键为数据源名称值为对应的javax.sql.DataSource对象。
Map<String, DataSource> dataSources = dynamicRoutingDataSource.getDataSources();
// 筛选出符合模式的数据源键,并进行降序排序
// 使用Java 8的Stream API对数据源名称集合keySet进行操作
// 首先通过filter方法筛选出名称符合给定模式使用matches方法进行正则匹配的数据源名称
// 然后使用sorted方法按照自然顺序Comparator.naturalOrder())进行降序排序,
// 最后通过collect方法将筛选并排序后的数据源名称收集到一个List中并返回。
return dataSources.keySet().stream()
.filter(key -> key.matches(pattern))
.sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
}
}
}

@ -1,7 +1,10 @@
package com.xcs.wx.constant;
/**
* sqlite
* SqliteConstantSQLite
* SQLite
* 使
* xcs2024120211251
*
* @author xcs
* @date 202412021:12:51
@ -9,12 +12,17 @@ package com.xcs.wx.constant;
public class SqliteConstant {
/**
* url
* SQLiteURL
* SQLite
* SQLite
*/
public static final String URL_PREFIX = "jdbc:sqlite:";
/**
* sqlite
* SQLite
* 使JavaJDBCJava Database ConnectivitySQLite
*
* 便SQLite
*/
public static final String DRIVER_CLASS_NAME = "org.sqlite.JDBC";
}
}

@ -15,50 +15,81 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* ChatRoomControllerSpring MVCHTTP
*
* xcs202401081603
*
* @author xcs
* @date 20240108 1603
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它会处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的视图模板那样返回HTML页面。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解,会为类中所有带有 @NonNull 注解的final字段或者没有初始化的final字段生成构造函数
// 在这里它会为下面的 chatRoomService 字段生成对应的构造函数注入,简化了依赖注入的代码编写。
@RequestMapping("/api/chatroom")
// 用于定义该控制器处理的请求的基础路径,所有该控制器中定义的请求映射方法的路径都将基于这个基础路径进行拼接,
// 例如下面的 "/list"、"/detail"、"/export" 等路径实际对应的完整请求路径就是 "/api/chatroom/list"、"/api/chatroom/detail"、"/api/chatroom/export" 等。
public class ChatRoomController {
private final ChatRoomService chatRoomService;
// 通过依赖注入的方式引入ChatRoomService服务层的实例用于调用服务层提供的与群聊相关的业务方法
// 比如查询群聊列表、获取群聊详情、导出群聊等操作具体的业务逻辑实现在ChatRoomService中完成。
/**
*
* HTTP GETChatRoomDTO
* ResponseVO
*
* @param chatRoomDTO
* @return ChatRoomVO
* @param chatRoomDTO
*
* @return ResponseVO<List<ChatRoomVO>>ResponseVOChatRoomVO
* ResponseVO便
* ChatRoomVO
*/
@GetMapping("/list")
public ResponseVO<List<ChatRoomVO>> list(ChatRoomDTO chatRoomDTO) {
// 查询群聊列表
// 调用ChatRoomService的queryChatRoom方法传入查询参数chatRoomDTO
// 该方法会根据传入的查询条件去数据库或者其他数据源中查询符合要求的群聊列表信息,
// 返回的结果包装在PageVO中PageVO通常用于分页相关的场景包含了当前页的数据列表、当前页码、总记录数等信息。
PageVO<ChatRoomVO> pageVO = chatRoomService.queryChatRoom(chatRoomDTO);
// 返回数据
// 使用ResponseVO的静态方法ok创建一个成功响应的ResponseVO对象
// 将从PageVO中获取的群聊记录列表pageVO.getRecords()、当前页码pageVO.getCurrent()以及总记录数pageVO.getTotal())作为参数传入,
// 这样就将查询到的群聊列表信息以及分页相关信息一起封装在ResponseVO中返回给客户端了。
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
/**
*
* HTTP GET
* ResponseVO
*
* @param chatRoomName
* @return ChatRoomDetailVO
* @param chatRoomName
* ChatRoomDetailVO
* @return ResponseVO<ChatRoomDetailVO>ResponseVOChatRoomDetailVO
* ChatRoomDetailVOResponseVO
* 便
*/
@GetMapping("/detail")
public ResponseVO<ChatRoomDetailVO> detail(@RequestParam String chatRoomName) {
// 调用ChatRoomService的queryChatRoomDetail方法传入群聊名称chatRoomName
// 该方法会根据传入的群聊名称去查找对应的群聊详细信息返回一个ChatRoomDetailVO对象
// 然后使用ResponseVO的静态方法ok创建一个成功响应的ResponseVO对象将查询到的群聊详情对象作为参数传入
// 最终将包含群聊详情信息的ResponseVO返回给客户端。
return ResponseVO.ok(chatRoomService.queryChatRoomDetail(chatRoomName));
}
/**
*
* HTTP GET
* ResponseVO
*
* @return ResponseVO
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(chatRoomService.exportChatRoom());
}
}
}

@ -11,36 +11,59 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* ContactControllerSpring MVCHTTP
* ContactService
* xcs202312221416
*
* @author xcs
* @date 20231222 1416
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图模板如HTML页面
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的contactService字段生成对应的构造函数注入使得Spring容器可以通过构造函数注入的方式将ContactService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/contact")
// 用于定义该控制器所处理请求的基础路径,后续在这个控制器中定义的各个请求映射方法的路径都会基于这个基础路径进行拼接,
// 例如下面的 "/list"、"/all"、"/label"、"/export" 这些路径对应的完整请求路径就是 "/api/contact/list"、"/api/contact/all"、"/api/contact/label"、"/api/contact/export" 等。
public class ContactController {
private final ContactService contactService;
// 通过依赖注入的方式引入ContactService的实例ContactService是服务层的接口或者类它封装了与联系人相关的各种业务逻辑方法
// 例如查询联系人、获取所有联系人、查询联系人标签以及导出联系人等操作具体的业务实现细节在ContactService及其实现类中完成。
/**
*
* HTTP GETContactDTO
* ContactServiceResponseVO
*
* @param contactDTO
* @return ResponseVO
* @param contactDTO DTO
*
* @return ResponseVO<List<ContactVO>>ResponseVOContactVO
* ResponseVO便
* ContactVO
*/
@GetMapping("/list")
public ResponseVO<List<ContactVO>> list(ContactDTO contactDTO) {
// 查询联系人
// 调用ContactService的queryContact方法传入ContactDTO对象作为查询条件
// 该方法会依据传入的条件去数据库或者其他数据源中查找符合要求的联系人信息返回的结果包装在PageVO中
// PageVO通常用于分页相关的场景它包含了当前页的数据记录列表这里就是联系人信息列表、当前页码以及总记录数等信息。
PageVO<ContactVO> pageVO = contactService.queryContact(contactDTO);
// 返回数据
// 使用ResponseVO的静态方法ok创建一个表示成功响应的ResponseVO对象
// 并将从PageVO中获取的联系人记录列表pageVO.getRecords()、当前页码pageVO.getCurrent()以及总记录数pageVO.getTotal())作为参数传入,
// 这样就把查询到的联系人列表信息以及分页相关信息一起封装进ResponseVO中返回给客户端了。
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
/**
*
* HTTP GET
* ContactServicequeryAllContactResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<AllContactVO>>ResponseVOAllContactVO
* AllContactVOContactVO
* ResponseVO
*/
@GetMapping("/all")
public ResponseVO<List<AllContactVO>> all() {
@ -48,9 +71,12 @@ public class ContactController {
}
/**
*
* HTTP GET
* ContactServicequeryContactLabelResponseVO
*
* @return ContactLabelVO
* @return ResponseVO<List<ContactLabelVO>>ResponseVOContactLabelVO
* ContactLabelVO
* ResponseVO便
*/
@GetMapping("/label")
public ResponseVO<List<ContactLabelVO>> label() {
@ -58,12 +84,15 @@ public class ContactController {
}
/**
*
* HTTP GET
* ContactServiceexportContactResponseVO
*
* @return ResponseVO
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(contactService.exportContact());
}
}
}

@ -12,39 +12,71 @@ import java.io.IOException;
import java.io.OutputStream;
/**
* Controller
* ContactHeadImgControllerSpring MVCHTTP
* ContactHeadImgService
* xcs2024618154517
*
* @author xcs
* @date 202461815:45:17
**/
@Slf4j
// 使用Lombok的 @Slf4j 注解会自动为该类生成一个名为log的SLF4J日志记录器对象方便在代码中记录日志信息
// 例如记录操作的执行情况、出现的错误等,便于后续的调试和问题排查。
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用来处理HTTP请求并以JSON、XML等格式或者直接返回数据如这里的图片字节流来响应请求
// 而不是像传统的MVC模式那样返回视图页面如HTML页面
@RequiredArgsConstructor
// 借助Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的contactHeadImgService字段生成对应的构造函数注入使得Spring容器可以通过构造函数注入的方式将ContactHeadImgService的实例注入进来简化了依赖注入相关的代码编写。
@RequestMapping("/api/contact/headImg")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/avatar" 路径对应的完整请求路径就是 "/api/contact/headImg/avatar",用于明确该控制器下不同接口的访问路径。
public class ContactHeadImgController {
private final ContactHeadImgService contactHeadImgService;
// 通过依赖注入的方式引入ContactHeadImgService的实例ContactHeadImgService是服务层的接口或类它封装了获取联系人头像相关的业务逻辑方法
// 例如根据用户名等条件查找并返回对应的联系人头像数据具体的业务实现细节在ContactHeadImgService及其实现类中完成。
/**
*
* avatarHTTP GETHttpServletResponse
* HttpServletResponse
*
*
* @param userName
* @param response HttpServletResponse
* @param userName
*
* @param response HttpServletResponse
* HTTP
*/
@GetMapping("/avatar")
public void avatar(String userName, HttpServletResponse response) {
// 调用ContactHeadImgService的avatar方法传入用户名userName尝试获取该用户对应的头像字节数据
// 如果获取成功返回的avatarBytes就是头像的字节数组形式的数据否则返回null表示未找到对应的头像数据。
byte[] avatarBytes = contactHeadImgService.avatar(userName);
if (avatarBytes != null) {
if (avatarBytes!= null) {
// 设置响应的内容类型为 "image/gif"表示返回给客户端的数据是GIF格式的图片
// 这里假设头像数据是GIF格式如果实际情况中头像格式有多种可能可能需要根据头像实际格式进行更灵活的设置。
response.setContentType("image/gif");
// 设置响应内容的长度,即头像字节数组的长度,让客户端能够准确知道接收的数据大小,便于正确处理数据。
response.setContentLength(avatarBytes.length);
try (OutputStream os = response.getOutputStream()) {
// 通过从HttpServletResponse获取的输出流对象将头像字节数据写入到输出流中
// 这样数据就会通过HTTP响应发送给客户端客户端接收到数据后可以根据设置的内容类型进行相应的展示如在页面上显示图片
os.write(avatarBytes);
// 刷新输出流,确保数据被及时、完整地发送出去,避免数据滞留在缓冲区中未发送的情况。
os.flush();
} catch (IOException e) {
// 如果在向输出流写入数据或者刷新输出流等操作过程中出现IO异常
// 使用自动生成的日志记录器log记录错误信息方便后续排查问题
// "avatar fail" 是自定义的错误提示信息用于简单描述出现问题的操作e是捕获到的具体IOException异常对象会记录详细的异常堆栈信息。
log.error("avatar fail", e);
}
} else {
// 如果未获取到头像字节数据avatarBytes为null则设置HTTP响应的状态码为404HttpServletResponse.SC_NOT_FOUND
// 表示客户端请求的资源(这里就是指定用户的头像)未找到,告知客户端请求的头像不存在,让客户端做出相应的处理(如显示默认头像等)。
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
}
}
}

@ -10,22 +10,39 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* DashboardControllerSpring MVCHTTP
* DashboardServiceResponseVO
* xcs202401151126
*
* @author xcs
* @date 20240115 1126
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的dashBoardService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将DashboardService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/dashboard")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/statsPanel"、"/msgTypeDistribution" 等路径对应的完整请求路径就是 "/api/dashboard/statsPanel"、"/api/dashboard/msgTypeDistribution" 等,
// 以此来清晰地划分和组织不同功能接口的访问路径。
public class DashboardController {
private final DashboardService dashBoardService;
// 通过依赖注入的方式引入DashboardService的实例DashboardService是服务层的接口或类它封装了与仪表盘相关的各种业务逻辑方法
// 例如获取统计面板数据、消息类型分布统计数据、不同时间段消息数量统计数据以及联系人互动频率统计数据等具体的业务实现细节在DashboardService及其实现类中完成。
/**
*
* statsPanelHTTP GET
* DashboardServicestatsPanelResponseVO
*
* @return ResponseVO
* @return ResponseVO<StatsPanelVO>ResponseVOStatsPanelVO
* ResponseVO便
* StatsPanelVO
* ResponseVO
*/
@GetMapping("/statsPanel")
public ResponseVO<StatsPanelVO> statsPanel() {
@ -33,9 +50,13 @@ public class DashboardController {
}
/**
*
* msgTypeDistributionHTTP GET
* DashboardServicemsgTypeDistributionResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<MsgTypeDistributionVO>>ResponseVOMsgTypeDistributionVO
* MsgTypeDistributionVO
* ResponseVO
* 便
*/
@GetMapping("/msgTypeDistribution")
public ResponseVO<List<MsgTypeDistributionVO>> msgTypeDistribution() {
@ -43,9 +64,13 @@ public class DashboardController {
}
/**
* 15
* countRecentMsgs15HTTP GET
* DashboardServicecountRecentMsgsResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<CountRecentMsgsVO>>ResponseVOCountRecentMsgsVO
* CountRecentMsgsVO
* 15ResponseVO
* 便
*/
@GetMapping("/countRecentMsgs")
public ResponseVO<List<CountRecentMsgsVO>> countRecentMsgs() {
@ -53,9 +78,13 @@ public class DashboardController {
}
/**
* 10
* topContacts10HTTP GET
* DashboardServicetopContactsResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<TopContactsVO>>ResponseVOTopContactsVO
* TopContactsVO
* 10ResponseVO
* 便
*/
@GetMapping("/topContacts")
public ResponseVO<List<TopContactsVO>> topContacts() {
@ -63,12 +92,16 @@ public class DashboardController {
}
/**
* 使
* queryRecentUsedKeyWord使HTTP GET
* DashboardServicequeryRecentUsedKeyWordResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<RecentUsedKeyWordVO>>ResponseVORecentUsedKeyWordVO
* RecentUsedKeyWordVO使使
* 使ResponseVO
*
*/
@GetMapping("/queryRecentUsedKeyWord")
public ResponseVO<List<RecentUsedKeyWordVO>> queryRecentUsedKeyWord() {
return ResponseVO.ok(dashBoardService.queryRecentUsedKeyWord());
}
}
}

@ -16,52 +16,89 @@ import java.io.IOException;
import java.util.List;
/**
* Controller
* DatabaseControllerSpring MVCHTTP
* DatabaseService
* SseEmitterResponseVOxcs202401201435
*
* @author xcs
* @date 20240120 1435
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的databaseService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将DatabaseService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/database")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/decrypt"、"/getDatabase" 路径对应的完整请求路径就是 "/api/database/decrypt"、"/api/database/getDatabase" 等,
// 以此来清晰地划分和组织不同功能接口的访问路径。
public class DatabaseController {
private final DatabaseService databaseService;
// 通过依赖注入的方式引入DatabaseService的实例DatabaseService是服务层的接口或类它封装了与数据库操作相关的各种业务逻辑方法
// 比如数据库解密的具体逻辑、获取数据库相关信息等操作具体的业务实现细节在DatabaseService及其实现类中完成。
/**
*
* decryptHTTP GETServer-Sent EventsSSE
* SseEmitterJDK
* SseEmitter
*
* @return ResponseVO
* @param decryptDTO DTO
*
* @return SseEmitterSseEmitter
*
*/
@GetMapping("/decrypt")
public SseEmitter decrypt(DecryptDTO decryptDTO) {
// 创建一个SseEmitter对象传入超时时间为0L表示无超时限制也可根据实际需求设置合适的超时时间
// 该对象用于向客户端发送服务器推送事件,可用于实时推送数据库解密过程中的状态信息等内容给客户端。
SseEmitter emitter = new SseEmitter(0L);
// 启动一个子线程,异步回调给前端
// 启动一个新的线程来执行异步操作,这样可以避免在主线程中执行耗时的数据库解密操作而阻塞其他请求的处理,
// 使得整个服务能够更高效地处理多个并发请求,提高系统的响应性能。
new Thread(() -> {
// 读取JDK版本号
// 通过hutool工具库的SystemUtil获取当前JDK的版本信息并获取其版本号对应的整数值
// 用于判断当前JDK版本是否满足数据库解密操作的要求这里要求JDK版本至少为11
if (SystemUtil.getJavaInfo().getVersionInt() < 1100) {
try {
// 如果JDK版本小于1100对应JDK 11则通过SseEmitter向客户端发送一个错误提示信息
// 消息格式设置为JSON通过MediaType.APPLICATION_JSON指定告知客户端微信解密必须要求JDK 11以上版本请更换JDK版本。
emitter.send(ResponseVO.error(-1, "微信解密必须要求JDK11以上版本,请更换JDK版本。"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
// 如果在向客户端发送消息过程中出现IO异常将该异常包装成一个运行时异常抛出
// 这样在当前线程中就会终止执行,并可以在合适的地方(比如线程的异常处理机制或者日志记录中)进行相应的处理和记录。
throw new RuntimeException(e);
} finally {
// 无论是否成功发送消息都要调用SseEmitter的complete方法来关闭这个推送连接
// 表示此次推送流程结束,释放相关资源,避免资源泄漏等问题。
emitter.complete();
}
return;
}
// 如果JDK版本满足要求则调用DatabaseService的decrypt方法传入SseEmitter对象和decryptDTO参数
// 开始执行数据库解密操作在解密过程中可以通过SseEmitter向客户端推送相关的进度信息、最终结果等内容
// 具体的解密逻辑以及推送消息的实现细节在DatabaseService的decrypt方法中完成。
databaseService.decrypt(emitter, decryptDTO);
}).start();
// 返回数据
// 将创建并配置好的SseEmitter对象返回给客户端,客户端可以通过该对象来接收服务器推送的数据库解密相关消息。
return emitter;
}
/**
*
* getDatabaseHTTP GETwxId
* DatabaseServicegetDatabaseResponseVO
*
* @return ResponseVO
* @param wxId
* DatabaseVO
* @return ResponseVO<List<DatabaseVO>>ResponseVODatabaseVO
* ResponseVO便
* DatabaseVO
* ResponseVO便
*/
@GetMapping("/getDatabase")
public ResponseVO<List<DatabaseVO>> decrypt(String wxId) {
return ResponseVO.ok(databaseService.getDatabase(wxId));
}
}
}

@ -18,35 +18,77 @@ import java.nio.file.Path;
import java.nio.file.Paths;
/**
* Controller
* ExportControllerSpring MVCHTTP
* xcs202401051556
*
* @author xcs
* @date 20240105 1556
**/
@Controller
// 该注解用于标识这个类是一个Spring MVC的控制器它可以处理HTTP请求并返回视图或者数据响应
// 与@RestController不同的是它默认会按照视图解析机制去查找并返回对应的视图模板如HTML页面等
// 不过在这里主要是用于处理文件下载这种不需要返回视图的情况也能正常工作主要是借助了ResponseEntity来返回文件资源相关的响应。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 如果类中有这样的字段Spring可以通过构造函数注入的方式将相应的依赖注入进来简化了依赖注入的代码编写
// 不过在这段代码中暂时没有看到这样的依赖注入字段展示出来。
@RequestMapping("/api/export")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/download" 路径对应的完整请求路径就是 "/api/export/download",以此来清晰地划分和组织不同功能接口的访问路径。
public class ExportController {
/**
*
* downloadHTTP GET
*
* ResponseEntity使
* 404
*
* @param path
* Windows "C:/files/myfile.xlsx"
* Linux "/home/user/files/myfile.xlsx"
* @return ResponseEntity<Resource>ResponseEntityResource
* ResponseEntityHTTP
* ResourceSpring使FileSystemResourceUrlResource
*
* @throws IOException IO
*
*/
@GetMapping("download")
public ResponseEntity<Resource> download(@RequestParam String path) throws IOException {
// 使用Paths工具类的静态方法get根据传入的文件路径字符串创建一个Path对象
// Path对象用于在Java NIO中表示文件或目录的路径方便后续对文件路径进行操作比如判断文件是否存在等。
Path filePath = Paths.get(path);
// 创建一个FileSystemResource对象它是Resource接口的一个实现类用于基于文件系统来表示一个文件资源
// 通过传入Path对象对应的文件实例化该资源对象这样就可以通过这个对象对文件进行相关操作比如判断文件是否存在、获取文件名等。
Resource resource = new FileSystemResource(filePath.toFile());
// 处理文件不存在的情况
// 处理文件不存在的情况如果通过Resource对象判断文件不存在调用exists方法返回false
// 则使用ResponseEntity的静态方法notFound创建一个表示404状态码资源未找到的ResponseEntity对象并返回
// 这样客户端接收到这个响应就知道请求下载的文件不存在了。
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
// 对文件名进行编码处理使用URLEncoder按照UTF-8字符集对Resource对象获取到的文件名进行编码
// 这是为了确保文件名在HTTP响应中能够正确传输特别是包含非ASCII字符的文件名避免出现文件名乱码等问题
// 同时将编码后字符串中的 "+" 号替换为 "%20"因为在HTTP协议中空格通常用 "%20" 来表示,确保文件名在客户端能被正确解析。
String encodedFilename = URLEncoder.encode(resource.getFilename(), StandardCharsets.UTF_8.name()).replace("+", "%20");
// 构建Content-Disposition响应头的值用于告诉客户端如何处理响应体中的内容
// "attachment" 表示让客户端将响应内容作为附件进行下载,而不是在浏览器中直接打开等其他处理方式,
// "filename*=UTF-8''" + encodedFilename 部分则是指定了下载文件的文件名采用UTF-8编码格式并使用编码后的文件名
// 这样客户端在下载文件时就能以正确的文件名保存文件了。
String contentDisposition = "attachment; filename*=UTF-8''" + encodedFilename;
// 使用ResponseEntity的静态方法ok创建一个表示200状态码请求成功的ResponseEntity对象构建器
// 然后通过链式调用的方式依次设置响应的内容类型ContentType为 "application/vnd.ms-excel"
// 这里假设下载的文件是Excel文件格式可根据实际下载文件的类型进行相应修改比如下载图片可以设置为 "image/jpeg" 等合适的类型,
// 接着设置 "Content-Disposition" 响应头为上面构建好的值最后将表示文件资源的Resource对象作为响应体body设置进去
// 完成整个ResponseEntity对象的构建并返回给客户端从而实现将文件以正确的配置提供给客户端进行下载的功能。
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/vnd.ms-excel"))
.header("Content-Disposition", contentDisposition)
.body(resource);
}
}
}

@ -13,29 +13,52 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* FeedsControllerSpring MVCHTTP
* FeedsService
* xcs202401041348
*
* @author xcs
* @date 20240104 1348
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层方便与前端进行数据交互。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的feedsService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将FeedsService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/feeds")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/list" 路径对应的完整请求路径就是 "/api/feeds/list",以此来清晰地划分和组织不同功能接口的访问路径,明确该接口是用于朋友圈相关操作的。
public class FeedsController {
private final FeedsService feedsService;
// 通过依赖注入的方式引入FeedsService的实例FeedsService是服务层的接口或类它封装了与朋友圈相关的各种业务逻辑方法
// 例如这里的queryFeeds方法用于根据特定条件查询朋友圈信息具体的业务实现细节在FeedsService及其实现类中完成。
/**
*
* listHTTP GETFeedsDTO
* FeedsServicequeryFeedsResponseVO
*
* @param feedsDTO
* @return FeedsVO
* @param feedsDTO DTO
*
* 便
* @return ResponseVO<List<FeedsVO>>ResponseVOFeedsVO
* ResponseVO便
* FeedsVO
* ResponseVO便
*/
@GetMapping("/list")
public ResponseVO<List<FeedsVO>> list(FeedsDTO feedsDTO) {
// 查询朋友圈
// 调用FeedsService的queryFeeds方法传入FeedsDTO对象作为查询条件
// 该方法会依据传入的条件去数据库或者其他数据源中查找符合要求的朋友圈动态信息返回的结果包装在PageVO中
// PageVO通常用于分页相关的场景它包含了当前页的数据记录列表这里就是朋友圈动态信息列表、当前页码以及总记录数等信息。
PageVO<FeedsVO> pageVO = feedsService.queryFeeds(feedsDTO);
// 返回数据
// 使用ResponseVO的静态方法ok创建一个表示成功响应的ResponseVO对象
// 并将从PageVO中获取的朋友圈动态记录列表pageVO.getRecords()、当前页码pageVO.getCurrent()以及总记录数pageVO.getTotal())作为参数传入,
// 这样就把查询到的朋友圈动态列表信息以及分页相关信息一起封装进ResponseVO中返回给客户端了。
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
}
}

@ -10,23 +10,43 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* Controller
* ImageControllerSpring MVCHTTP
* ImageServiceMD5
* ResponseEntityxcs2024124164152
*
* @author xcs
* @date 202412416:41:52
*/
@Controller
// 该注解用于标识这个类是一个Spring MVC的控制器它可以处理HTTP请求并返回视图或者数据响应。
// 在这里主要是借助ResponseEntity来返回图片资源相关的响应而不是返回视图模板如HTML页面用于实现图片下载相关的接口功能。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的imageService字段生成对应的构造函数注入使得Spring容器可以通过构造函数注入的方式将ImageService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/image")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/downloadImgMd5"、"/downloadImg"、"/downloadImgFormLocal" 这些路径对应的完整请求路径就是 "/api/image/downloadImgMd5"、"/api/image/downloadImg"、"/api/image/downloadImgFormLocal" 等,
// 以此来清晰地划分和组织不同功能接口的访问路径,明确各个接口是用于处理特定条件下的图片下载操作。
public class ImageController {
private final ImageService imageService;
// 通过依赖注入的方式引入ImageService的实例ImageService是服务层的接口或类它封装了与图片相关的各种业务逻辑方法
// 例如根据MD5值查找并获取对应的图片资源、依据路径下载图片以及从本地路径获取图片资源等具体的业务操作具体的业务实现细节在ImageService及其实现类中完成。
/**
* Md5
* downloadImgMd5MD5HTTP GETMD5
* ImageServicedownloadImgMd5ResponseEntity<Resource>
* 使MD5便
*
* @param md5 Md5
* @return
* @param md5 Md5MD5
* MD5MD5MD5
* @return ResponseEntity<Resource>ResponseEntityResource
* ResponseEntityHTTP
* ResourceSpring
*
*/
@GetMapping("/downloadImgMd5")
public ResponseEntity<Resource> downloadImgMd5(@RequestParam String md5) {
@ -34,10 +54,14 @@ public class ImageController {
}
/**
*
* downloadImgHTTP GET
* ImageServicedownloadImgResponseEntity<Resource>
*
*
* @param path Md5
* @return
* @param path Md5
*
* @return ResponseEntity<Resource>downloadImgMd5
* ResponseEntity
*/
@GetMapping("/downloadImg")
public ResponseEntity<Resource> downloadImg(@RequestParam String path) {
@ -45,13 +69,18 @@ public class ImageController {
}
/**
*
* downloadImgFormLocalHTTP GET
* ImageServicedownloadImgFormLocalResponseEntity<Resource>
*
*
* @param localPath
* @return
* @param localPath
* Windows "C:/images/myPic.jpg"
* Linux "/home/user/images/myPic.jpg"
* @return ResponseEntity<Resource>
* ResponseEntity
*/
@GetMapping("/downloadImgFormLocal")
public ResponseEntity<Resource> downloadImgFormLocal(@RequestParam String localPath) {
return imageService.downloadImgFormLocal(localPath);
}
}
}

@ -3,21 +3,30 @@ package com.xcs.wx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* IndexControllerSpring MVC
* "index"
* xcs202401261134
*
* @author xcs
* @date 20240126 1134
**/
@Controller
// 该注解用于标识这个类是一个Spring MVC的控制器意味着它可以处理HTTP请求并按照Spring的视图解析机制返回对应的视图页面
// 与@RestController不同它不是主要用于返回数据如JSON格式数据响应而是更侧重于返回视图相关的响应像HTML页面等。
public class IndexController {
/**
* url
* index "index"
* @RequestMapping"/""/{path:[^.]*}"
* 访
*
* @return html
* @return String "index"Spring MVCindex.html
* HTML
*/
@RequestMapping(value = {"/", "/{path:[^.]*}"})
public String index() {
return "index";
}
}
}

@ -12,24 +12,45 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* MsgControllerSpring MVCHTTP
* MsgService
* 使ResponseVOxcs202312251706
*
* @author xcs
* @date 20231225 1706
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层方便与前端进行数据交互。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的msgService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将MsgService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/msg")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/list"、"/export" 路径对应的完整请求路径就是 "/api/msg/list"、"/api/msg/export" 等,以此来清晰地划分和组织不同功能接口的访问路径,明确各接口是用于消息相关操作的。
public class MsgController {
private final MsgService msgService;
// 通过依赖注入的方式引入MsgService的实例MsgService是服务层的接口或类它封装了与消息相关的各种业务逻辑方法
// 例如根据指定条件查询消息、将指定对话的聊天记录导出等操作具体的业务实现细节在MsgService及其实现类中完成。
/**
*
* listHTTP GETtalkernextSequence
* MsgServicequeryMsgResponseVO
*
* @param talker
* @param nextSequence
* @return ResponseVO
* @param talker
*
*
* @param nextSequence
*
* 使
* @return ResponseVO<List<MsgVO>>ResponseVOMsgVO
* ResponseVO便
* MsgVO
* ResponseVO便
*/
@GetMapping("/list")
public ResponseVO<List<MsgVO>> list(@RequestParam String talker, @RequestParam Long nextSequence) {
@ -37,12 +58,17 @@ public class MsgController {
}
/**
*
* exportHTTP GETtalker
* MsgServiceexportMsgResponseVO
*
* @return ResponseVO
* @param talker
*
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export(@RequestParam String talker) {
return ResponseVO.ok(msgService.exportMsg(talker));
}
}
}

@ -12,37 +12,66 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* RecoverContactControllerSpring MVCHTTP
* RecoverContactService
* 使ResponseVOxcs202401041348
*
* @author xcs
* @date 20240104 1348
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层方便与前端进行数据交互。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的recoverContactService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将RecoverContactService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/recover/contact")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/list"、"/export" 路径对应的完整请求路径就是 "/api/recover/contact/list"、"/api/recover/contact/export" 等,
// 以此来清晰地划分和组织不同功能接口的访问路径,明确各接口是用于找回联系人相关操作的。
public class RecoverContactController {
private final RecoverContactService recoverContactService;
// 通过依赖注入的方式引入RecoverContactService的实例RecoverContactService是服务层的接口或类它封装了与找回联系人相关的各种业务逻辑方法
// 例如根据特定条件查询可找回的联系人信息、执行联系人导出操作等具体的业务实现细节在RecoverContactService及其实现类中完成。
/**
*
* listHTTP GETRecoverContactDTO
* RecoverContactServicequeryRecoverContact
* ResponseVO
*
* @param recoverContactDTO
* @return FeedsVO
* @param recoverContactDTO DTO
*
* 便
* @return ResponseVO<List<RecoverContactVO>>ResponseVORecoverContactVO
* ResponseVO便
* RecoverContactVO
* ResponseVO便
*
*/
@GetMapping("/list")
public ResponseVO<List<RecoverContactVO>> list(RecoverContactDTO recoverContactDTO) {
// 返回数据
// 调用RecoverContactService的queryRecoverContact方法传入RecoverContactDTO对象作为查询条件
// 该方法会依据传入的条件去数据库或者其他数据源中查找符合要求的找回联系人信息然后直接将查询结果封装在ResponseVO中返回给客户端
// 使用ResponseVO的静态方法ok创建一个表示成功响应的ResponseVO对象并将查询到的找回联系人信息列表作为参数传入
// 这样就把查询到的找回联系人列表信息封装进ResponseVO中返回给客户端了。
return ResponseVO.ok(recoverContactService.queryRecoverContact(recoverContactDTO));
}
/**
*
* exportHTTP GET
* RecoverContactServiceexportRecoverContact
* ResponseVO
*
* @return ResponseVO
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(recoverContactService.exportRecoverContact());
}
}
}

@ -11,25 +11,43 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* Controller
* SessionControllerSpring MVCHTTP
* SessionService
* 使ResponseVOxcs202312211738
*
* @author xcs
* @date 20231221 1738
* @date 202312211738
**/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层方便与前端进行数据交互。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的sessionService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将SessionService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/session")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/list" 路径对应的完整请求路径就是 "/api/session/list",以此来清晰地划分和组织不同功能接口的访问路径,明确该接口是用于会话相关操作的。
public class SessionController {
private final SessionService sessionService;
// 通过依赖注入的方式引入SessionService的实例SessionService是服务层的接口或类它封装了与会话相关的各种业务逻辑方法
// 例如这里的querySession方法用于查询会话列表具体的业务实现细节在SessionService及其实现类中完成。
/**
*
* listHTTP GET
* SessionServicequerySessionResponseVO
*
* @return SessionVO
* @return ResponseVO<List<SessionVO>>ResponseVOSessionVO
* ResponseVO便
* SessionVOID
* ResponseVO
* 便
*/
@GetMapping("/list")
public ResponseVO<List<SessionVO>> list() {
return ResponseVO.ok(sessionService.querySession());
}
}
}

@ -14,25 +14,43 @@ import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* UserController
* UserControllerSpring MVCHTTP
* UserServiceWeChatService
* 使ResponseVOxcs2024615160549
*
* @author xcs
* @date 202461516:05:49
*/
@RestController
// 该注解表明这个类是一个Spring RESTful风格的控制器意味着它主要用于处理HTTP请求并返回JSON、XML等格式的数据响应
// 而不是像传统的MVC模式那样返回视图页面如HTML页面适用于构建前后端分离项目中的接口层方便与前端进行数据交互。
@RequiredArgsConstructor
// 使用Lombok的 @RequiredArgsConstructor 注解会为类中所有被标记为final且未初始化的字段生成构造函数
// 在这里就是为下面的userService和weChatService字段生成对应的构造函数注入使得Spring容器能够通过构造函数注入的方式将UserService和WeChatService的实例注入进来简化了依赖注入的代码编写。
@RequestMapping("/api/user")
// 用于定义该控制器所处理请求的基础路径,后续在此控制器内定义的各个请求映射方法对应的完整请求路径都基于这个基础路径进行拼接,
// 例如下面的 "/readWeChatConfig"、"/userInfo" 等路径对应的完整请求路径就是 "/api/user/readWeChatConfig"、"/api/user/userInfo" 等,
// 以此来清晰地划分和组织不同功能接口的访问路径,明确各接口是用于用户相关操作的。
public class UserController {
private final UserService userService;
private final WeChatService weChatService;
// 通过依赖注入的方式引入UserService和WeChatService的实例
// UserService是服务层的接口或类它封装了与用户自身信息相关的各种业务逻辑方法如获取用户头像、昵称、查询所有用户以及切换用户等操作
// WeChatService则是封装了与微信相关配置信息查询等业务逻辑的服务层接口或类具体的业务实现细节在它们各自的实现类中完成。
/**
*
* readWeChatConfigHTTP GET
* WeChatServicereadWeChatConfigResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<WeChatConfigVO>>ResponseVOWeChatConfigVO
* ResponseVO便
* WeChatConfigVO
* ResponseVO便
*/
@GetMapping("/readWeChatConfig")
public ResponseVO<List<WeChatConfigVO>> readWeChatConfig() {
@ -40,9 +58,12 @@ public class UserController {
}
/**
*
* userInfoHTTP GET
* UserServiceuserInfoUserInfoVOResponseVO
*
* @return ResponseVO
* @return ResponseVO<UserInfoVO>ResponseVOUserInfoVO
* UserInfoVO
* ResponseVO便
*/
@GetMapping("/userInfo")
public ResponseVO<UserInfoVO> userInfo() {
@ -50,9 +71,13 @@ public class UserController {
}
/**
*
* avatarHTTP GET
* UserServiceavatar
* ResponseVO
*
* @return ResponseVO
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/avatar")
public ResponseVO<String> avatar() {
@ -60,9 +85,11 @@ public class UserController {
}
/**
*
* nicknameHTTP GET
* UserServicenicknameResponseVO
*
* @return ResponseVO
* @return ResponseVO<String>ResponseVOString
* ResponseVO便
*/
@GetMapping("/nickname")
public ResponseVO<String> nickname() {
@ -70,9 +97,12 @@ public class UserController {
}
/**
*
* usersHTTP GET
* UserServiceusersResponseVO
*
* @return ResponseVO
* @return ResponseVO<List<UserVO>>ResponseVOUserVO
* UserVOID
* ResponseVO便
*/
@GetMapping("/users")
public ResponseVO<List<UserVO>> users() {
@ -80,14 +110,18 @@ public class UserController {
}
/**
*
* switchUserHTTP PUTIDwxId
* UserServiceswitchUserResponseVO
*
* @param wxId wxId
* @return ResponseVO
* @param wxId wxIdIDID
* ID
* @return ResponseVO<String>ResponseVOString
* "切换成功"ResponseVO
*
*/
@PutMapping("/switchUser")
public ResponseVO<String> switchUser(String wxId) {
userService.switchUser(wxId);
return ResponseVO.ok("切换成功");
}
}
}

@ -6,101 +6,151 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
/**
* CompressContentBO
* CompressContentBOBOBusiness Object
* JavaXMLxcs202401161459
*
* @author xcs
* @date 20240116 1459
**/
@Data
// 使用Lombok的 @Data 注解会自动为类生成常用的方法如Getter、Setter、toString、equals和hashCode等方法
// 简化了手动编写这些常规方法的代码量,方便对类中的属性进行访问和操作。
@JsonIgnoreProperties(ignoreUnknown = true)
// 这个注解用于告诉Jackson一个常用的JSON处理库在进行JSON序列化和反序列化时忽略那些在JSON数据中存在但在Java对象中没有对应属性的字段
// 这样可以避免因未知字段而导致的反序列化错误提高程序的兼容性和容错性尤其是在处理可能来自不同数据源的JSON数据时很有用。
@JacksonXmlRootElement(localName = "msg")
// 该注解用于指定在将Java对象转换为XML格式时整个XML文档的根元素名称为 "msg"使得生成的XML结构符合特定的格式要求便于与外部系统进行基于XML的数据交互。
public class CompressContentBO {
@JacksonXmlProperty(localName = "appmsg")
private AppMsg appMsg;
// 使用 @JacksonXmlProperty 注解来指定在XML格式中对应的元素名称为 "appmsg"表示该属性在XML序列化和反序列化时与名为 "appmsg" 的XML元素相关联
// 这里的AppMsg是一个内部静态类它用于进一步封装与 "appmsg" 元素相关的详细数据结构。
@JacksonXmlProperty(localName = "fromusername")
private String fromUsername;
// 同样指定该属性对应的XML元素名为 "fromusername"用于存储从XML中解析出的或者要转换为XML的对应元素的值这里存储的可能是发送者的用户名等相关信息。
@JacksonXmlProperty(localName = "scene")
private int scene;
// 对应XML中的 "scene" 元素,可能表示某种场景相关的数值信息,具体含义取决于业务中对这个字段的定义,例如不同的业务操作场景、消息来源场景等。
@JacksonXmlProperty(localName = "appinfo")
private AppInfo appInfo;
// 关联XML中的 "appinfo" 元素AppInfo也是一个内部静态类用于承载与应用信息相关的具体数据比如应用的版本、名称等内容。
@JacksonXmlProperty(localName = "titile")
private String titile;
// 这里应该是拼写错误,正确的可能是 "title"可根据实际业务情况确认用于对应XML中的同名元素存储相关的标题类信息比如消息标题等。
/**
* AppMsg "appmsg" XML
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppMsg {
@JacksonXmlProperty(localName = "title")
private String title;
// 对应 "appmsg" 元素下的 "title" 子元素,通常用于存储消息的标题内容,比如文章标题、推送消息标题等。
@JacksonXmlProperty(localName = "sourcedisplayname")
private String sourceDisplayName;
// 关联 "appmsg" 元素下的 "sourcedisplayname" 子元素,可能表示消息来源的显示名称,例如公众号名称、应用来源的展示名称等。
@JacksonXmlProperty(localName = "des")
private String des;
// 对应 "appmsg" 元素下的 "des" 子元素,这里可能是拼写错误,推测正确的是 "desc"(表示描述),用于存储相关的描述信息,如消息的简介等内容(可根据业务确认)。
@JacksonXmlProperty(localName = "url")
private String url;
// 关联 "appmsg" 元素下的 "url" 子元素,一般用于存储一个链接地址,比如点击消息后跳转的网页地址、应用内页面的链接等。
@JacksonXmlProperty(localName = "action")
private String action;
// 对应 "appmsg" 元素下的 "action" 子元素,可能表示针对该消息可以执行的操作类型,例如打开链接、分享、评论等具体操作(依业务而定)。
@JacksonXmlProperty(localName = "type")
private int type;
// 关联 "appmsg" 元素下的 "type" 子元素,用于表示消息的类型,不同的数值可能对应不同种类的消息,比如文本消息、图片消息、链接消息等(由业务定义具体类型规则)。
@JacksonXmlProperty(localName = "showtype")
private int showType;
// 对应 "appmsg" 元素下的 "showtype" 子元素,可能用于表示消息的展示类型,例如是列表展示、卡片展示或者其他特定的展示形式(取决于业务需求)。
@JacksonXmlProperty(localName = "refermsg")
private ReferMsg referMsg;
// 关联 "appmsg" 元素下的 "refermsg" 子元素ReferMsg是内部的又一层嵌套静态类用于承载与引用消息相关的详细信息比如引用消息的来源、内容等。
@JacksonXmlProperty(localName = "weappinfo")
private WeAppInfo weAppInfo;
// 对应 "appmsg" 元素下的 "weappinfo" 子元素WeAppInfo同样是内部嵌套静态类用于存放与小程序相关的信息比如小程序图标地址、页面缩略图地址等。
/**
* ReferMsg "refermsg" XML
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ReferMsg {
@JacksonXmlProperty(localName = "type")
private int type;
// 对应 "refermsg" 元素下的 "type" 子元素,可能用于表示引用消息本身的类型,同样不同数值对应不同类型的引用消息(依业务定义)。
@JacksonXmlProperty(localName = "svrid")
private long svrId;
// 关联 "refermsg" 元素下的 "svrid" 子元素可能是服务器端为该引用消息分配的唯一标识ID用于区分不同的引用消息等操作。
@JacksonXmlProperty(localName = "fromusr")
private String fromUsr;
// 对应 "refermsg" 元素下的 "fromusr" 子元素,用于存储引用消息的发送者相关信息,比如发送者用户名等。
@JacksonXmlProperty(localName = "displayname")
private String displayName;
// 关联 "refermsg" 元素下的 "displayname" 子元素,可能表示引用消息发送者的显示名称,类似于昵称等展示给用户的称呼信息。
@JacksonXmlProperty(localName = "content")
private String content;
// 对应 "refermsg" 元素下的 "content" 子元素,用于存储引用消息的具体内容,比如文本内容等。
@JacksonXmlProperty(localName = "msgsource")
private String msgSource;
// 关联 "refermsg" 元素下的 "msgsource" 子元素,用于表示引用消息的来源渠道,例如来自哪个公众号、哪个应用等。
}
/**
* WeAppInfo "weappinfo" XML
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class WeAppInfo {
@JacksonXmlProperty(localName = "weappiconurl")
private String weAppIconUrl;
// 对应 "weappinfo" 元素下的 "weappiconurl" 子元素,用于存储小程序的图标对应的网络地址,方便在界面上展示小程序的图标。
@JacksonXmlProperty(localName = "weapppagethumbrawurl")
private String weAppPageThumbRawUrl;
// 关联 "weappinfo" 元素下的 "weapppagethumbrawurl" 子元素,用于存储小程序页面缩略图的原始网络地址,可用于在展示小程序相关信息时展示页面缩略图。
}
}
/**
* AppInfo "appinfo" XML
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppInfo {
@JacksonXmlProperty(localName = "version")
private int version;
// 对应 "appinfo" 元素下的 "version" 子元素,用于存储应用的版本号信息,便于判断应用的新旧程度以及是否需要更新等操作。
@JacksonXmlProperty(localName = "appname")
private String appName;
// 关联 "appinfo" 元素下的 "appname" 子元素,用于存储应用的名称,用于明确该应用的标识等情况。
}
}

@ -4,22 +4,33 @@ import lombok.AllArgsConstructor;
import lombok.Data;
/**
* DecryptBO
* DecryptBOBOBusiness Object
* xcs20231210202102
*
* @author xcs
* @date 2023121020:21:02
*/
@Data
// 使用Lombok的 @Data 注解会自动为类生成常用的方法如Getter、Setter、toString、equals和hashCode等方法
// 这样在其他代码中就可以方便地获取和设置类中的属性值,以及进行对象的比较、打印等操作,简化了手动编写这些常规方法的代码量。
@AllArgsConstructor
// 使用Lombok的 @AllArgsConstructor 注解,会为该类生成一个包含所有参数的构造函数,
// 这样在创建DecryptBO类的实例时可以通过传入相应的参数值来初始化对象的属性方便对象的创建和属性赋值操作。
public class DecryptBO {
/**
*
* input
*
*
*/
private String input;
/**
*
* output
* 便使
* 便
*/
private String output;
}
}

@ -6,164 +6,230 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
/**
* MsgBOBOBusiness ObjectJavaXML
* JacksonXMLJavaxcs202401161459
*
* @author xcs
* @date 20240116 1459
**/
@Data
// 使用Lombok的 @Data 注解会自动为类生成常用的方法如Getter、Setter、toString、equals和hashCode等方法
// 方便在其他代码中对类中的属性进行访问、赋值以及进行对象的比较、打印等操作,减少了手动编写这些常规方法的代码量。
@JsonIgnoreProperties(ignoreUnknown = true)
// 这个注解用于告诉Jackson一个常用的JSON处理库在这里也用于处理XML与Java对象的转换在进行XML序列化和反序列化时
// 忽略那些在XML数据中存在但在Java对象中没有对应属性的字段避免因未知字段而导致的反序列化错误增强程序处理不同来源XML数据的兼容性和容错性。
@JacksonXmlRootElement(localName = "msg")
// 该注解用于指定在将Java对象转换为XML格式时整个XML文档的根元素名称为 "msg"以此确定生成的XML结构的顶层元素名称
// 便于符合特定的XML数据格式要求从而与外部系统可能是微信相关的服务端等进行基于XML的数据交互。
public class MsgBO {
@JacksonXmlProperty(localName = "img")
public Img img;
// 使用 @JacksonXmlProperty 注解来指定该属性在XML格式中对应的元素名称为 "img"表示在XML序列化和反序列化时
// 这个属性与名为 "img" 的XML元素相关联Img是一个内部静态类用于进一步封装与图片相关的详细信息。
@JacksonXmlProperty(localName = "emoji")
private Emoji emoji;
// 同样通过 @JacksonXmlProperty 注解将该属性与XML中的 "emoji" 元素相对应Emoji也是内部静态类
// 用于承载与表情符号Emoji相关的各种详细属性信息方便处理微信消息中涉及表情的相关数据。
/**
* Img "img" XML
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Img {
@JacksonXmlProperty(isAttribute = true, localName = "aeskey")
public String aesKey;
// 使用 @JacksonXmlProperty 注解,并设置 isAttribute = true表示这个属性对应的是XML元素的属性而不是子元素
// 其对应的XML元素 "img" 的属性名为 "aeskey",通常用于存储图片加密相关的密钥信息,比如用于解密图片数据的对称密钥等。
@JacksonXmlProperty(isAttribute = true, localName = "encryver")
public String encryVer;
// 同样对应 "img" 元素的属性 "encryver",可能表示图片加密的版本信息,用于区分不同加密算法或加密参数设置下的图片加密情况。
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbaeskey")
public String cdnThumbAesKey;
// 对应 "img" 元素的属性 "cdnthumbaeskey"一般是与图片缩略图在内容分发网络CDN上的缩略图加密相关的密钥用于处理缩略图的解密操作等。
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumburl")
public String cdnThumbUrl;
// 关联 "img" 元素的属性 "cdnthumburl"用于存储图片缩略图在CDN上的网络地址方便在界面上展示图片的缩略图时获取相应资源。
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumblength")
public int cdnThumbLength;
// 对应 "img" 元素的属性 "cdnthumblength",表示图片缩略图的数据长度,可用于验证数据完整性或者预估加载时间等操作。
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbheight")
public int cdnThumbHeight;
// 关联 "img" 元素的属性 "cdnthumbheight",用于存储图片缩略图的高度信息,以像素等单位表示,便于在展示等场景中进行布局和显示控制。
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbwidth")
public int cdnThumbWidth;
// 对应 "img" 元素的属性 "cdnthumbwidth",表示图片缩略图的宽度信息,同样以像素等单位计量,用于图片展示相关的尺寸适配等操作。
@JacksonXmlProperty(isAttribute = true,localName = "cdnmidheight")
public int cdnMidHeight;
// 对应 "img" 元素的属性 "cdnmidheight",可能表示图片中等尺寸版本(相对于缩略图和高清图而言)的高度信息,用于不同显示需求下的图片展示操作。
@JacksonXmlProperty(isAttribute = true, localName = "cdnmidwidth")
public int cdnMidWidth;
// 关联 "img" 元素的属性 "cdnmidwidth",存储图片中等尺寸版本的宽度信息,配合高度信息用于图片的展示和布局调整等。
@JacksonXmlProperty(isAttribute = true, localName = "cdnhdheight")
public int cdnHdHeight;
// 对应 "img" 元素的属性 "cdnhdheight",用于存储图片高清版本的高度信息,在需要高质量图片展示的场景下使用。
@JacksonXmlProperty(isAttribute = true, localName = "cdnhdwidth")
public int cdnHdWidth;
// 关联 "img" 元素的属性 "cdnhdwidth",表示图片高清版本的宽度信息,与高度信息共同确定高清图片的尺寸,便于正确展示高质量图片。
@JacksonXmlProperty(isAttribute = true, localName = "cdnmidimgurl")
public String cdnMidImgUrl;
// 对应 "img" 元素的属性 "cdnmidimgurl",用于存储图片中等尺寸版本的网络地址,方便根据不同的显示需求加载相应尺寸的图片资源。
@JacksonXmlProperty(isAttribute = true, localName = "length")
public int length;
// 关联 "img" 元素的属性 "length",表示图片原始数据的长度,用于数据完整性校验、资源管理等操作,比如判断图片大小是否符合预期等。
@JacksonXmlProperty(isAttribute = true, localName = "md5")
public String md5;
// 对应 "img" 元素的属性 "md5"存储图片的MD5校验和信息用于验证图片数据在传输、存储过程中是否被篡改确保数据的准确性和完整性。
@JacksonXmlProperty(isAttribute = true, localName = "hevc_mid_size")
public int hevcMidSize;
// 对应 "img" 元素的属性 "hevc_mid_size"可能与图片采用高效视频编码HEVC格式下的中等尺寸相关的一些大小参数有关
// 比如文件大小、编码后的数据量等,具体取决于业务中对图片编码相关属性的定义和使用场景。
@JacksonXmlProperty(isAttribute = true, localName = "originsourcemd5")
public String originSourceMd5;
// 关联 "img" 元素的属性 "originsourcemd5"可能是图片原始数据源的MD5校验和用于进一步追溯和验证图片来源数据的准确性等情况。
}
/**
* Emoji "emoji" XMLEmoji
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Emoji {
@JacksonXmlProperty(isAttribute = true, localName = "fromusername")
private String fromUsername;
// 使用 @JacksonXmlProperty 注解并设置为属性映射,对应 "emoji" 元素的属性 "fromusername",用于存储发送表情符号的用户的用户名信息,
// 便于明确表情的发送来源,比如在聊天记录中追溯是哪位用户发送了该表情。
@JacksonXmlProperty(isAttribute = true, localName = "tousername")
private String toUsername;
// 对应 "emoji" 元素的属性 "tousername",用于存储表情符号接收者的用户名信息,确定表情发送的目标对象,
// 在多用户聊天场景等情况下有助于区分不同接收者收到的表情情况。
@JacksonXmlProperty(isAttribute = true, localName = "type")
private String type;
// 关联 "emoji" 元素的属性 "type",用于表示表情符号的类型,不同的类型可能对应不同的表情图案、动画效果或者业务含义等,
// 例如静态表情、动态表情等不同分类,具体由业务中对表情类型的定义来确定。
@JacksonXmlProperty(isAttribute = true, localName = "idbuffer")
private String idBuffer;
// 对应 "emoji" 元素的属性 "idbuffer",可能是表情符号在系统中的唯一标识缓冲区相关信息,用于在内部对表情进行区分和管理,
// 比如在表情资源查找、匹配等操作中发挥作用。
@JacksonXmlProperty(isAttribute = true, localName = "md5")
private String md5;
// 关联 "emoji" 元素的属性 "md5"存储表情符号相关数据的MD5校验和信息用于验证表情数据的完整性确保在传输、存储过程中没有被篡改。
@JacksonXmlProperty(isAttribute = true, localName = "len")
private String len;
// 对应 "emoji" 元素的属性 "len",可能表示表情符号相关数据的长度信息,例如字节长度等,可用于资源管理、数据校验等操作。
@JacksonXmlProperty(isAttribute = true, localName = "productid")
private String productId;
// 关联 "emoji" 元素的属性 "productid"可能是与表情符号所属产品、系列相关的唯一标识比如某个特定主题表情包的产品ID等
// 便于对表情进行分类、授权等管理操作。
@JacksonXmlProperty(isAttribute = true, localName = "androidmd5")
private String androidMd5;
// 对应 "emoji" 元素的属性 "androidmd5"可能是专门针对安卓平台上表情符号相关数据的MD5校验和用于在安卓设备端验证数据完整性等操作
// 考虑到不同平台可能对表情的存储、处理方式略有差异,单独设置这样的属性有助于针对性的管理。
@JacksonXmlProperty(isAttribute = true, localName = "androidlen")
private String androidLen;
// 关联 "emoji" 元素的属性 "androidlen",可能表示安卓平台上表情符号相关数据的长度信息,用于适配安卓设备的资源管理等需求。
@JacksonXmlProperty(isAttribute = true, localName = "s60v3md5")
private String s60v3Md5;
// 对应 "emoji" 元素的属性 "s60v3md5"可能是针对塞班S60v3系统平台上表情符号相关数据的MD5校验和用于该平台下的数据完整性验证等操作
// 体现了对不同历史平台的兼容和数据管理考虑。
@JacksonXmlProperty(isAttribute = true, localName = "s60v3len")
private String s60v3Len;
// 关联 "emoji" 元素的属性 "s60v3len"表示塞班S60v3系统平台上表情符号相关数据的长度信息满足该平台下的资源管理等相关需求。
@JacksonXmlProperty(isAttribute = true, localName = "s60v5md5")
private String s60v5Md5;
// 对应 "emoji" 元素的属性 "s60v5md5"类似地是针对塞班S60v5系统平台上表情符号相关数据的MD5校验和用于对应平台的数据验证操作。
@JacksonXmlProperty(isAttribute = true, localName = "s60v5len")
private String s60v5Len;
// 关联 "emoji" 元素的属性 "s60v5len"表示塞班S60v5系统平台上表情符号相关数据的长度信息以便在该平台上进行合适的资源处理。
@JacksonXmlProperty(isAttribute = true, localName = "cdnurl")
private String cdnUrl;
// 对应 "emoji" 元素的属性 "cdnurl"用于存储表情符号相关资源在内容分发网络CDN上的网络地址方便快速加载表情图片等资源
// 提高表情在不同客户端展示的效率和速度。
@JacksonXmlProperty(isAttribute = true, localName = "designerid")
private String designerId;
// 关联 "emoji" 元素的属性 "designerid",可能是表情符号的设计者的唯一标识,用于版权管理、来源追溯等操作,
// 比如查看某个表情是由哪位设计师创作的,便于相关权益管理和信息展示。
@JacksonXmlProperty(isAttribute = true, localName = "thumburl")
private String thumbUrl;
// 对应 "emoji" 元素的属性 "thumburl",用于存储表情符号缩略图的网络地址,在一些界面展示场景中,先展示缩略图再加载完整表情,
// 可以提高用户体验和界面响应速度。
@JacksonXmlProperty(isAttribute = true, localName = "encrypturl")
private String encryptUrl;
// 关联 "emoji" 元素的属性 "encrypturl",可能是表情符号相关资源加密后的网络地址,在需要安全传输和存储表情数据的场景下使用,
// 例如涉及隐私表情或者付费表情包等情况,确保数据的保密性。
@JacksonXmlProperty(isAttribute = true, localName = "aeskey")
private String aesKey;
// 对应 "emoji" 元素的属性 "aeskey",通常用于存储表情符号相关数据加密的密钥信息,比如采用对称加密算法时的加密密钥,
// 用于在合适的时候对加密的表情数据进行解密操作,保障数据的安全性和完整性。
@JacksonXmlProperty(isAttribute = true, localName = "externurl")
private String externUrl;
// 关联 "emoji" 元素的属性 "externurl",可能是表情符号关联的外部链接地址,例如点击表情后跳转到的相关网页、推广页面等,
// 拓展了表情符号在业务中的功能和交互性。
@JacksonXmlProperty(isAttribute = true, localName = "externmd5")
private String externMd5;
// 对应 "emoji" 元素的属性 "externmd5"存储与表情符号关联的外部资源如通过外部链接指向的资源的MD5校验和信息
// 用于验证外部资源数据的完整性,防止外部链接指向的资源被篡改等情况。
@JacksonXmlProperty(isAttribute = true, localName = "width")
private String width;
// 关联 "emoji" 元素的属性 "width",用于存储表情符号相关图片资源的宽度信息,以像素等单位表示,便于在界面展示时进行布局和尺寸适配。
@JacksonXmlProperty(isAttribute = true, localName = "height")
private String height;
// 对应 "emoji" 元素的属性 "height",表示表情符号相关图片资源的高度信息,同样以像素等单位计量,与宽度信息一起用于正确展示表情图片。
@JacksonXmlProperty(isAttribute = true, localName = "tpurl")
private String tpUrl;
// 关联 "emoji" 元素的属性 "tpurl",可能是表情符号的某种特定用途的链接地址(具体含义取决于业务定义),例如用于查看表情详情、
// 进行表情相关操作的链接等,丰富了表情符号在业务逻辑中的交互操作可能性。
@JacksonXmlProperty(isAttribute = true, localName = "tpauthkey")
private String tpAuthKey;
// 对应 "emoji" 元素的属性 "tpauthkey"可能是用于访问上述特定链接tpurl的授权密钥确保只有授权用户能够进行相关的操作
// 保障表情相关交互操作的安全性和权限管理。
@JacksonXmlProperty(isAttribute = true, localName = "attachedtext")
private String attachedText;
@JacksonXmlProperty(isAttribute = true, localName = "attachedtextcolor")
private String attachedTextColor;
@JacksonXmlProperty(isAttribute = true, localName = "lensid")
private String lensId;
@JacksonXmlProperty(isAttribute = true, localName = "emojiattr")
private String emojiAttr;
@JacksonXmlProperty(isAttribute = true, localName = "linkid")
private String linkId;
@JacksonXmlProperty(isAttribute = true, localName = "desc")
private String desc;
}
}
// 关联 "emoji" 元素的属性 "attachedtext",用于存储与表情符号相关联的附加文本信息,例如表情的说明文字、提示语等,

@ -5,219 +5,247 @@ import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlText;
import lombok.Data;
import java.util.List;
/**
* TimelineObjectBO
* TimelineObjectBOBOBusiness ObjectJavaXML线
* JacksonXMLJava便线xcs202401031747
*
* @author xcs
* @date 20240103 1747
**/
@Data
// 使用Lombok的 @Data 注解会自动为类生成常用的方法如Getter、Setter、toString、equals和hashCode等方法
// 这样在其他代码中就可以方便地获取和设置类中的属性值,以及进行对象的比较、打印等操作,减少了手动编写这些常规方法的代码量。
@JsonIgnoreProperties(ignoreUnknown = true)
// 这个注解用于告诉Jackson一个常用的JSON处理库在这里也用于处理XML与Java对象的转换在进行XML序列化和反序列化时
// 忽略那些在XML数据中存在但在Java对象中没有对应属性的字段避免因未知字段而导致的反序列化错误增强程序处理不同来源XML数据的兼容性和容错性。
@JacksonXmlRootElement(localName = "TimelineObject")
// 该注解用于指定在将Java对象转换为XML格式时整个XML文档的根元素名称为 "TimelineObject"以此确定生成的XML结构的顶层元素名称
// 便于符合特定的XML数据格式要求从而与外部系统可能是微信相关的服务端等进行基于XML的数据交互。
public class TimelineObjectBO {
@JacksonXmlProperty(localName = "id")
private String id;
// 使用 @JacksonXmlProperty 注解来指定该属性在XML格式中对应的元素名称为 "id"表示在XML序列化和反序列化时
// 这个属性与名为 "id" 的XML元素相关联通常用于存储时间线对象的唯一标识信息比如每条时间线记录的编号等便于区分不同的时间线记录。
@JacksonXmlProperty(localName = "username")
private String username;
// 同样通过 @JacksonXmlProperty 注解将该属性与XML中的 "username" 元素相对应,用于存储与时间线相关的用户名信息,
// 例如发布这条时间线内容的用户名称,可用于追溯信息来源等操作。
@JacksonXmlProperty(localName = "createTime")
private Long createTime;
// 对应XML中的 "createTime" 元素,用于存储时间线对象创建的时间戳信息,一般以毫秒等时间单位表示,方便按时间顺序对时间线记录进行排序、查询等操作。
@JacksonXmlProperty(localName = "contentDesc")
private String contentDesc;
// 关联 "contentDesc" 元素,用于存储对时间线内容的描述信息,比如简单介绍这条时间线记录所代表的事件、消息等内容,便于用户快速了解其大致含义。
@JacksonXmlProperty(localName = "contentDescShowType")
private String contentDescShowType;
// 对应 "contentDescShowType" 元素,可能用于表示内容描述信息的展示类型,例如是文本形式展示、以特定格式的卡片展示等不同展示方式,
// 具体取决于业务中对时间线内容展示的设计要求。
@JacksonXmlProperty(localName = "contentDescScene")
private String contentDescScene;
// 关联 "contentDescScene" 元素,可能表示内容描述信息所处的场景信息,比如是在朋友圈场景、公众号推送场景等不同业务场景下的描述情况,
// 有助于根据不同场景对时间线内容进行针对性处理和展示。
@JacksonXmlProperty(localName = "private")
private String asPrivate;
// 对应 "private" 元素,这里属性名使用 "asPrivate" 可能是为了避免与Java关键字冲突用于表示时间线内容是否为私有属性
// 例如是否仅特定用户可见等隐私相关设置,方便进行权限控制和隐私管理。
@JacksonXmlProperty(localName = "sightFolded")
private String sightFolded;
// 关联 "sightFolded" 元素,可能表示时间线内容在展示时是否被折叠的状态信息,比如在列表展示时某些内容可以折叠起来,用户点击展开查看详细,
// 用于控制时间线内容的展示效果和用户交互方式。
@JacksonXmlProperty(localName = "showFlag")
private String showFlag;
// 对应 "showFlag" 元素,用于表示时间线内容的展示标识信息,可能通过不同的值来控制是否展示、以何种方式展示等情况,例如是否置顶展示等设置。
@JacksonXmlProperty(localName = "appInfo")
private AppInfo appInfo;
// 使用 @JacksonXmlProperty 注解将该属性与 "appInfo" 元素相关联AppInfo是一个内部静态类用于进一步封装与应用相关的详细信息
// 比如应用的版本、名称等,可能涉及到时间线内容所关联的应用情况,例如是通过哪个微信小程序或者公众号应用产生的时间线记录等。
@JacksonXmlProperty(localName = "sourceUserName")
private String sourceUserName;
// 对应 "sourceUserName" 元素,用于存储时间线内容的来源用户名称信息,和前面的 "username" 可能有所不同,
// 这里更强调最初产生这条时间线内容的源头用户,例如是转发内容时原作者的用户名等情况。
@JacksonXmlProperty(localName = "sourceNickName")
private String sourceNickName;
// 关联 "sourceNickName" 元素,用于存储来源用户的昵称信息,以更友好、易读的方式展示来源用户,便于用户识别和区分不同来源的时间线内容。
@JacksonXmlProperty(localName = "statisticsData")
private String statisticsData;
// 对应 "statisticsData" 元素,可能用于存储与时间线内容相关的统计数据信息,比如阅读量、点赞数、评论数等统计指标,方便进行数据分析和展示。
@JacksonXmlProperty(localName = "statExtStr")
private String statExtStr;
// 关联 "statExtStr" 元素,可能是用于存储扩展的统计相关字符串信息,比如额外的统计维度、细分的数据等,进一步丰富统计相关的数据内容。
@JacksonXmlProperty(localName = "ContentObject")
private ContentObject contentObject;
// 使用 @JacksonXmlProperty 注解将该属性与 "ContentObject" 元素相关联ContentObject是一个内部静态类
// 用于承载时间线内容主体相关的详细信息,例如内容的样式、包含的媒体资源等情况,是时间线内容核心数据的封装。
@JacksonXmlProperty(localName = "publicUserName")
private String publicUserName;
// 对应 "publicUserName" 元素,可能用于存储与时间线内容公开相关的用户名称信息,例如是负责将内容设置为公开状态的管理员用户名等情况,
// 具体含义取决于业务中对公开属性和用户关联的设计。
@JacksonXmlProperty(localName = "location")
private Location location;
// 关联 "location" 元素Location是一个内部静态类用于存储时间线内容相关的地理位置信息比如发布内容时所在的地点信息
// 方便进行基于位置的展示、搜索等功能实现。
@JacksonXmlProperty(localName = "streamvideo")
private StreamVideo streamVideo;
// 使用 @JacksonXmlProperty 注解将该属性与 "streamvideo" 元素相关联StreamVideo是一个内部静态类
// 用于封装与流媒体视频(如视频动态等)相关的信息,比如视频的链接地址、缩略图地址等,适用于时间线中包含视频内容的情况。
/**
* AppInfo
* AppInfo "appInfo" XML
* 线
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppInfo {
@JacksonXmlProperty(localName = "id")
private String id;
// 对应 "appInfo" 元素下的 "id" 子元素,用于存储应用的唯一标识信息,方便在系统中准确识别和区分不同的应用,例如应用的编号等。
@JacksonXmlProperty(localName = "version")
private String version;
// 关联 "appInfo" 元素下的 "version" 子元素,用于存储应用的版本信息,便于判断应用的新旧程度以及是否需要更新等操作,确保功能的兼容性。
@JacksonXmlProperty(localName = "appName")
private String appName;
// 对应 "appInfo" 元素下的 "appName" 子元素,用于存储应用的名称,以明确该应用的标识,方便用户识别和与其他应用进行区分。
@JacksonXmlProperty(localName = "installUrl")
private String installUrl;
// 关联 "appInfo" 元素下的 "installUrl" 子元素,用于存储应用的安装链接地址,在需要引导用户安装相关应用时,可以提供该链接方便用户操作。
@JacksonXmlProperty(localName = "fromUrl")
private String fromUrl;
// 对应 "appInfo" 元素下的 "fromUrl" 子元素,可能表示应用来源的链接地址,例如是从哪个官方网站、应用商店等渠道获取该应用的相关信息,
// 用于追溯应用的来源和合法性等情况。
@JacksonXmlProperty(localName = "isForceUpdate")
private String isForceUpdate;
// 关联 "appInfo" 元素下的 "isForceUpdate" 子元素,用于表示是否强制用户更新应用的标识信息,比如设置为 "true" 则提示用户必须更新应用才能继续使用某些功能等。
@JacksonXmlProperty(localName = "isHidden")
private String isHidden;
// 对应 "appInfo" 元素下的 "isHidden" 子元素,用于表示应用是否被隐藏的状态信息,例如在某些界面展示中可以根据这个属性决定是否显示该应用相关内容。
}
/**
* ContentObject
* ContentObject "ContentObject" XML线
* 线
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ContentObject {
@JacksonXmlProperty(localName = "contentStyle")
private Integer contentStyle;
// 对应 "ContentObject" 元素下的 "contentStyle" 子元素,用于存储时间线内容的样式相关信息,例如是以文本、图片、视频等何种形式展示的样式编号,
// 方便根据不同样式进行相应的展示处理和样式调整。
@JacksonXmlProperty(localName = "description")
private String description;
// 关联 "ContentObject" 元素下的 "description" 子元素,用于存储时间线内容的详细描述信息,进一步补充和细化对内容的介绍,
// 比前面的 "contentDesc" 可能更详细全面,便于用户深入了解时间线所代表的具体内容。
@JacksonXmlProperty(localName = "title")
private String title;
// 对应 "ContentObject" 元素下的 "title" 子元素,用于存储时间线内容的标题信息,以简洁明了的方式概括内容主题,便于用户快速识别和定位感兴趣的内容。
@JacksonXmlProperty(localName = "contentUrl")
private String contentUrl;
// 关联 "ContentObject" 元素下的 "contentUrl" 子元素,用于存储时间线内容对应的链接地址,例如点击标题可以跳转到的详细内容页面的网址等,
// 方便用户查看完整的时间线相关信息。
@JacksonXmlProperty(localName = "mediaList")
private List<Media> mediaList;
// 使用 @JacksonXmlProperty 注解将该属性与 "mediaList" 子元素相关联MediaList是一个List类型其中元素为Media类型的内部静态类
// 用于存储时间线内容包含的多个媒体资源相关信息,比如图片、视频等媒体文件的详细属性,方便处理和展示时间线中的多媒体内容。
/**
* Media
* Media "mediaList"
*
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Media {
@JacksonXmlProperty(localName = "id")
private String id;
// 对应 "media" 元素下的 "id" 子元素用于存储媒体资源的唯一标识信息便于在系统中区分不同的媒体文件例如图片的编号、视频的ID等。
@JacksonXmlProperty(localName = "type")
private String type;
// 关联 "media" 元素下的 "type" 子元素,用于表示媒体资源的类型信息,例如 "image"(图片)、"video"(视频)、"audio"(音频)等不同类型的标识,
// 方便根据类型进行相应的处理和展示逻辑。
@JacksonXmlProperty(localName = "title")
private String title;
// 对应 "media" 元素下的 "title" 子元素,用于存储媒体资源的标题信息,类似于内容标题,以简洁的方式概括媒体所表达的主题内容,便于用户识别。
@JacksonXmlProperty(localName = "description")
private String description;
// 关联 "media" 元素下的 "description" 子元素,用于存储媒体资源的详细描述信息,进一步介绍媒体的内容、特点等情况,帮助用户更好地了解。
@JacksonXmlProperty(localName = "private")
private String asPrivate;
// 对应 "media" 元素下的 "private" 子元素同样是为了避免与Java关键字冲突用于表示媒体资源是否为私有属性涉及隐私和访问权限控制等情况。
@JacksonXmlProperty(localName = "userData")
private String userData;
// 关联 "media" 元素下的 "userData" 子元素,用于存储与媒体资源相关的用户自定义数据信息,例如用户添加的备注、标签等内容,方便个性化管理。
@JacksonXmlProperty(localName = "subType")
private String subType;
// 对应 "media" 元素下的 "subType" 子元素用于表示媒体资源的子类型信息比如视频类型下可能进一步细分的格式类型如MP4、AVI等
// 更细致地描述媒体资源的具体特性,便于针对性处理。
@JacksonXmlProperty(localName = "videoSize")
private String videoSize;
// 关联 "media" 元素下的 "videoSize" 子元素,用于存储视频媒体资源的大小信息,一般以字节等单位表示,方便进行资源管理和展示相关提示(如加载提示等)。
@JacksonXmlProperty(localName = "url")
private Url url;
// 使用 @JacksonXmlProperty 注解将该属性与 "url" 子元素相关联Url是一个内部静态类用于封装媒体资源对应的链接相关详细信息
// 比如链接的类型、MD5校验和以及实际的链接地址等确保正确获取和使用媒体资源。
@JacksonXmlProperty(localName = "thumb")
private Thumb thumb;
// 关联 "media" 元素下的 "thumb" 子元素Thumb是一个内部静态类用于存储媒体资源缩略图相关的详细信息例如缩略图的类型和实际的缩略图地址
// 方便在展示媒体列表等场景中先展示缩略图,提高用户体验和界面加载速度。
@JacksonXmlProperty(localName = "size")
private String size;
// 对应 "media" 元素下的 "size" 子元素,用于存储媒体资源的大小信息,和前面的 "videoSize" 类似,但可能更通用,适用于各种类型媒体的大小描述。
}
/**
* Url "media" "url"
* MD5
*
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Url {
@JacksonXmlProperty(isAttribute = true)
private int type;
@JacksonXmlProperty(isAttribute = true)
private String md5;
@JacksonXmlProperty(isAttribute = true)
private String videomd5;
@JacksonXmlText
private String value;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Thumb {
@JacksonXmlProperty(isAttribute = true)
private int type;
@JacksonXmlText
private String value;
}
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Location {
@JacksonXmlProperty(isAttribute = true, localName = "poiClassifyId")
private String poiClassifyId;
@JacksonXmlProperty(isAttribute = true, localName = "poiName")
private String poiName;
@JacksonXmlProperty(isAttribute = true, localName = "poiAddress")
private String poiAddress;
@JacksonXmlProperty(isAttribute = true, localName = "poiClassifyType")
private Integer poiClassifyType;
@JacksonXmlProperty(isAttribute = true, localName = "city")
private String city;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class StreamVideo {
@JacksonXmlProperty(localName = "streamvideourl")
private String streamVideoUrl;
@JacksonXmlProperty(localName = "streamvideothumburl")
private String streamVideoThumbUrl;
@JacksonXmlProperty(localName = "streamvideoweburl")
private String streamVideoWebUrl;
}
}
// 使用 @JacksonXmlProperty 注解并设置 isAttribute = true表示这个属性对应的是XML元素的属性而不是子元素
// 对应 "url" 元素的属性 "type",用于存储链接的类型信息
Loading…
Cancel
Save