Compare commits

...

100 Commits

Author SHA1 Message Date
pqmnl64u8 86a49b711c 11
1 year ago
GYL 2252569601 1
1 year ago
pxunm4f7q 89fa6177b7 ljt
1 year ago
pxfml5kje 984caf5bd7 pull
1 year ago
GYL 0831cdd235 1
1 year ago
GYL f502650d19 1
1 year ago
GYL d24b7a84c3 1
1 year ago
mb7o3ja5v 9f86ef6fe3 acc
1 year ago
GYL 2d36f956b8 1
1 year ago
GYL 4ae85853f1 1
1 year ago
GYL 2ad1f5f490 1
1 year ago
GYL a282eb5e45 1
1 year ago
mb7o3ja5v 4aebe4ca2b acc
1 year ago
mb7o3ja5v 8aef6c5434 accept pull
1 year ago
GYL 61bbc31ed0 1
1 year ago
GYL 16c9951a7d 1
1 year ago
GYL b21a40db1a 1
1 year ago
GYL 0ed9e16de2 1
1 year ago
GYL 2cad338d15 1
1 year ago
GYL 67ece6cb44 1
1 year ago
GYL b0133fb39e 1
1 year ago
GYL a611932af0 完成之前未结束的合并,解决所有合并冲突
1 year ago
GYL 7deb3dfa65 1
1 year ago
linlei 7750f3cc5b 兼容3.9.12.17版本
1 year ago
linlei 940d452cc1 兼容3.9.12.15版本
1 year ago
linlei 2df241940e 兼容3.9.11.25版本
2 years ago
linlei feb02a51c4 兼容3.9.11.23版本
2 years ago
linlei c34964b93d 认领HelloGitHub徽章
2 years ago
linlei a99c4ca234 优化获取微信目录问题
2 years ago
linlei a6eea5178d 优化读取key逻辑
2 years ago
linlei 0df5472e60 优化获取微信目录
2 years ago
linlei abae7e0d9d 1、优化启动脚本
2 years ago
linlei ee3c627392 优化readme
2 years ago
linlei 4aac478a26 优化readme
2 years ago
linlei 8b247018dc 优化readme
2 years ago
linlei f80881f73c 1、截图
2 years ago
linlei 0c5f6473f7 1、截图
2 years ago
linlei d97ebea704 1、优化readme
2 years ago
linlei a1ed324177 1、优化启动脚本
2 years ago
linlei 7acc9926e3 1、更新readme文件
2 years ago
linlei f43276473c 1、调整版本号
2 years ago
linlei 65f941bd4d 1、优化页面入口
2 years ago
linlei 8a65dda542 1、新增账号切换功能
2 years ago
linlei 54daa418d0 1、优化代码注释
2 years ago
linlei 9e41e473ed 1、支持微信多开
2 years ago
linlei 7c35aea944 1、支持微信多开
2 years ago
linlei 18f2cbea7f 1、删除无用代码
2 years ago
linlei e8526ae8be 1、新增找回好友功能
2 years ago
linlei e8fdf287d4 1、优化readme描述
2 years ago
linlei feccf21d2f 1、优化readme描述
2 years ago
linlei 92324744d8 1、优化readme描述
2 years ago
linlei f44ec57e8c 1、优化readme描述
2 years ago
linlei c8a4069885 1、处理标签表不存在问题
2 years ago
linlei 9946cf16e9 1、优化解密速度
2 years ago
linlei 96ff7eedce 1、跟新banner
2 years ago
linlei 8000b4c15c 更新二维码
2 years ago
linlei a2f4324946 更新二维码
2 years ago
linlei 33f7f7720d 优化图片展示
2 years ago
linlei 666b2d7255 优化图片展示
2 years ago
linlei 0cae17577b 支持微信3.9.10.19版本
2 years ago
linlei 4ac5088d0d 支持微信3.9.9.43版本
2 years ago
xuchengsheng f7cc1d6c48 朋友圈新增筛选功能
2 years ago
Lex e7f71d440f
Create LICENSE
2 years ago
xuchengsheng dd1eb550ab 1、修复前端分页条数问题
2 years ago
xuchengsheng 78124c087c README新增使用到的技术徽标
2 years ago
xuchengsheng f395e58605 1、打包优化conf
2 years ago
xuchengsheng 7e06189b23 图表获取数据时,显示加载中状态
2 years ago
xuchengsheng 35bcb5259c 获取微信信息时,显示加载中状态
2 years ago
xuchengsheng aa9e59e82a 优化获取key的方式
2 years ago
xuchengsheng 18c231b5b4 优化获取wxId获取方式
2 years ago
xuchengsheng 8a58430498 1、优化获取微信Id的获取方式
2 years ago
xuchengsheng 9444f3fcae 删除调试代码
2 years ago
xuchengsheng 749b793b6e 微信SQLite数据库文件解密实现
2 years ago
xuchengsheng bf867ef93d 微信SQLite数据库文件解密实现
2 years ago
xuchengsheng f69f7eb58e sqlite数据库文件加密前存储格式
2 years ago
xuchengsheng 449536ac85 优化排版
2 years ago
xuchengsheng 0585723f10 功能展示图片
2 years ago
xuchengsheng 8b4bcc84e0 功能展示图片
2 years ago
xuchengsheng f71eb435f5 功能展示
2 years ago
xuchengsheng cd344306ca 新增banner
2 years ago
xuchengsheng c778a59ffa 免责声明
2 years ago
xuchengsheng 3370df5b93 优化README排版
2 years ago
xuchengsheng 001a661ca7 使用限制
2 years ago
xuchengsheng b1c90db0a2 使用限制
2 years ago
xuchengsheng 56c3f6e00b 补充README(快速启动)
2 years ago
xuchengsheng 992f229822 补充README(快速启动)
2 years ago
xuchengsheng 7712f88dfb 补充README(快速启动)
2 years ago
xuchengsheng e4e7b14372 补充README(快速启动)
2 years ago
xuchengsheng b13a4334a4 补充README(快速启动)
2 years ago
xuchengsheng 9fc60926f8 1、优化打包
2 years ago
xuchengsheng ee71168a79 兼容微信3.9.9.35版本
2 years ago
xuchengsheng 4639eb9d86 1、提交README文件
2 years ago
xuchengsheng 5cb8612f06 1、提交README文件
2 years ago
xuchengsheng dc75a618c1 1、提交README文件
2 years ago
xuchengsheng 32098b552c 1、提交README文件
2 years ago
xuchengsheng 2c6eca0e94 1、修复聊天记录排序问题
2 years ago
xuchengsheng e4a78b5324 新增排除文件
2 years ago
xuchengsheng c6d0fb46c3 删除无用配置
2 years ago
xuchengsheng fb64277fcd 生成打包模块
2 years ago
xuchengsheng 6af27e834d 初始化项目
2 years ago

54
.gitignore vendored

@ -0,0 +1,54 @@
target/
!**/src/main/**/target/
!**/src/test/**/target/
/db/
/logs/
/img/
/export/
/config/
/data/
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
# dependencies
**/node_modules
# roadhog-api-doc ignore
/src/utils/request-temp.js
_roadhog-api-doc
# production
/dist
# misc
.DS_Store
npm-debug.log*
yarn-error.log
/coverage
yarn.lock
package-lock.json
*bak
.vscode
# visual studio code
.history
*.log
functions/*
.temp/**
# umi
.umi
.umi-production
.umi-test
# screenshot
screenshot
.firebase
.eslintcache
build

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2024 xuchengsheng
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.。

@ -1,2 +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>
=======
# wx-dump-4j # wx-dump-4j
>>>>>>> c4b6449ae2686772c4ab318ba75389b6a4df21ea

@ -0,0 +1,211 @@
## 微信SQLite数据库文件解密实现
- [微信SQLite数据库文件解密实现](#微信sqlite数据库文件解密实现)
- [SQLite页结构描述](#sqlite页结构描述)
- [SQLite页结构图](#sqlite页结构图)
- [解密实现过程](#解密实现过程)
- [源码地址](#源码地址)
#### SQLite页结构描述
微信`SQLite`数据库文件以每个页面4096字节的大小进行划分这些页面组成了文件的基本结构。每个页面内部包含了关键的元素包括盐值、加密后的内容、初始化向量`IV`)、哈希值(`hashMac`),以及用于保留的空字节。这个结构在整个数据库文件中起到了关键的组织和安全保障的作用。
首个页面是独特的,它包含了生成加密密钥所需的盐值、加密后的内容、初始化向量(`IV`)、哈希值(`hashMac`),以及用于保留的空字节。盐值在加密密钥生成过程中发挥着关键的作用,而哈希值则用于验证密钥的正确性,提供了额外的安全层。空字节的存在为未来可能的拓展或变化预留了空间。
随后的页面结构与首个页面相似,仍然包括了加密后的内容、初始化向量(`IV`)以及用于保留的空字节。这种一致性的结构确保了整个数据库文件的统一性和安全性,使得每个页面都能够独立存储经过加密的数据块,并在需要时通过初始化向量进行解密。这种巧妙的设计使得`SQLite`数据库文件在存储和保护数据方面表现出色。
#### SQLite页结构图
~~~mermaid
graph TD
A[SQLite Database File]
A -->|第一页| C1[4096字节]
C1 -->|盐值| C1A[16字节]
C1 -->|内容| C1C[4032字节]
C1 -->|IV| C1IV[16字节]
C1 -->|hashMac| C1H[20字节]
C1 -->|空字节| C1R[12字节]
A -->|第二页| C2[4096字节]
C2 -->|内容| C2C[4048字节]
C2 -->|IV| C2IV[16字节]
C2 -->|空字节| C2R[32字节]
A -->|第N页| C3[4096字节]
C3 -->|内容| C3C[4048字节]
C3 -->|IV| C3IV[16字节]
C3 -->|空字节| C3R[32字节]
~~~
#### 解密实现过程
`DecryptServiceImpl`类是一个解密服务的实现,专门用于解密`SQLite`数据库文件。首先,它定义了`SQLite`数据库文件的文件头、加密算法(`HmacSHA1`、页面大小4096字节、迭代次数64000次以及密钥长度32字节。主要功能由`wechatDecrypt`方法实现,该方法接收密码和解密业务对象作为参数。
在`wechatDecrypt`方法内部,首先通过`FileInputStream`读取数据库文件内容提取文件头、盐值、第一页信息包括内容、IV、`hashMac`和保留字段。随后,利用`PBKDF2`算法和用户提供的密码生成密钥,并根据提取的盐值和`hashMac`验证密钥的正确性。
如果密钥验证成功,便创建输出文件,写入`SQLite`文件头,并对第一页进行解密,写入解密后的内容和保留字段。接着,循环处理后续数据块,逐一解密并写入到输出文件。整个过程保证了对`SQLite`数据库文件的完整性和保密性的维护。
在解密过程中,`doDecrypt`方法使用`AES/CBC/NoPadding`模式对数据进行解密。为了处理大文件,`splitDataPages`方法将文件内容分割成多个页面进行逐一处理。
最后,通过`checkKey`方法检查密钥的有效性,确保解密过程中密钥的正确性。该类结合了多重密码学技术,保障了对`SQLite`数据库文件的高效且安全的解密操作。
```java
public class DecryptServiceImpl implements DecryptService {
/**
* SQLite数据库的文件头
*/
private static final String SQLITE_FILE_HEADER = "SQLite format 3\u0000";
/**
* 算法
*/
private static final String ALGORITHM = "HmacSHA1";
/**
* 一页的大小
*/
private static final int DEFAULT_PAGESIZE = 4096;
/**
* 迭代次数
*/
private static final int ITERATIONS = 64000;
/**
* Key长度
*/
private static final int HASH_KEY_LENGTH = 32;
@Override
public void wechatDecrypt(String password, DecryptBO decryptBO) {
// 创建File文件
File file = new File(decryptBO.getInput());
try (FileInputStream fis = new FileInputStream(file)) {
// 文件大小
byte[] fileContent = new byte[(int) file.length()];
// 读取内容
fis.read(fileContent);
// 提取盐值
byte[] salt = Arrays.copyOfRange(fileContent, 0, 16);
// 提取第一页
byte[] firstPage = Arrays.copyOfRange(fileContent, 16, DEFAULT_PAGESIZE);
// 提取第一页的内容与IV
byte[] firstPageBodyAndIv = Arrays.copyOfRange(firstPage, 0, firstPage.length - 32);
// 提取第一页的内容
byte[] firstPageBody = Arrays.copyOfRange(firstPage, 0, firstPage.length - 48);
// 提取第一页IV
byte[] firstPageIv = Arrays.copyOfRange(firstPage, firstPage.length - 48, firstPage.length - 32);
// 提取第一页的hashMac
byte[] firstPageHashMac = Arrays.copyOfRange(firstPage, firstPage.length - 32, firstPage.length - 12);
// 提取第一页的保留字段
byte[] firstPageReservedSegment = Arrays.copyOfRange(firstPage, firstPage.length - 48, firstPage.length);
// 生成key
byte[] key = Pbkdf2HmacUtil.pbkdf2Hmac(ALGORITHM, HexUtil.decodeHex(password), salt, ITERATIONS, HASH_KEY_LENGTH);
byte[] macSalt = new byte[salt.length];
for (int i = 0; i < salt.length; i++) {
macSalt[i] = (byte) (salt[i] ^ 58);
}
// 秘钥匹配成功
if (checkKey(key, macSalt, firstPageHashMac, firstPageBodyAndIv)) {
File outputFile = new File(decryptBO.getOutput());
File parentDir = outputFile.getParentFile();
// 检查父目录是否存在,如果不存在,则创建
if (!parentDir.exists()) {
parentDir.mkdirs();
}
// 解密并写入新文件
try (FileOutputStream deFile = new FileOutputStream(outputFile)) {
deFile.write(SQLITE_FILE_HEADER.getBytes());
deFile.write(doDecrypt(key, firstPageIv, firstPageBody));
deFile.write(firstPageReservedSegment);
// 解密后续数据块
for (byte[] page : splitDataPages(fileContent)) {
byte[] iv = Arrays.copyOfRange(page, page.length - 48, page.length - 32);
byte[] body = Arrays.copyOfRange(page, 0, page.length - 48);
byte[] reservedSegment = Arrays.copyOfRange(page, page.length - 48, page.length);
deFile.write(doDecrypt(key, iv, body));
deFile.write(reservedSegment);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 使用AES/CBC/NoPadding模式进行解密
*
* @param key 密钥
* @param iv 初始化向量
* @param input 待解密的数据
* @return 解密后的数据
* @throws GeneralSecurityException 抛出异常
*/
private byte[] doDecrypt(byte[] key, byte[] iv, byte[] input) throws GeneralSecurityException {
Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);
return cipher.doFinal(input);
}
/**
* 将数据分割成多个页面
*
* @param fileContent 文件内容的字节数组
* @return 分割后的页面列表
*/
private List<byte[]> splitDataPages(byte[] fileContent) {
List<byte[]> pages = new ArrayList<>();
for (int i = DEFAULT_PAGESIZE; i < fileContent.length; i += DEFAULT_PAGESIZE) {
// 计算每个分割页面的结束位置
int end = Math.min(i + DEFAULT_PAGESIZE, fileContent.length);
byte[] slice = new byte[end - i];
// 将数据复制到新的页面中
System.arraycopy(fileContent, i, slice, 0, slice.length);
pages.add(slice);
}
return pages;
}
/**
* 检查密钥是否有效
*
* @param byteKey 密钥的字节数组
* @param macSalt MAC盐值
* @param hashMac 预期的MAC哈希值
* @param message 消息内容
* @return 如果密钥有效返回true否则返回false
* @throws Exception 抛出异常
*/
private boolean checkKey(byte[] byteKey, byte[] macSalt, byte[] hashMac, byte[] message) throws Exception {
// 使用PBKDF2算法生成MAC密钥
byte[] macKey = Pbkdf2HmacUtil.pbkdf2Hmac(ALGORITHM, byteKey, macSalt, 2, 32);
Mac mac = Mac.getInstance(ALGORITHM);
SecretKeySpec keySpec = new SecretKeySpec(macKey, ALGORITHM);
mac.init(keySpec);
// 更新MAC计算的消息内容
mac.update(message);
// 添加额外的数据到消息中
mac.update(new byte[]{1, 0, 0, 0});
// 比较计算出的MAC值和预期的MAC值是否相同
return Arrays.equals(hashMac, mac.doFinal());
}
}
```
#### 源码地址
+ https://github.com/xuchengsheng/wx-dump-4j
+ `com.xcs.wx.service.impl.DecryptServiceImpl`

@ -0,0 +1,29 @@
![](../image/screenshot/index1.png)
![](../image/screenshot/index2.png)
![](../image/screenshot/database.png)
![](../image/screenshot/chat1.png)
![](../image/screenshot/chat.png)
![](../image/screenshot/session.png)
![](../image/screenshot/chatroom.png)
![](../image/screenshot/export-chatroom.png)
![](../image/screenshot/chatroom-detail.png)
![](../image/screenshot/contact.png)
![](../image/screenshot/export-contact.png)
![](../image/screenshot/feeds.png)
![](../image/screenshot/feeds-pre-img.png)
![](../image/screenshot/excel-msg.png)
![](../image/screenshot/excel-contact.png)

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 365 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 258 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 207 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 MiB

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- Maven 项目对象模型POM的版本号通常固定为 4.0.0,表示遵循的 POM 规范版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 项目的groupId是项目在 Maven 仓库中的唯一标识,一般采用反向域名的格式,用于区分不同组织或公司下的项目 -->
<groupId>com.xcs.wx</groupId>
<!-- 项目的artifactId是项目在同一 groupId 下的唯一标识,相当于项目的名称,与 groupId 一起构成项目在 Maven 仓库中的坐标 -->
<artifactId>wx-dump-4j</artifactId>
<!-- 项目的打包类型,这里设置为 "pom",表示这是一个聚合项目或者父项目,本身不会生成可部署的构件(如 jar 包、war 包等),
而是用于管理子项目以及统一配置依赖等信息 -->
<packaging>pom</packaging>
<!-- 项目的版本号,这里使用了一个属性(${revision})来定义,后续可以在 properties 元素中对该属性进行赋值 -->
<version>${revision}</version>
<!-- 定义项目包含的子模块,这些子模块会作为当前项目的一部分被统一管理,例如在构建时可以一起构建等 -->
<modules>
<!-- 第一个子模块,模块名称为 "wx-dump-admin"Maven 会根据配置去查找对应的子项目目录并进行相关构建操作 -->
<module>wx-dump-admin</module>
<!-- 第二个子模块,模块名称为 "wx-dump-dist",同样会被纳入当前项目的管理范畴 -->
<module>wx-dump-dist</module>
</modules>
<!-- 定义项目中使用的各种属性,这些属性可以在项目的其他地方通过 ${属性名} 的方式进行引用 -->
<properties>
<!-- 指定项目编译时使用的 Java 版本,这里设置源文件和目标文件的编译版本都为 11 -->
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<!-- 指定 Maven Assembly 插件的版本号 -->
<maven-assembly-plugin.version>3.5.0</maven-assembly-plugin.version>
<!-- 指定项目构建时源文件的编码格式为 UTF-8 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 对之前版本号中使用的 ${revision} 属性进行赋值,这里设置项目的版本为 1.1.0 -->
<revision>1.1.0</revision>
</properties>
<!-- 依赖管理部分,用于统一管理项目及其子项目所依赖的各种外部库的版本等信息,
子项目可以继承这里定义的依赖配置,但不一定会自动引入这些依赖(具体是否引入要看子项目的依赖配置) -->
<dependencyManagement>
<dependencies>
<!-- 引入 Spring Boot 的 Web 启动器依赖,指定版本为 2.7.15,该依赖包含构建 Web 应用所需的一系列基础依赖,
方便快速搭建基于 Spring Boot 的 Web 项目 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.15</version>
</dependency>
<!-- 引入 Spring Boot 的 Thymeleaf 启动器依赖,版本为 2.7.15,用于在 Spring Boot 项目中集成 Thymeleaf 模板引擎,
实现页面视图的渲染 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.7.15</version>
</dependency>
<!-- 引入 SQLite 的 JDBC 驱动依赖,版本是 3.34.0,用于在项目中连接和操作 SQLite 数据库 -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.34.0</version>
</dependency>
<!-- 引入 Lombok 依赖,版本为 1.18.20Lombok 可以通过注解方式简化 Java 代码,自动生成诸如 getter、setter、构造函数等方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<!-- 引入 MyBatis Plus 的 Spring Boot 启动器依赖,版本 3.5.4.1MyBatis Plus 是 MyBatis 的增强工具,
提供通用的 CRUD 操作等便捷功能,便于数据库访问层开发 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
<!-- 引入动态数据源的 Spring Boot 启动器依赖,版本 4.2.0,用于实现项目中动态切换数据源的功能 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<!-- 引入 Druid 的 Spring Boot 启动器依赖,版本 1.2.20Druid 是性能优秀的数据库连接池,还具备监控等功能 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.20</version>
</dependency>
<!-- 引入 MapStruct 的核心依赖,版本 1.4.2.FinalMapStruct 用于生成类型安全、高性能且遵循 Java 规范的 bean 映射代码 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- 引入 MapStruct 的处理器依赖,版本 1.4.2.Final用于在编译阶段处理 MapStruct 注解,生成相应的映射代码 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
<!-- 引入 Hutool 工具集依赖,版本 5.8.16Hutool 提供大量实用工具类,涵盖字符串处理、文件操作、日期时间处理等多方面 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<!-- 引入 JNAJava Native Access核心依赖版本 5.8.0,它允许 Java 程序调用本地代码库,便于与底层系统交互 -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version>
</dependency>
<!-- 引入 JNA 平台相关依赖,版本 5.8.0,提供特定平台下的扩展功能 -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.8.0</version>
</dependency>
<!-- 引入 Google 的 Protocol Buffersprotobuf核心依赖版本 3.25.1protobuf 用于数据序列化和通信协议等场景 -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.1</version>
</dependency>
<!-- 引入 Google 的 Protocol Buffersprotobuf工具类依赖版本 3.25.1,提供方便操作 protobuf 数据的实用方法 -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.25.1</version>
</dependency>
<!-- 引入 gRPC 相关的所有依赖,版本 1.11.0gRPC 是高性能 RPC 框架,常用于微服务间通信 -->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.11.0</version>
</dependency>
<!-- 引入 EasyExcel 依赖,版本 3.3.3,用于方便地操作 Excel 文件 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<!-- 引入 Commons Compress 依赖,版本 1.19,用于操作各种压缩格式文件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>
<!-- 引入 Jackson 的 XML 数据格式模块依赖,版本 2.13.5,用于支持对象与 XML 数据的序列化和反序列化 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.5</version>
</dependency>
<!-- 引入 Commons Lang3 依赖,版本 3.12.0,提供大量对 Java 基本数据类型、字符串等操作的实用工具方法 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!-- 引入名为 "wx-dump-admin" 的项目作为依赖,版本使用之前定义的 ${revision} 属性值,
通常表示当前项目与该子项目之间存在某种关联,比如依赖其提供的功能等 -->
<dependency>
<groupId>com.xcs.wx</groupId>
<artifactId>wx-dump-admin</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-- 定义该项目的父项目相关信息,通过这些配置,当前项目可以继承父项目的一些配置和依赖等内容 -->
<parent>
<artifactId>wx-dump-4j</artifactId>
<groupId>com.xcs.wx</groupId>
<version>${revision}</version>
<relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<!-- 当前项目的构件标识符,也就是项目生成的 jar 包等构件的名称 -->
<artifactId>wx-dump-admin</artifactId>
<!-- 项目的打包方式,这里设置为 "jar",表示最终会打包成一个 Java 可执行的 jar 文件 -->
<packaging>jar</packaging>
<!-- 项目依赖配置部分,在这里列出了项目运行所需要依赖的其他库 -->
<dependencies>
<!-- 引入 Spring Boot 的 Web 启动器依赖,它包含了构建 Web 应用所需的一系列基础依赖,
例如 Spring MVC 等,方便快速搭建基于 Spring Boot 的 Web 项目 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 引入 Spring Boot 的 Thymeleaf 启动器依赖,用于在 Spring Boot 项目中集成 Thymeleaf 模板引擎,
方便进行页面视图的渲染 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- 引入 SQLite 的 JDBC 驱动依赖,用于在项目中连接和操作 SQLite 数据库 -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
</dependency>
<!-- 引入 Lombok 依赖Lombok 可以通过注解的方式帮助简化 Java 代码,例如自动生成 getter、setter、构造函数等方法 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 引入 MyBatis Plus 的 Spring Boot 启动器依赖MyBatis Plus 是 MyBatis 的增强工具,
提供了很多便捷的功能,如通用的 CRUD 操作等,方便数据库访问层的开发 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<!-- 引入动态数据源的 Spring Boot 启动器依赖,用于在项目中实现动态切换数据源的功能 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
<!-- 引入 Druid 的 Spring Boot 启动器依赖Druid 是一款性能优秀的数据库连接池,同时还具备监控等功能 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<!-- 引入 MapStruct 的核心依赖MapStruct 是一个用于生成类型安全、高性能且遵循 Java 规范的 bean 映射代码的注解处理器 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<!-- 引入 MapStruct 的处理器依赖,用于在编译阶段处理 MapStruct 的注解,生成相应的映射代码 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<!-- 引入 Hutool 工具集依赖Hutool 提供了大量实用的工具类,涵盖了字符串处理、文件操作、日期时间处理等多个方面,方便日常开发 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- 引入 JNAJava Native Access核心依赖它允许 Java 程序调用本地代码库,方便与底层系统进行交互 -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
</dependency>
<!-- 引入 JNA 平台相关依赖,提供了特定平台下的一些扩展功能 -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</dependency>
<!-- 引入 Google 的 Protocol Buffersprotobuf核心依赖protobuf 是一种轻便高效的结构化数据存储格式,
常用于数据序列化和通信协议等场景 -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
<!-- 引入 Google 的 Protocol Buffersprotobuf工具类依赖提供了一些方便操作 protobuf 数据的实用方法 -->
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
</dependency>
<!-- 引入 gRPC 相关的所有依赖gRPC 是一个高性能、开源和通用的 RPC 框架,基于 HTTP/2 协议实现,
常用于微服务之间的通信 -->
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
</dependency>
<!-- 引入 EasyExcel 依赖EasyExcel 是一个方便操作 Excel 文件的 Java 库,支持读写 Excel 等功能 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<!-- 引入 Commons Compress 依赖,它提供了对各种压缩格式文件(如 ZIP、GZIP 等)进行操作的功能 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</dependency>
<!-- 引入 Jackson 的 XML 数据格式模块依赖,用于在项目中支持将对象序列化为 XML 格式以及反序列化 XML 数据为对象 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<!-- 引入 Commons Lang3 依赖,它提供了大量对 Java 基本数据类型、字符串、数组等进行操作的实用工具方法 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<!-- 项目构建配置部分,主要配置项目构建过程中使用的插件等相关信息 -->
<build>
<!-- 定义项目最终生成的构件(如 jar 包等)的名称 -->
<finalName>wx-dump-admin</finalName>
<plugins>
<!-- 配置 Maven 编译器插件,用于指定项目编译时使用的 Java 版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,79 @@
package com.xcs.wx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Date;
/**
* `WxDumpApplication` Spring Boot
* `@SpringBootApplication` Spring Boot AOP 便使
* `main` 访便
*
* @author xcs
* @date 20231221 1702
**/
@SpringBootApplication
// 开启 Spring 框架中的事务管理功能,允许在应用中使用注解(如 `@Transactional`)来方便地管理数据库事务,确保数据操作的一致性和完整性,例如在涉及多个数据库操作的业务方法中,通过该注解可以控制这些操作要么全部成功提交,要么全部回滚。
@EnableTransactionManagement
public class WxDumpApplication {
public static void main(String[] args) throws UnknownHostException {
// 记录应用启动的开始时间,通过调用 `System.currentTimeMillis` 方法获取当前系统时间的毫秒数,作为应用启动的时间戳记录下来,
// 后续可以通过与应用启动完成后的时间戳做差值运算,得到应用启动所花费的时间,用于向用户展示启动耗时情况。
long startTime = System.currentTimeMillis();
// 启动 Spring Boot 应用,调用 `SpringApplication.run` 方法,传入当前启动类(`WxDumpApplication.class`)以及启动参数(`args`)作为参数,
// 该方法会执行一系列的 Spring Boot 初始化操作,包括加载配置文件、创建 Spring 应用上下文、扫描并实例化各种组件(如 `Controller`、`Service`、`Repository` 等),最终返回一个可配置的应用上下文对象 `context`,用于后续获取应用的运行时配置等信息。
ConfigurableApplicationContext context = SpringApplication.run(WxDumpApplication.class, args);
// 记录应用启动的结束时间,同样通过调用 `System.currentTimeMillis` 方法获取当前系统时间的毫秒数,作为应用启动完成的时间戳,用于后续计算启动耗时。
long endTime = System.currentTimeMillis();
// 获取应用运行的端口号,通过应用上下文对象(`context`)的 `getEnvironment` 方法获取应用的运行环境配置对象,
// 再调用其 `getProperty` 方法尝试获取名为 `"server.port"` 的配置属性值,如果不存在该属性,则使用默认值 `"8080"`
// 这个端口号是应用对外提供服务所监听的端口,后续用于构建应用的访问地址信息。
String port = context.getEnvironment().getProperty("server.port", "8080");
// 获取应用的上下文路径,通过应用上下文对象(`context`)的 `getEnvironment` 方法获取应用的运行环境配置对象,
// 再调用其 `getProperty` 方法尝试获取名为 `"server.servlet.context-path"` 的配置属性值,如果不存在该属性,则使用默认值 `""`(表示根路径),
// 上下文路径通常用于在应用部署到服务器时,作为应用的访问前缀,与端口号等信息一起构成完整的访问地址。
String contextPath = context.getEnvironment().getProperty("server.servlet.context-path", "");
// 获取本地主机的 IP 地址,通过调用 `InetAddress.getLocalHost` 方法获取本地主机的网络地址信息对象,再调用其 `getHostAddress` 方法获取对应的 IP 地址字符串,
// 这个 IP 地址用于构建应用在网络环境下可访问的地址,区别于本地回环地址(`localhost`),方便其他设备在同一网络中访问该应用。
String localHostAddress = InetAddress.getLocalHost().getHostAddress();
// 构建应用在本地访问的 URL 地址,按照 `http://localhost:<port><contextPath>` 的格式拼接字符串,其中 `<port>` 是前面获取到的端口号,`<contextPath>` 是获取到的应用上下文路径,
// 这个地址方便开发者在本地通过浏览器等方式访问正在运行的应用,用于本地的调试和测试等操作。
String localUrl = "http://localhost:" + port + contextPath;
// 构建应用在网络环境下访问的 URL 地址,按照 `http://<localHostAddress>:<port><contextPath>` 的格式拼接字符串,其中 `<localHostAddress>` 是前面获取到的本地主机 IP 地址,`<port>` 是端口号,`<contextPath>` 是应用上下文路径,
// 这个地址使得同一网络中的其他设备可以通过该地址访问到正在运行的应用,实现应用的网络访问功能。
String networkUrl = "http://" + localHostAddress + ":" + port + contextPath;
// 向控制台输出应用启动成功的提示信息以及启动耗时,通过 `System.out.println` 方法输出字符串 `"DONE successfully in "` 加上启动耗时(`endTime - startTime` 的差值,单位为毫秒)再加上 `"ms"`
// 告知用户应用已经成功启动以及花费了多长时间完成启动过程,方便用户了解应用启动的效率情况。
System.out.println("DONE successfully in " + (endTime - startTime) + "ms");
// 向控制台输出当前时间信息,通过创建一个 `Date` 类的实例(表示当前时间),并将其作为参数传递给 `System.out.println` 方法,输出当前的日期和时间信息,
// 让用户知晓应用启动完成时的具体时间点,方便记录和参考。
System.out.println("Time: " + new Date());
// 输出一个用于装饰性的 ASCII 字符边框的上边框,通过 `System.out.println` 方法输出特定格式的字符串,形成一个可视化的边框效果,用于对后续输出的应用访问地址等重要信息进行视觉上的区分和美化,增强控制台输出信息的可读性。
System.out.println("╔════════════════════════════════════════════════════╗");
// 输出应用访问地址相关的提示信息,通过 `System.out.println` 方法输出字符串 `"║ App listening at: ║"`,告知用户接下来将展示应用可以被访问的地址信息,起到引导性的作用。
System.out.println("║ App listening at: ║");
// 输出应用在本地访问的地址信息,通过 `System.out.println` 方法输出字符串 `"║ > Local: "` 加上前面构建好的本地访问 URL 地址(`localUrl`)再加上空格进行对齐和美化,
// 向用户明确展示应用在本地可以通过什么地址进行访问,方便用户进行本地调试等操作。
System.out.println("║ > Local: " + localUrl + " ");
// 输出应用在网络环境下访问的地址信息,通过 `System.out.println` 方法输出字符串 `"║ > Network: "` 加上前面构建好的网络访问 URL 地址(`networkUrl`)再加上空格进行对齐和美化,
// 告知用户应用在网络中可以通过什么地址被其他设备访问,方便在多设备协同等场景下使用该应用。
System.out.println("║ > Network: " + networkUrl + " ");
// 输出一个空行,用于在地址信息和后续提示信息之间进行视觉上的分隔,通过 `System.out.println` 方法输出一个空字符串来实现,增强控制台输出信息的层次感和可读性。
System.out.println("║ ║");
// 输出一个引导性的提示信息,告知用户现在可以使用上面展示的地址在浏览器中打开应用,通过 `System.out.println` 方法输出相应的字符串内容,方便用户快速了解如何进一步操作使用应用。
System.out.println("║ Now you can open browser with the above addresses↑ ║");
// 输出一个用于装饰性的 ASCII 字符边框的下边框,通过 `System.out.println` 方法输出特定格式的字符串,与前面的上边框对应,形成一个完整的边框效果,对整个应用启动相关信息的输出进行视觉上的包裹,使其更加清晰和美观。
System.out.println("╚════════════════════════════════════════════════════╝");
}
}

@ -0,0 +1,65 @@
package com.xcs.wx.aop;
import cn.hutool.core.annotation.AnnotationUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.xcs.wx.util.DSNameUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
/**
*
* Aspect
*
* @author xcs.
* @date 202462714:29:32
*/
@Slf4j
@Aspect
@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注解这个注解通常用于标记该类对应的方法操作应该使用哪个具体的数据源。
// AnnotationUtil是hutool工具库提供的用于操作注解的工具类这里用于获取指定类型的注解实例。
DS dsAnnotation = AnnotationUtil.getAnnotation(targetClass, DS.class);
// 有指定的注解,说明该类对应的方法需要切换到特定的数据源进行操作。
if (dsAnnotation!= null) {
// 根据注解中配置的数据源相关信息通常是一个标识数据源的字符串等通过DSNameUtil工具类获取实际要切换到的数据源名称
// 然后将该数据源名称设置到DynamicDataSourceContextHolder中实现数据源的切换。
// push()方法会将指定的数据源名称设置到当前线程下,使得后续的数据操作可以使用该数据源。
DynamicDataSourceContextHolder.push(DSNameUtil.getDSName(dsAnnotation.value()));
}
// 执行被拦截的方法,让业务逻辑正常进行,其返回结果会作为整个环绕通知方法最终的返回值(如果有返回值的话)。
return joinPoint.proceed();
} finally {
// 恢复之前的ds无论方法执行过程中是否发生异常都需要保证数据源能恢复到之前的状态。
// 如果之前保存的数据源名称不为空,说明之前存在使用的数据源,那么将其重新设置回去,使得后续操作可以继续使用该数据源。
if (previousDs!= null) {
DynamicDataSourceContextHolder.push(previousDs);
} else {
// 如果之前保存的数据源名称为空,说明可能之前没有设置过数据源或者是需要清除当前线程下设置的数据源相关信息,
// 调用clear()方法进行清除操作,将数据源相关状态重置。
DynamicDataSourceContextHolder.clear();
}
}
}
}

@ -0,0 +1,85 @@
package com.xcs.wx.config;
import com.baomidou.dynamic.datasource.exception.CannotFindDataSourceException;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.exception.BizException;
import lombok.extern.slf4j.Slf4j;
import org.mybatis.spring.MyBatisSystemException;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author xcs
* @date 20231225 1729111
*
* Spring @RestControllerAdvice
* @Controller @RestController
* 使 @ResponseStatus(HttpStatus.OK) HttpStatus.OK
* 使HTTP200
**/
@Slf4j
@RestControllerAdvice
@ResponseStatus(HttpStatus.OK)
public class ExceptionAdviceConfig {
/**
* BizException
* BizException
* @param e BizException
* @return ResponseVO<String>
* ResponseVOerrorBizExceptione.getCode()e.getMsg()
**/
@ExceptionHandler(BizException.class)
public ResponseVO<String> handleException(BizException e) {
return ResponseVO.error(e.getCode(), e.getMsg());
}
/**
* 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
* RuntimeExceptionJava
* @param e RuntimeException
* @return ResponseVO<String>RuntimeException
*
**/
@ExceptionHandler(RuntimeException.class)
public ResponseVO<String> handleException(RuntimeException e) {
log.error("runtime exception", e);
return ResponseVO.error(-1, "系统异常");
}
/**
* 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, "系统异常");
}
}

@ -0,0 +1,39 @@
package com.xcs.wx.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* MybatisPlusMybatisPlus
*
* xcs202312291610
*
* @author xcs
* @date 20231229 1610
**/
@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;
}
}

@ -0,0 +1,34 @@
package com.xcs.wx.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* Spring Web MVC
* WebMvcConfigurerxcs202401261146
*
* @author xcs
* @date 202401261146
**/
@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/");
}
}

@ -0,0 +1,49 @@
package com.xcs.wx.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
*
* Spring便
* xcs202312251005
*
* @author xcs
* @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;
}
}

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

@ -0,0 +1,142 @@
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;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
*
* 便使
* xcs202312251641
*
* @author xcs
* @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 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
*
* null
*
* @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");
}
/**
*
* Spring
*
*
* @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());
}
}

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

@ -0,0 +1,95 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.dto.ChatRoomDTO;
import com.xcs.wx.domain.vo.ChatRoomDetailVO;
import com.xcs.wx.domain.vo.ChatRoomVO;
import com.xcs.wx.domain.vo.PageVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.service.ChatRoomService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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 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
* 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<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(chatRoomService.exportChatRoom());
}
}

@ -0,0 +1,98 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.dto.ContactDTO;
import com.xcs.wx.domain.vo.*;
import com.xcs.wx.service.ContactService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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 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<List<AllContactVO>>ResponseVOAllContactVO
* AllContactVOContactVO
* ResponseVO
*/
@GetMapping("/all")
public ResponseVO<List<AllContactVO>> all() {
return ResponseVO.ok(contactService.queryAllContact());
}
/**
* HTTP GET
* ContactServicequeryContactLabelResponseVO
*
* @return ResponseVO<List<ContactLabelVO>>ResponseVOContactLabelVO
* ContactLabelVO
* ResponseVO便
*/
@GetMapping("/label")
public ResponseVO<List<ContactLabelVO>> label() {
return ResponseVO.ok(contactService.queryContactLabel());
}
/**
* HTTP GET
* ContactServiceexportContactResponseVO
*
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(contactService.exportContact());
}
}

@ -0,0 +1,82 @@
package com.xcs.wx.controller;
import com.xcs.wx.service.ContactHeadImgService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
/**
* 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
* HTTP
*/
@GetMapping("/avatar")
public void avatar(String userName, HttpServletResponse response) {
// 调用ContactHeadImgService的avatar方法传入用户名userName尝试获取该用户对应的头像字节数据
// 如果获取成功返回的avatarBytes就是头像的字节数组形式的数据否则返回null表示未找到对应的头像数据。
byte[] avatarBytes = contactHeadImgService.avatar(userName);
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);
}
}
}

@ -0,0 +1,107 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.vo.*;
import com.xcs.wx.service.DashboardService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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<StatsPanelVO>ResponseVOStatsPanelVO
* ResponseVO便
* StatsPanelVO
* ResponseVO
*/
@GetMapping("/statsPanel")
public ResponseVO<StatsPanelVO> statsPanel() {
return ResponseVO.ok(dashBoardService.statsPanel());
}
/**
* msgTypeDistributionHTTP GET
* DashboardServicemsgTypeDistributionResponseVO
*
* @return ResponseVO<List<MsgTypeDistributionVO>>ResponseVOMsgTypeDistributionVO
* MsgTypeDistributionVO
* ResponseVO
* 便
*/
@GetMapping("/msgTypeDistribution")
public ResponseVO<List<MsgTypeDistributionVO>> msgTypeDistribution() {
return ResponseVO.ok(dashBoardService.msgTypeDistribution());
}
/**
* countRecentMsgs15HTTP GET
* DashboardServicecountRecentMsgsResponseVO
*
* @return ResponseVO<List<CountRecentMsgsVO>>ResponseVOCountRecentMsgsVO
* CountRecentMsgsVO
* 15ResponseVO
* 便
*/
@GetMapping("/countRecentMsgs")
public ResponseVO<List<CountRecentMsgsVO>> countRecentMsgs() {
return ResponseVO.ok(dashBoardService.countRecentMsgs());
}
/**
* topContacts10HTTP GET
* DashboardServicetopContactsResponseVO
*
* @return ResponseVO<List<TopContactsVO>>ResponseVOTopContactsVO
* TopContactsVO
* 10ResponseVO
* 便
*/
@GetMapping("/topContacts")
public ResponseVO<List<TopContactsVO>> topContacts() {
return ResponseVO.ok(dashBoardService.topContacts());
}
/**
* queryRecentUsedKeyWord使HTTP GET
* DashboardServicequeryRecentUsedKeyWordResponseVO
*
* @return ResponseVO<List<RecentUsedKeyWordVO>>ResponseVORecentUsedKeyWordVO
* RecentUsedKeyWordVO使使
* 使ResponseVO
*
*/
@GetMapping("/queryRecentUsedKeyWord")
public ResponseVO<List<RecentUsedKeyWordVO>> queryRecentUsedKeyWord() {
return ResponseVO.ok(dashBoardService.queryRecentUsedKeyWord());
}
}

@ -0,0 +1,104 @@
package com.xcs.wx.controller;
import cn.hutool.system.SystemUtil;
import com.xcs.wx.domain.dto.DecryptDTO;
import com.xcs.wx.domain.vo.DatabaseVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.service.DatabaseService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
import java.io.IOException;
import java.util.List;
/**
* 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
*
* @param decryptDTO DTO
*
* @return SseEmitterSseEmitter
*
*/
@GetMapping("/decrypt")
public SseEmitter decrypt(DecryptDTO decryptDTO) {
// 创建一个SseEmitter对象传入超时时间为0L表示无超时限制也可根据实际需求设置合适的超时时间
// 该对象用于向客户端发送服务器推送事件,可用于实时推送数据库解密过程中的状态信息等内容给客户端。
SseEmitter emitter = new SseEmitter(0L);
// 启动一个新的线程来执行异步操作,这样可以避免在主线程中执行耗时的数据库解密操作而阻塞其他请求的处理,
// 使得整个服务能够更高效地处理多个并发请求,提高系统的响应性能。
new Thread(() -> {
// 通过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
*
* @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));
}
}

@ -0,0 +1,94 @@
package com.xcs.wx.controller;
import lombok.RequiredArgsConstructor;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
/**
* 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);
}
}

@ -0,0 +1,64 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.dto.FeedsDTO;
import com.xcs.wx.domain.vo.FeedsVO;
import com.xcs.wx.domain.vo.PageVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.service.FeedsService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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 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());
}
}

@ -0,0 +1,86 @@
package com.xcs.wx.controller;
import com.xcs.wx.service.ImageService;
import lombok.RequiredArgsConstructor;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
/**
* 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及其实现类中完成。
/**
* downloadImgMd5MD5HTTP GETMD5
* ImageServicedownloadImgMd5ResponseEntity<Resource>
* 使MD5便
*
* @param md5 Md5MD5
* MD5MD5MD5
* @return ResponseEntity<Resource>ResponseEntityResource
* ResponseEntityHTTP
* ResourceSpring
*
*/
@GetMapping("/downloadImgMd5")
public ResponseEntity<Resource> downloadImgMd5(@RequestParam String md5) {
return imageService.downloadImgMd5(md5);
}
/**
* downloadImgHTTP GET
* ImageServicedownloadImgResponseEntity<Resource>
*
*
* @param path Md5
*
* @return ResponseEntity<Resource>downloadImgMd5
* ResponseEntity
*/
@GetMapping("/downloadImg")
public ResponseEntity<Resource> downloadImg(@RequestParam String path) {
return imageService.downloadImg(path);
}
/**
* downloadImgFormLocalHTTP GET
* ImageServicedownloadImgFormLocalResponseEntity<Resource>
*
*
* @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);
}
}

@ -0,0 +1,32 @@
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 {
/**
* index "index"
* @RequestMapping"/""/{path:[^.]*}"
* 访
*
* @return String "index"Spring MVCindex.html
* HTML
*/
@RequestMapping(value = {"/", "/{path:[^.]*}"})
public String index() {
return "index";
}
}

@ -0,0 +1,74 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.vo.MsgVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.service.MsgService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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<List<MsgVO>>ResponseVOMsgVO
* ResponseVO便
* MsgVO
* ResponseVO便
*/
@GetMapping("/list")
public ResponseVO<List<MsgVO>> list(@RequestParam String talker, @RequestParam Long nextSequence) {
return ResponseVO.ok(msgService.queryMsg(talker, nextSequence));
}
/**
* exportHTTP GETtalker
* MsgServiceexportMsgResponseVO
*
* @param talker
*
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export(@RequestParam String talker) {
return ResponseVO.ok(msgService.exportMsg(talker));
}
}

@ -0,0 +1,77 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.dto.RecoverContactDTO;
import com.xcs.wx.domain.vo.RecoverContactVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.service.RecoverContactService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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 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<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(recoverContactService.exportRecoverContact());
}
}

@ -0,0 +1,53 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.domain.vo.SessionVO;
import com.xcs.wx.service.SessionService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* SessionControllerSpring MVCHTTP
* SessionService
* 使ResponseVOxcs202312211738
*
* @author xcs
* @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 ResponseVO<List<SessionVO>>ResponseVOSessionVO
* ResponseVO便
* SessionVOID
* ResponseVO
* 便
*/
@GetMapping("/list")
public ResponseVO<List<SessionVO>> list() {
return ResponseVO.ok(sessionService.querySession());
}
}

@ -0,0 +1,127 @@
package com.xcs.wx.controller;
import com.xcs.wx.domain.vo.UserInfoVO;
import com.xcs.wx.domain.vo.UserVO;
import com.xcs.wx.domain.vo.ResponseVO;
import com.xcs.wx.domain.vo.WeChatConfigVO;
import com.xcs.wx.service.UserService;
import com.xcs.wx.service.WeChatService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* 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<List<WeChatConfigVO>>ResponseVOWeChatConfigVO
* ResponseVO便
* WeChatConfigVO
* ResponseVO便
*/
@GetMapping("/readWeChatConfig")
public ResponseVO<List<WeChatConfigVO>> readWeChatConfig() {
return ResponseVO.ok(weChatService.readWeChatConfig());
}
/**
* userInfoHTTP GET
* UserServiceuserInfoUserInfoVOResponseVO
*
* @return ResponseVO<UserInfoVO>ResponseVOUserInfoVO
* UserInfoVO
* ResponseVO便
*/
@GetMapping("/userInfo")
public ResponseVO<UserInfoVO> userInfo() {
return ResponseVO.ok(userService.userInfo());
}
/**
* avatarHTTP GET
* UserServiceavatar
* ResponseVO
*
* @return ResponseVO<String>ResponseVOString
* ResponseVO
*
*/
@GetMapping("/avatar")
public ResponseVO<String> avatar() {
return ResponseVO.ok(userService.avatar());
}
/**
* nicknameHTTP GET
* UserServicenicknameResponseVO
*
* @return ResponseVO<String>ResponseVOString
* ResponseVO便
*/
@GetMapping("/nickname")
public ResponseVO<String> nickname() {
return ResponseVO.ok(userService.nickname());
}
/**
* usersHTTP GET
* UserServiceusersResponseVO
*
* @return ResponseVO<List<UserVO>>ResponseVOUserVO
* UserVOID
* ResponseVO便
*/
@GetMapping("/users")
public ResponseVO<List<UserVO>> users() {
return ResponseVO.ok(userService.users());
}
/**
* switchUserHTTP PUTIDwxId
* UserServiceswitchUserResponseVO
*
* @param wxId wxIdIDID
* ID
* @return ResponseVO<String>ResponseVOString
* "切换成功"ResponseVO
*
*/
@PutMapping("/switchUser")
public ResponseVO<String> switchUser(String wxId) {
userService.switchUser(wxId);
return ResponseVO.ok("切换成功");
}
}

@ -0,0 +1,153 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.ibatis.type.ByteArrayTypeHandler;
/**
* ChatRoom
* 便
* @author xcs
* &#064;date 20240108 0945
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getChatRoomName()、getUserNameList()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问群聊的具体属性信息时比如查看群聊名称、获取群聊成员用户名列表等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当群聊的显示名称列表发生变化
// 可以通过调用setDisplayNameList(String newDisplayNameList)方法来更新displayNameList属性的值从而保证对象的属性能够灵活地反映群聊相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将ChatRoom对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前群聊对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个ChatRoom对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及群聊对象比较的业务逻辑中(如判断两个群聊的配置是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName(value = "ChatRoom", autoResultMap = true)
// @TableName注解来自于MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明ChatRoom类对应的数据库表名为"ChatRoom"。
// 而autoResultMap = true这个配置表示自动构建结果映射方便在查询数据库返回结果时能自动将结果集的数据映射到该类的属性上
// 减少了手动配置结果映射的繁琐过程,特别是当表结构和类结构有一定对应关系时,能更便捷地进行数据库与实体类之间的数据交互。
public class ChatRoom {
/**
* String
// 在整个系统中,不同的群聊应该具有不同的名称,通过这个名称可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体的群聊,
// 同时在用户界面展示群聊列表等场景下,也是用户识别不同群聊的重要依据之一。
*/
@TableId("ChatRoomName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"ChatRoom"中,主键字段名为"ChatRoomName"
// 即将类中的chatRoomName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作。
private String chatRoomName;
/**
* 使String
// 例如用逗号隔开各个用户名等形式,方便在需要获取群聊成员、进行成员相关的业务逻辑判断(如判断某个用户是否在群聊中)以及与其他系统模块交互传递成员信息等场景下使用。
*/
@TableField("UserNameList")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"ChatRoom"中,该属性对应名为"UserNameList"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取。
private String userNameList;
/**
*
// 与用户名不同,显示名称可能更具个性化、友好化,方便在群聊界面展示成员信息时使用,其存储格式可能和用户名列表类似,也是按照一定规则拼接的字符串形式,
// 用于在展示群聊成员、进行成员显示相关的业务处理(如更新成员显示名称等)场景中发挥作用。
*/
@TableField("DisplayNameList")
private String displayNameList;
/**
* 0使Integer
// 具体含义取决于业务的具体定义例如可以用不同的整数值来区分普通群聊、加密群聊、临时群聊等不同类型的群聊初始默认值为0在创建群聊或者初始化相关数据时会用到这个默认值
// 后续可根据业务需求对其进行修改和判断,以实现不同的业务逻辑处理。
*/
@TableField("ChatRoomFlag")
private Integer chatRoomFlag;
/**
* 0
// 在涉及群聊权限管理如只有拥有者能进行某些特定操作像修改群聊设置等、群聊归属判断以及相关业务逻辑中起着关键作用初始默认值为0
// 当创建群聊时会确定具体的拥有者标识并进行相应赋值,后续也可以根据业务规则对其进行更新和查询等操作。
*/
@TableField("Owner")
private Integer owner;
/**
* 0
// 例如值为1时表示显示成员的显示名称值为0则不显示方便根据不同的业务场景或者用户偏好来设置群聊成员名称的展示情况在群聊界面展示相关的业务逻辑中会用到这个标志进行判断和处理。
*/
@TableField("IsShowName")
private Integer isShowName;
/**
*
// 用于在群聊中让其他成员识别自己,与前面的显示名称列表有所不同,它特指当前用户自己在该群聊中的展示名称,在群聊交互、展示自身信息等场景中发挥作用。
*/
@TableField("SelfDisplayName")
private String selfDisplayName;
/**
* 1
// 目前可能暂时没有具体的使用场景,但当后续需要增加新的属性或者功能时,可以利用这些预留字段进行扩展,避免了频繁修改数据库表结构和实体类结构带来的复杂性和风险。
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 21
// 具体内容和用途会根据未来业务发展的需求来确定。
*/
@TableField("Reserved2")
private String reserved2;
/**
* 3使使
*/
@TableField("Reserved3")
private Integer reserved3;
/**
* 4便
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5使
*/
@TableField("Reserved5")
private Integer reserved5;
/**
* 6
*/
@TableField("Reserved6")
private String reserved6;
/**
* BLOBBinary Large Object使byte[]
// 这种形式常用于存储一些比较复杂、非结构化或者二进制格式的数据,比如群聊的一些特殊配置信息、历史聊天记录的二进制备份等,
// 通过指定typeHandler = ByteArrayTypeHandler.class使用字节数组类型处理器来处理该字段与数据库之间的数据转换确保二进制数据能够正确地在数据库中存储和读取
// 满足一些特殊的业务数据存储需求,特别是当数据不适合用常规的文本或简单数值类型表示时,就可以利用这个字段进行存储。
*/
@TableField(value = "RoomData", typeHandler = ByteArrayTypeHandler.class)
private byte[] roomData;
/**
* 7使
*/
@TableField("Reserved7")
private Integer reserved7;
/**
* 8
*/
@TableField("Reserved8")
private String reserved8;
}

@ -0,0 +1,135 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* ChatRoomInfo
*
* 便
* @author xcs
* &#064;date 20240109 1453
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getChatRoomName()、getAnnouncement()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问群聊信息的具体属性信息时比如查看群聊名称、获取群聊公告内容等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当群聊公告内容发生变化
// 可以通过调用setAnnouncement(String newAnnouncement)方法来更新announcement属性的值从而保证对象的属性能够灵活地反映群聊信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将ChatRoomInfo对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前群聊信息对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个ChatRoomInfo对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及群聊信息对象比较的业务逻辑中(如判断两个群聊的信息是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName("ChatRoomInfo")
// @TableName注解来自MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明ChatRoomInfo类对应的数据库表名为"ChatRoomInfo"
// 明确了该类与数据库表之间的映射关系,方便后续进行数据库操作(如数据的插入、查询、更新、删除等)时能准确地找到对应的表,确保数据的正确交互。
public class ChatRoomInfo {
/**
* String
// 在整个系统中,不同的群聊应该具有不同的名称,通过这个名称可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体的群聊,
// 同时在用户界面展示群聊列表、查看群聊详情等场景下,也是用户识别不同群聊的重要依据之一,并且作为主键,它在数据库表的关联、索引等操作中起着核心作用。
*/
@TableId("ChatRoomName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"ChatRoomInfo"中,主键字段名为"ChatRoomName"
// 即将类中的chatRoomName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private String chatRoomName;
/**
* String
// 在群聊界面展示公告板块或者成员查看群聊相关规定等场景中会展示这个公告内容,并且可以通过相应的业务逻辑对其进行编辑、更新操作,方便群聊的管理和信息传达。
*/
@TableField("Announcement")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"ChatRoomInfo"中,该属性对应名为"Announcement"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改公告内容信息。
private String announcement;
/**
* 0使Integer
// 每次对群聊相关重要信息进行修改时,可以递增这个版本号,通过比较版本号可以判断不同成员所看到的群聊信息是否是最新的,
// 也有助于在一些数据同步、历史记录查看以及版本管理相关的业务逻辑中发挥作用初始默认值为0方便在创建群聊或者首次设置相关信息时进行初始化操作。
*/
@TableField("InfoVersion")
private Integer infoVersion;
/**
* String
// 在需要追溯公告来源、查看谁有权限修改公告以及进行相关的操作记录查询等业务场景中,公告编辑者属性起着重要作用,便于对群聊公告的编辑历史和责任归属进行管理。
*/
@TableField("AnnouncementEditor")
private String announcementEditor;
/**
* 0Long19701100:00:00 UTC
// 到公告实际发布时刻所经过的毫秒数或者秒数(具体取决于系统的时间精度设定),通过这个时间戳,可以准确判断公告的时效性、进行公告的排序展示(按照发布时间先后顺序),
// 以及在一些基于时间范围的查询如查看某一时间段内发布的公告等业务场景中发挥作用初始默认值为0在发布公告时会更新为实际的发布时间戳值。
*/
@TableField("AnnouncementPublishTime")
private Long announcementPublishTime;
/**
* 0Integer
// 例如可以用不同的整数值来区分群聊正常、群聊被封禁、群聊维护中等等不同的状态情况初始默认值为0在创建群聊或者进行群聊状态变更操作时会用到这个默认值
// 并且可以根据业务需求对其进行修改和判断,以实现不同的业务逻辑处理,比如根据群聊状态决定是否允许成员发送消息等操作。
*/
@TableField("ChatRoomStatus")
private Integer chatRoomStatus;
/**
* 1Integer
// 目前可能暂时没有具体的使用场景,但当后续需要增加新的属性或者功能时,可以利用这些预留字段进行扩展,避免了频繁修改数据库表结构和实体类结构带来的复杂性和风险。
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2String1
// 具体内容和用途会根据未来业务发展的需求来确定。
*/
@TableField("Reserved2")
private String reserved2;
/**
* 3使Integer使
*/
@TableField("Reserved3")
private Integer reserved3;
/**
* 4String便
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5Integer使
*/
@TableField("Reserved5")
private Integer reserved5;
/**
* 6String
*/
@TableField("Reserved6")
private String reserved6;
/**
* 7Integer使
*/
@TableField("Reserved7")
private Integer reserved7;
/**
* 8String
*/
@TableField("Reserved8")
private String reserved8;
}

@ -0,0 +1,257 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* Contact
* 便
* @author xcs
* &#064;date 20231222 1059
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体作用如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getUserName()、getAlias()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问联系人的具体属性信息时比如查看联系人的用户名、别名等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当联系人的备注信息发生变化
// 可以通过调用setRemark(String newRemark)方法来更新remark属性的值从而保证对象的属性能够灵活地反映联系人相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将Contact对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前联系人对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个Contact对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及联系人对象比较的业务逻辑中(如判断两个联系人的信息是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName(value = "Contact", autoResultMap = true)
// @TableName注解来自于MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明Contact类对应的数据库表名为"Contact"。
// 而autoResultMap = true这个配置表示自动构建结果映射方便在查询数据库返回结果时能自动将结果集的数据映射到该类的属性上
// 减少了手动配置结果映射的繁琐过程,特别是当表结构和类结构有一定对应关系时,能更便捷地进行数据库与实体类之间的数据交互。
public class Contact {
/**
* String
// 在整个系统中,不同的联系人应该具有不同的用户名,通过这个用户名可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体的联系人,
// 同时在用户界面展示联系人列表等场景下,也是用户识别不同联系人的重要依据之一,并且作为主键,它在数据库表的关联、索引等操作中起着核心作用。
*/
@TableId(value = "UserName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"Contact"中,主键字段名为"UserName"
// 即将类中的userName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private String userName;
/**
* String便
// 它可以与用户名、昵称等有所不同,在一些特定的业务场景下(如快捷查找、特定分组标识等),别名能够提供更方便的操作方式,用于辅助对联系人的管理和使用。
*/
@TableField("Alias")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"Contact"中,该属性对应名为"Alias"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改别名信息。
private String alias;
/**
* String
// 在涉及数据传输、存储或者一些需要增强安全性的业务场景中,对用户名进行加密可以防止用户名被恶意获取和利用,
// 并且在特定的验证、解密等相关业务逻辑中会使用到这个加密后的用户名信息。
*/
@TableField("EncryptUserName")
private String encryptUserName;
/**
* 0使Integer
// 一般来说0表示联系人未被删除而其他特定的值如1等具体取决于业务定义可以表示联系人已被删除
// 在进行数据清理、查询有效联系人列表或者恢复已删除联系人等业务操作时,会依据这个删除标志来进行相应的逻辑处理。
*/
@TableField("DelFlag")
private Integer delFlag;
/**
* 0
// 例如可以用不同的整数值来区分是好友、公众号、企业联系人等不同类型的联系人初始默认值为0在创建或初始化联系人信息时会用到这个默认值
// 后续可根据实际情况对其进行修改和判断,以实现不同类型联系人对应的业务逻辑处理。
*/
@TableField("Type")
private Integer type;
/**
* 0
// 比如在添加好友等场景中0可能表示未验证1表示已验证通过等情况在涉及联系人验证相关的业务逻辑如显示验证提示、限制未验证联系人的部分操作等中会用到这个标志进行判断和处理。
*/
@TableField("VerifyFlag")
private Integer verifyFlag;
/**
* 1Integer
// 目前可能暂时没有具体的使用场景,但当后续需要增加新的属性或者功能时,可以利用这些预留字段进行扩展,避免了频繁修改数据库表结构和实体类结构带来的复杂性和风险。
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2Integer1
// 其具体用途会根据未来业务发展的需求来确定,在当前阶段不参与主要的业务逻辑处理,但为系统升级、功能拓展提前做好了准备。
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3String
// 具体内容和用途将根据未来业务调整来确定,方便在不改动现有主要业务逻辑的基础上进行功能的扩展和完善。
*/
@TableField("Reserved3")
private String reserved3;
/**
* 4String
// 目前处于备用状态,等待合适的业务场景出现后再进行具体的使用。
*/
@TableField("Reserved4")
private String reserved4;
/**
* String
// 方便用户更好地识别和记忆联系人,例如可以备注联系人的工作单位、与自己的关系等信息,在查看联系人详情、进行联系人分类管理等场景中会展示和使用备注信息。
*/
@TableField("Remark")
private String remark;
/**
* String
// 在联系人列表展示、聊天界面等场景中,昵称更便于用户直观地识别联系人,增强了用户与联系人之间交互的友好性。
*/
@TableField("NickName")
private String nickName;
/**
* IDStringID
// 例如可以用不同的标签来区分工作联系人、生活联系人、兴趣爱好相同的联系人等标签ID列表可能是以某种特定格式如逗号分隔的ID字符串等存储多个标签的标识信息
// 在进行联系人筛选、分类查询等业务场景中会用到这些标签ID信息。
*/
@TableField("LabelIDList")
private String labelIdList;
/**
* String
// 比如在企业应用中可以表示不同的部门、项目组等划分,在社交应用中可能表示不同的社交圈子等,通过域列表可以更清晰地对联系人进行组织和管理,
// 在涉及联系人归属范围判断、跨域操作限制等业务逻辑中会使用到域列表信息。
*/
@TableField("DomainList")
private String domainList;
/**
* Integer
// 具体的聊天室类型划分取决于业务定义,例如可以区分普通群聊、临时群聊、特定主题群聊等不同类型,在群聊相关的业务处理(如群聊功能权限判断、群聊分类统计等)中会用到这个属性进行区分和操作。
*/
@TableField("ChatRoomType")
private Integer chatRoomType;
/**
* String
// 这个属性通常用于实现一些便捷的查找、排序功能,比如按照拼音首字母对联系人进行排序,或者通过输入拼音首字母快速定位联系人等,
// 方便用户在大量联系人中更高效地查找和操作特定的联系人。
*/
@TableField("PYInitial")
private String pyInitial;
/**
* String
// 完整拼音也可用于更精准的查找、排序以及一些基于拼音的匹配等业务操作,例如实现模糊拼音搜索联系人等功能,进一步提升联系人查找的便捷性。
*/
@TableField("QuanPin")
private String quanPin;
/**
* String
// 特别是当用户对备注内容有印象但记不清具体文字时,可以通过拼音首字母来快速定位对应的联系人,提高操作效率。
*/
@TableField("RemarkPYInitial")
private String remarkPyInitial;
/**
* String
// 可以基于完整拼音实现更细致的查找、匹配等功能,方便用户根据备注相关的拼音信息来操作联系人。
*/
@TableField("RemarkQuanPin")
private String remarkQuanPin;
/**
* URLString
// 通过这个链接可以获取对应的大头像图片并进行展示,让用户更清晰地查看联系人头像,提升用户体验和视觉效果。
*/
@TableField("BigHeadImgUrl")
private String bigHeadImgUrl;
/**
* URLString
// 小头像可能在一些列表展示等场景中使用,以节省空间同时又能让用户大致识别联系人,通过这个链接可以获取小头像图片进行展示,满足不同场景下的头像展示需求。
*/
@TableField("SmallHeadImgUrl")
private String smallHeadImgUrl;
/**
* MD5StringMD5MD5
// 在这里主要用于验证头像文件的完整性、唯一性以及进行头像文件的比对等操作例如在头像更新时可以通过比较MD5值来判断头像是否真正发生了变化
// 或者在从不同来源获取头像时,验证其是否是同一个头像文件,确保头像数据的准确性和一致性。
*/
@TableField("HeadImgMd5")
private String headImgMd5;
/**
* 0Integer
// 0通常表示不接收通知而其他值如1等具体取决于业务定义可以表示接收通知在群聊消息提醒设置、根据用户偏好控制通知等业务逻辑中会用到这个标志进行判断和处理。
*/
@TableField("ChatRoomNotify")
private Integer chatRoomNotify;
/**
* 5Integer
// 等待未来根据实际情况进行功能拓展时再做具体使用,为系统的可扩展性提供了一定的灵活性。
*/
@TableField("Reserved5")
private Integer reserved5;
/**
* 6String
// 以备后续业务需求出现时能够灵活应对,确保系统可以在不大量改动现有结构的基础上进行功能的扩充。
*/
@TableField("Reserved6")
private String reserved6;
/**
* 7String
// 其具体内容和使用方式将根据后续业务发展来确定。
*/
@TableField("Reserved7")
private String reserved7;
/**
* 8Integer
// 但在系统后续升级、功能拓展时可能会被赋予相应的含义和使用方式,便于系统的持续发展和优化。
*/
@TableField("Reserved8")
private Integer reserved8;
/**
* 9Integer
// 提前设置这些预留字段可以减少因业务拓展带来的数据库和代码结构频繁变动的问题。
*/
@TableField("Reserved9")
private Integer reserved9;
/**
* 10String便
// 增强系统对未来业务需求变化的适应性。
*/
@TableField("Reserved10")
private String reserved10;
/**
* 11String
// 等待合适的业务场景出现后再进行具体的使用,有助于系统在长期发展中保持可扩展性。
*/
@TableField("Reserved11")
private String reserved11;}

@ -0,0 +1,72 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.ibatis.type.ByteArrayTypeHandler;
/**
* ContactHeadImg
* 便
*
* @author xcs
* &#064;date 20231222 1059
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getUsrName()、getCreateTime()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问联系人头像相关的具体属性信息时比如查看用户名、获取头像创建时间等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当联系人头像的MD5值发生变化
// 可以通过调用setHeadImgMd5(String newHeadImgMd5)方法来更新headImgMd5属性的值从而保证对象的属性能够灵活地反映联系人头像相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将ContactHeadImg对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前联系人头像对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个ContactHeadImg对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及联系人头像对象比较的业务逻辑中(如判断两个联系人头像的相关属性是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName("ContactHeadImg1")
// @TableName注解来自MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明ContactHeadImg类对应的数据库表名为"ContactHeadImg1"
// 明确了该类与数据库表之间的映射关系,方便后续进行数据库操作(如数据的插入、查询、更新、删除等)时能准确地找到对应的表,确保数据的正确交互。
public class ContactHeadImg {
/**
* String
// 在整个系统中,不同联系人的头像数据通过这个用户名进行区分,通过这个用户名可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体联系人的头像记录,
// 并且作为主键,它在数据库表的关联、索引等操作中起着核心作用,确保数据的完整性和一致性,方便对联系人头像数据进行精准的管理。
*/
@TableId("usrName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"ContactHeadImg1"中,主键字段名为"usrName"
// 即将类中的usrName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作。
private String usrName;
/**
* Integer
// 例如可能是以时间戳从某个固定起始时间点到头像创建时刻所经过的秒数或毫秒数常见以1970年1月1日00:00:00 UTC为起始点的形式存在
// 在头像管理中,创建时间可用于判断头像的新旧程度、进行头像历史记录查询以及按照时间顺序对头像数据进行排序等业务操作,方便对头像数据的生命周期进行管理。
*/
@TableField("createTime")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"ContactHeadImg1"中,该属性对应名为"createTime"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改创建时间信息。
private Integer createTime;
/**
* byte[]使ByteArrayTypeHandler
// 因为图像数据本身是二进制格式的,字节数组能够很好地承载这些二进制数据,方便在数据库中进行存储和读取,在需要展示联系人小头像的业务场景中(比如联系人列表中以较小尺寸展示头像),
// 可以通过读取这个字节数组数据还原出小头像图像进行展示,满足不同场景下对联系人头像展示的需求。
*/
@TableField(value = "smallHeadBuf", typeHandler = ByteArrayTypeHandler.class)
private byte[] smallHeadBuf;
/**
* MD5StringMD5MD5
// 在这里主要用于验证头像数据的完整性、唯一性以及进行头像文件的比对等操作例如在头像更新时可以通过比较MD5值来判断头像是否真正发生了变化
// 或者在从不同来源获取头像时,验证其是否是同一个头像文件,确保头像数据的准确性和一致性,保障系统中联系人头像相关业务的正常运行。
*/
@TableField("m_headImgMD5")
private String headImgMd5;
}

@ -0,0 +1,83 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* ContactHeadImgUrl
*
* 便
* @author xcs
* &#064;date 20231221 1831
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getUsrName()、getSmallHeadImgUrl()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问联系人头像相关的具体属性信息时比如查看用户名、获取小头像或大头像的URL地址等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当联系人的大头像图片的URL地址发生变化
// 可以通过调用setBigHeadImgUrl(String newBigHeadImgUrl)方法来更新bigHeadImgUrl属性的值从而保证对象的属性能够灵活地反映联系人头像相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将ContactHeadImgUrl对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前联系人头像对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个ContactHeadImgUrl对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及联系人头像对象比较的业务逻辑中(如判断两个联系人的头像相关属性是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName("ContactHeadImgUrl")
// @TableName注解来自MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明ContactHeadImgUrl类对应的数据库表名为"ContactHeadImgUrl"
// 明确了该类与数据库表之间的映射关系,方便后续进行数据库操作(如数据的插入、查询、更新、删除等)时能准确地找到对应的表,确保数据的正确交互。
public class ContactHeadImgUrl {
/**
* String
// 在整个系统中,不同联系人的头像信息通过这个用户名进行区分,通过这个用户名可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体联系人的头像记录,
// 并且在展示联系人头像、进行头像相关数据管理等场景下,也是重要的关联依据,确保头像数据与对应的联系人能准确匹配。
*/
@TableId("usrName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"ContactHeadImgUrl"中,主键字段名为"usrName"
// 即将类中的usrName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private String usrName;
/**
* URLString
// 通过这个URL地址系统可以从相应的服务器或者存储位置获取小头像图片并进行展示满足不同展示场景对头像尺寸和展示效果的需求方便用户快速识别联系人。
*/
@TableField("smallHeadImgUrl")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"ContactHeadImgUrl"中,该属性对应名为"smallHeadImgUrl"的字段,
// 明确了类属性与数据库表字段之间的映射关系确保数据的正确存储和读取便于与数据库进行交互来获取和修改小头像图片的URL地址信息。
private String smallHeadImgUrl;
/**
* URL
// 通过这个URL地址系统可以获取大头像图片进行展示能让用户更清晰地查看联系人头像细节提升用户体验同时也方便根据不同的业务需求灵活切换头像展示的尺寸。
*/
@TableField("bigHeadImgUrl")
private String bigHeadImgUrl;
/**
* MD5StringMD5MD5
// 在这里主要用于验证头像图片的完整性、唯一性以及进行头像文件的比对等操作例如在头像更新时可以通过比较MD5值来判断头像是否真正发生了变化
// 或者在从不同来源获取头像时,验证其是否是同一个头像文件,确保头像数据的准确性和一致性,保障系统中联系人头像相关业务的正常运行。
*/
@TableField("headImgMd5")
private String headImgMd5;
/**
* 0Integer
// 目前可能暂时没有具体的使用场景,但当后续需要增加新的属性或者功能时,可以利用这些预留字段进行扩展,避免了频繁修改数据库表结构和实体类结构带来的复杂性和风险。
*/
@TableField("reverse0")
private Integer reverse0;
/**
* 1String0
// 其具体内容和用途会根据未来业务发展的需求来确定,在当前阶段不参与主要的业务逻辑处理,但为系统升级、功能拓展提前做好了准备。
*/
@TableField("reverse1")
private String reverse1;
}

@ -0,0 +1,76 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
*
* MyBatis Plus
* Lombok @Data GetterSetterToString
*
* @author xcs
* &#064;date 20231222 1653
**/
@Data
@TableName("ContactLabel") // 表明该实体类对应的数据库表名为 "ContactLabel"用于MyBatis Plus与数据库表进行关联映射
public class ContactLabel {
/**
* Id
* @TableId "LabelId"
*/
@TableId("LabelId")
private String labelId;
/**
*
* 使 @TableField "LabelName"
*/
@TableField("LabelName")
private String labelName;
/**
* 1
* "Reserved1" Integer
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2
* "Reserved2" Integer
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3
* "Reserved3" String使
*/
@TableField("Reserved3")
private String reserved3;
/**
* 4
* "Reserved4" 便String
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5
* "Reserved5" String使
*/
@TableField("Reserved5")
private String reserved5;
/**
*
* "RespData"
*/
@TableField("RespData")
private String respData;
}

@ -0,0 +1,50 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* FTSContactContent
* MyBatis Plus
* Lombok @Data GetterSetterToString
*
* @author xcs
* &#064;date 202461415:12:27
**/
@Data
@TableName(value = "FTSContact15_content", autoResultMap = true)
// @TableName注解用于指定该实体类对应的数据库表名是 "FTSContact15_content"autoResultMap = true表示自动映射结果集方便查询结果的映射处理
public class FTSContactContent {
/**
*
* "docid" @TableId IdType.AUTO
* 便
*/
@TableId(value = "docid", type = IdType.AUTO)
private Integer docId;
/**
* alias
* 使 @TableField "c0alias"
*/
@TableField("c0alias")
private String alias;
/**
* nickname
* @TableField "c1nickname"
*/
@TableField("c1nickname")
private String nickname;
/**
* c2remark
* "c2remark" 便
*/
@TableField("c2remark")
private String remark;
}

@ -0,0 +1,63 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* FTSRecentUsed使使
*
* 便
* @author xcs
* &#064;date 20240123 1109
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getQueryText()、getUsername()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问最近使用关键字相关的具体属性信息时比如查看查询的内容、获取用户名等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当查询的内容发生变化
// 可以通过调用setQueryText(String newQueryText)方法来更新queryText属性的值从而保证对象的属性能够灵活地反映最近使用关键字相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将FTSRecentUsed对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前最近使用关键字对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个FTSRecentUsed对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及最近使用关键字对象比较的业务逻辑中(如判断两个用户的搜索历史记录是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName("FTSRecentUsed15")
// @TableName注解来自MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明FTSRecentUsed类对应的数据库表名为"FTSRecentUsed15"
// 明确了该类与数据库表之间的映射关系,方便后续进行数据库操作(如数据的插入、查询、更新、删除等)时能准确地找到对应的表,确保数据的正确交互。
public class FTSRecentUsed {
/**
* String
// 这是体现用户搜索意图的关键信息,通过记录这些查询内容,可以分析用户的兴趣点、常用搜索需求等,
// 在搜索历史展示、基于历史搜索进行智能提示或者个性化推荐等业务场景中,查询的内容属性起着重要作用,便于为用户提供更贴合需求的服务。
*/
@TableId("queryText")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"FTSRecentUsed15"中,主键字段名为"queryText"
// 即将类中的queryText属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private String queryText;
/**
* Integer
// 通过这个用户名可以区分不同用户的搜索历史记录,明确各条最近使用关键字是属于哪个具体用户的,方便在多用户环境下进行数据的准确管理和个性化服务的提供,
// 例如为不同用户分别展示其对应的搜索历史,或者基于不同用户的搜索习惯进行针对性的推荐等操作。
*/
@TableField("username")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"FTSRecentUsed15"中,该属性对应名为"username"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改用户名信息。
private Integer username;
/**
* String使
// 时间的存储格式可能是常见的日期时间格式(如"yyyy-MM-dd HH:mm:ss"等),通过这个修改时间,可以了解用户使用关键字的时间顺序、判断关键字的时效性,
// 在搜索历史排序展示(按照时间先后顺序展示近期使用的关键字)、清理过期的搜索记录等业务操作中会用到这个属性,方便对搜索历史数据进行有效的管理。
*/
@TableField("updateTime")
private String updateTime;
}

@ -0,0 +1,110 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* Feeds
* 便
* @author xcs
* &#064;date 20240103 1641
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getFeedId()、getCreateTime()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问朋友圈动态的具体属性信息时比如查看动态的唯一标识ID、获取创建时间等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当朋友圈动态的内容文本发生变化
// 可以通过调用setContent(String newContent)方法来更新content属性的值从而保证对象的属性能够灵活地反映朋友圈动态相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将Feeds对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前朋友圈动态对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个Feeds对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及朋友圈动态对象比较的业务逻辑中(如判断两条朋友圈动态的信息是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName(value = "FeedsV20", autoResultMap = true)
// @TableName注解来自于MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明Feeds类对应的数据库表名为"FeedsV20"。
// 而autoResultMap = true这个配置表示自动构建结果映射方便在查询数据库返回结果时能自动将结果集的数据映射到该类的属性上
// 减少了手动配置结果映射的繁琐过程,特别是当表结构和类结构有一定对应关系时,能更便捷地进行数据库与实体类之间的数据交互。
public class Feeds {
/**
* IDLong
// 不同的朋友圈动态应该具有不同的ID通过这个ID可以在数据库操作如查询、更新、删除等以及业务逻辑处理中准确地定位到具体的动态记录
// 同时在朋友圈的各种业务场景中,比如查看特定动态详情、进行动态的排序展示等,也是重要的依据,方便对朋友圈动态进行精准的管理和操作。
*/
@TableId("FeedId")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"FeedsV20"中,主键字段名为"FeedId"
// 即将类中的feedId属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private Long feedId;
/**
* 使Integer19701100:00:00 UTC
// 也可能是经过特定格式转换后的整数值,在朋友圈动态管理中,创建时间可用于按照时间顺序对动态进行排序展示(如按发布时间先后展示朋友圈)、进行动态历史记录查询以及判断动态的时效性等业务操作,方便对朋友圈动态的生命周期进行管理。
*/
@TableField("CreateTime")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"FeedsV20"中,该属性对应名为"CreateTime"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改创建时间信息。
private Integer createTime;
/**
* IDIntegerID
// 例如当动态发布失败、展示出现问题等故障发生时可以通过这个故障ID去查找具体的故障原因、相关的报错日志等详细信息便于进行故障排查和系统维护保障朋友圈功能的正常运行。
*/
@TableField("FaultId")
private Integer faultId;
/**
* Integer
// 比如可以用不同的整数值来表示是纯文本动态、图文动态、视频动态等不同类型,在朋友圈动态的展示、处理逻辑中,会根据这个类型属性来采取不同的展示方式、业务操作,以满足多样化的朋友圈功能需求。
*/
@TableField("Type")
private Integer type;
/**
* String
// 在朋友圈的展示、权限管理等业务场景中起着重要作用,比如只展示当前用户及其好友的朋友圈动态,就需要通过这个用户名来判断动态的发布者与当前用户的关系,从而决定是否展示该动态。
*/
@TableField("UserName")
private String userName;
/**
* Integer
// 例如可以用不同的整数值来区分动态是正常发布状态、已删除状态、审核中状态(如果有审核机制的话)等不同情况,在朋友圈动态的管理、操作判断等业务逻辑中会依据这个状态属性来进行相应的处理。
*/
@TableField("Status")
private Integer status;
/**
* Integer
// 例如可以通过不同的位来表示是否开启了某些扩展功能(如动态是否可评论、是否可转发等扩展功能的标志位),方便在业务逻辑中根据这些标志来实现更丰富、灵活的朋友圈功能。
*/
@TableField("ExtFlag")
private Integer extFlag;
/**
* Integer
// 比如0表示公开所有人都能看到1表示仅好友可见2表示仅自己可见等等在朋友圈动态的展示权限控制方面起着关键作用根据用户设置的隐私标志来决定哪些用户能够查看对应的动态内容。
*/
@TableField("PrivFlag")
private Integer privFlag;
/**
* IDString
// 通过这个字符串ID去匹配其他表中的对应记录实现更复杂的数据关联和业务逻辑处理例如关联到动态的评论表、点赞表等相关数据方便对朋友圈动态的附属信息进行统一管理和操作。
*/
@TableField("StringId")
private String stringId;
/**
* String
// 如果是图文、视频等类型的动态,这里可能存储的是对内容的简要描述等文本信息,在朋友圈动态的展示环节,这个属性的值就是用户实际看到的动态文字内容,是朋友圈动态的核心展示部分之一。
*/
@TableField("Content")
private String content;
}

@ -0,0 +1,64 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.ibatis.type.ByteArrayTypeHandler;
/**
*
* MyBatis Plus
* Lombok @Data GetterSetter便
*
* @author xcs
* &#064;date 20240104 1755
**/
@Data
@TableName(value = "HardLinkImageAttribute", autoResultMap = true)
// @TableName注解用于指定该实体类对应的数据库表名为 "HardLinkImageAttribute"autoResultMap = true表示自动映射结果集便于在查询等操作后将数据库结果准确映射到该实体对象上
public class HardLinkImageAttribute {
/**
* ID
* @TableId "Md5Hash" 使LongMD5
*/
@TableId("Md5Hash")
private Long md5Hash;
/**
*
* 使 @TableField "DirID1" 便
*/
@TableField("DirID1")
private String dirId1;
/**
*
* @TableField "DirID2"
*/
@TableField("DirID2")
private String dirId2;
/**
*
* "Md5" 使 ByteArrayTypeHandler MD5
*/
@TableField(value = "Md5", typeHandler = ByteArrayTypeHandler.class)
private byte[] md5;
/**
*
* @TableField "ModifyTime" 便
*/
@TableField("ModifyTime")
private String modifyTime;
/**
*
* @TableField "FileName" 便
*/
@TableField("FileName")
private String fileName;
}

@ -0,0 +1,90 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.ibatis.type.ByteArrayTypeHandler;
/**
* HardLinkVideoAttribute
* 便
*
* @author xcs
* &#064;date 20240207 1524
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getMd5Hash()、getDirId1()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问视频链接相关的具体属性信息时比如查看动态的唯一标识ID、获取发布用户的用户名等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当视频的文件名发生变化
// 可以通过调用setFileName(String newFileName)方法来更新fileName属性的值从而保证对象的属性能够灵活地反映视频链接相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将HardLinkVideoAttribute对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前视频链接对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个HardLinkVideoAttribute对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及视频链接对象比较的业务逻辑中(如判断两条视频链接的相关属性是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName(value = "HardLinkVideoAttribute", autoResultMap = true)
// @TableName注解来自于MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明HardLinkVideoAttribute类对应的数据库表名为"HardLinkVideoAttribute"。
// 而autoResultMap = true这个配置表示自动构建结果映射方便在查询数据库返回结果时能自动将结果集的数据映射到该类的属性上
// 减少了手动配置结果映射的繁琐过程,特别是当表结构和类结构有一定对应关系时,能更便捷地进行数据库与实体类之间的数据交互。
public class HardLinkVideoAttribute {
/**
* IDLong
// 不同的视频链接记录应该具有不同的ID通过这个ID可以在数据库操作如查询、更新、删除等以及业务逻辑处理中准确地定位到具体的记录
// 同时在视频链接相关的各种业务场景中,比如查看特定视频链接详情、进行视频链接的排序展示等,也是重要的依据,方便对视频链接进行精准的管理和操作,
// 这里使用MD5哈希值假设MD5Hash代表的是基于视频相关特征生成的MD5哈希值作为唯一标识有助于保证数据的唯一性和准确性。
*/
@TableId("Md5Hash")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"HardLinkVideoAttribute"中,主键字段名为"Md5Hash"
// 即将类中的md5Hash属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private Long md5Hash;
/**
* String
// 在视频链接的权限管理、归属判断以及相关业务场景中起着重要作用,比如判断当前用户是否有权限查看、操作该视频链接,或者统计不同用户发布视频链接的情况等,都需要依据这个用户名来进行相应的处理。
*/
@TableField("DirID1")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"HardLinkVideoAttribute"中,该属性对应名为"DirID1"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改用户名信息。不过此处字段名"DirID1"看起来不太直观表示用户名,
// 可能在具体业务中有其特定含义或映射关系,需结合实际业务场景进一步理解。
private String dirId1;
/**
* 使
// 例如可能从不同维度来关联用户与视频链接的关系,具体含义需要参照具体的业务规则和数据库设计来确定,但总体来说都是用于明确视频链接发布者身份的重要属性。
*/
@TableField("DirID2")
private String dirId2;
/**
* byte[]使ByteArrayTypeHandler
// 有可能它存储的是基于视频相关内容比如视频文件本身计算出的MD5值如果按照合理推测可能和前面提到的MD5Hash有一定关联但又不同的用途用于数据验证、唯一性判断或者与其他系统交互时识别视频的关键标识等
// 具体作用还是要结合整个系统关于视频链接处理的业务逻辑来准确理解。
*/
@TableField(value = "Md5", typeHandler = ByteArrayTypeHandler.class)
private byte[] md5;
/**
* String"yyyy-MM-dd HH:mm:ss"
// 在视频链接的管理中,通过这个修改时间可以了解视频链接相关数据的更新情况,比如判断是否有新的变动、进行历史记录查询以及按照时间顺序对视频链接进行排序展示等业务操作,方便对视频链接的生命周期进行管理,
// 不过这里同样字段名"ModifyTime"更直观表示修改时间,和注释里“发布用户的用户名”不太相符,应按照实际业务场景准确理解其含义。
*/
@TableField("ModifyTime")
private String modifyTime;
/**
* String便
// 同时在文件存储、检索以及与其他系统进行文件相关交互等业务场景中,文件名也起着关键作用,有助于准确地定位和操作具体的视频文件对应的链接信息。
*/
@TableField("FileName")
private String fileName;
}

@ -0,0 +1,227 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.apache.ibatis.type.ByteArrayTypeHandler;
/**
*
* MyBatis Plus
* Lombok @Data GetterSetter便
*
* @author xcs
* &#064;date 20231225 1508
**/
@Data
@TableName(value = "MSG", autoResultMap = true)
// @TableName注解用于指定该实体类对应的数据库表名为 "MSG"autoResultMap = true表示自动映射结果集确保在进行数据库查询等操作后能准确地将结果映射到该实体对象的各个属性上
public class Msg {
/**
*
* @TableId "localId" IntegerIdType.AUTO
* 便
*/
@TableId(value = "localId", type = IdType.AUTO)
private Integer localId;
/**
* ID
* 使 @TableField "TalkerId" ID
*
*/
@TableField("TalkerId")
private Integer talkerId;
/**
* ID
* @TableField "MsgSvrID" ID
*
*/
@TableField("MsgSvrID")
private String msgSvrId;
/**
*
* @TableField "Type"
*
*/
@TableField("Type")
private Integer type;
/**
*
* @TableField "SubType"
* 便
*/
@TableField("SubType")
private Integer subType;
/**
*
* 使 @TableField "IsSender" 10
*
*/
@TableField("IsSender")
private Integer isSender;
/**
*
* @TableField "CreateTime" 便
*
*/
@TableField("CreateTime")
private Integer createTime;
/**
* 0
* @TableField "Sequence" 0
* 使
*/
@TableField("Sequence")
private Long sequence;
/**
* 0
* @TableField "StatusEx" 0
*
*/
@TableField("StatusEx")
private Integer statusEx;
/**
*
* 使 @TableField "FlagEx"
*
*/
@TableField("FlagEx")
private Integer flagEx;
/**
*
* @TableField "Status" 便
*
*/
@TableField("Status")
private Integer status;
/**
*
* @TableField "MsgServerSeq" 使
*
*/
@TableField("MsgServerSeq")
private Integer msgServerSeq;
/**
*
* @TableField "MsgSequence"
* 使
*/
@TableField("MsgSequence")
private Integer msgSequence;
/**
*
* 使 @TableField "StrTalker"
* 便
*/
@TableField("StrTalker")
private String strTalker;
/**
*
* @TableField "StrContent"
*
*/
@TableField("StrContent")
private String strContent;
/**
*
* @TableField "DisplayContent"
*
*/
@TableField("DisplayContent")
private String displayContent;
/**
* 0 0
* 使 @TableField "Reserved0" 0
* 便
*/
@TableField("Reserved0")
private Integer reserved0;
/**
* 1 0
* @TableField "Reserved1" 0 Reserved0 使
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2 0
* @TableField "Reserved2" 0
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3 0
* @TableField "Reserved3" 0
*/
@TableField("Reserved3")
private Integer reserved3;
/**
* 4
* 使 @TableField "Reserved4"
* 使
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5
* @TableField "Reserved5" Reserved4
* 便
*/
@TableField("Reserved5")
private String reserved5;
/**
* 6
* @TableField "Reserved6"
*
*/
@TableField("Reserved6")
private String reserved6;
/**
*
* "CompressContent" 使 ByteArrayTypeHandler
* 便
*/
@TableField(value = "CompressContent", typeHandler = ByteArrayTypeHandler.class)
private byte[] compressContent;
/**
*
* @TableField "BytesExtra" 使 ByteArrayTypeHandler
*
*/
@TableField(value = "BytesExtra", typeHandler = ByteArrayTypeHandler.class)
private byte[] bytesExtra;
/**
*
* 使 @TableField "BytesTrans" ByteArrayTypeHandler
*
*/
@TableField(value = "BytesTrans", typeHandler = ByteArrayTypeHandler.class)
private byte[] bytesTrans;
}

@ -0,0 +1,137 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* Session
* 便
* @author xcs
* &#064;date 20231221 1705
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getUsrName()、getUnReadCount()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问会话的具体属性信息时比如查看用户名、获取未读消息计数等这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当会话的内容发生变化
// 可以通过调用setContent(String newContent)方法来更新content属性的值从而保证对象的属性能够灵活地反映会话相关信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将Session对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前会话对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个Session对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及会话对象比较的业务逻辑中(如判断两个会话的信息是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@TableName("Session")
// @TableName注解来自MyBatis Plus框架用于指定该实体类对应的数据库表名这里表明Session类对应的数据库表名为"Session"
// 明确了该类与数据库表之间的映射关系,方便后续进行数据库操作(如数据的插入、查询、更新、删除等)时能准确地找到对应的表,确保数据的正确交互。
public class Session {
/**
* String
// 在整个系统中,不同用户的会话记录通过这个用户名进行区分,通过这个用户名可以在数据库操作(如查询、更新、删除等)以及业务逻辑处理中准确地定位到具体用户的会话相关记录,
// 并且在展示会话列表、判断会话归属等场景下,也是重要的依据,确保会话数据与对应的用户能准确匹配。
*/
@TableId("strUsrName")
// @TableId注解用于指定该属性对应的数据库表中的主键字段名这里表明在数据库表"Session"中,主键字段名为"strUsrName"
// 即将类中的usrName属性与数据库表中的主键列进行了关联确保了在数据库操作时能根据这个主键进行准确的记录定位和操作保证数据的完整性和一致性。
private String usrName;
/**
* Integer
// 在会话列表展示等场景中,这个计数可以直观地提示用户有多少新消息等待查看,方便用户及时了解是否有未处理的消息,
// 同时在消息提醒、未读消息管理等业务逻辑中起着重要作用,例如可以根据未读消息数量决定是否进行特殊的提醒标识等操作。
*/
@TableField("nUnReadCount")
// @TableField注解用于指定该属性对应的数据库表中的字段名这里表示在数据库表"Session"中,该属性对应名为"nUnReadCount"的字段,
// 明确了类属性与数据库表字段之间的映射关系,确保数据的正确存储和读取,便于与数据库进行交互来获取和修改未读消息计数信息。
private Integer unReadCount;
/**
* String
// 它可能用于关联到会话所属的某个更高层级的实体(比如会话所在的分组、聊天窗口等),或者指向与该会话有特定关联关系的其他对象,
// 在涉及会话的组织架构、关联关系梳理以及复杂业务逻辑处理中会用到这个属性来建立不同实体之间的联系。
*/
@TableField("parentRef")
private String parentRef;
/**
* String
// 在会话展示等场景中,昵称更便于用户直观地识别会话对象,增强了用户与用户之间交互的友好性,相较于用户名,昵称更具亲和力,方便用户快速知晓对方身份。
*/
@TableField("strNickName")
private String nickName;
/**
* Integer
// 例如可以用不同的整数值来区分会话是正常开启状态、已关闭状态、冻结状态等不同情况,在会话的管理、操作判断等业务逻辑中会依据这个状态属性来进行相应的处理,
// 比如根据会话状态决定是否允许发送消息等操作。
*/
@TableField("nStatus")
private Integer status;
/**
* Integer
// 在消息发送的相关业务逻辑中,通过这个标识可以判断消息是否准确传达,便于进行后续的处理,比如重新发送失败的消息等操作。
*/
@TableField("nIsSend")
private Integer isSend;
/**
* String
// 无论是文本消息、表情等都可以以相应的文本形式存储在这里(如果涉及复杂的多媒体消息等可能会有其他关联处理方式),在展示会话历史记录、查看具体消息详情等场景中会用到这个属性来呈现消息内容。
*/
@TableField("strContent")
private String content;
/**
* Integer
// 例如可以用不同的整数值来区分是文本消息、图片消息、语音消息、视频消息等不同类型的消息,在消息的展示、处理逻辑中,会根据这个类型属性来采取不同的展示方式、业务操作,
// 以满足多样化的消息交互需求,比如对于图片消息要进行图片加载展示,对于语音消息要提供播放功能等。
*/
@TableField("nMsgType")
private Integer msgType;
/**
* IDInteger
// 通过这个ID可以在本地数据库或者相关存储中准确地定位到具体的消息记录方便进行消息的查询、更新、删除等操作
// 同时在消息的关联、排序以及与其他系统交互涉及消息标识等业务场景中起着重要作用,确保消息管理的准确性和便捷性。
*/
@TableField("nMsgLocalID")
private Integer msgLocalId;
/**
* Integer
// 类似消息的发送状态,但可能涵盖更广泛的情况,比如消息是否已读、是否被撤回、是否审核通过(如果有审核机制的话)等不同状态,
// 在消息管理、消息提醒以及相关业务逻辑中会依据这个状态属性来进行相应的处理,例如根据消息是否已读来决定是否取消未读提醒等操作。
*/
@TableField("nMsgStatus")
private Integer msgStatus;
/**
* Integer19701100:00:00 UTC
// 到消息实际发送或接收时刻所经过的秒数或者毫秒数(具体取决于系统的时间精度设定),通过这个时间戳,可以准确判断消息的先后顺序、进行消息的排序展示(按照时间顺序),
// 以及在一些基于时间范围的查询(如查看某一时间段内的消息记录)等业务场景中发挥作用,方便对会话中的消息进行时间维度的管理。
*/
@TableField("nTime")
private Integer time;
/**
* String
// 当用户对已发送的消息进行修改后,修改后的内容就会存储在这里,方便在查看消息历史记录时能够体现消息的变化情况,同时也便于进行相关的业务逻辑处理,比如记录消息编辑的日志等操作。
*/
@TableField("editContent")
private String editContent;
/**
* @Integer@
// 例如值为1表示有其他人@我值为0表示没有在消息提醒、重点消息关注等业务逻辑中会用到这个标识方便用户快速定位到与自己相关的重要消息内容。
*/
@TableField("othersAtMe")
private Integer othersAtMe;
}

@ -0,0 +1,52 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* SQLite
* SQLite "sqlite_master" MyBatis Plus
* Lombok @Data GetterSetter便访
*
* @author xcs
* &#064;date 202461309:18:29
*/
@Data
@TableName("sqlite_master")
// @TableName注解用于指定该实体类对应的数据库表名为 "sqlite_master"表明这个类是与SQLite数据库中的该系统表相关联的实体映射类
public class SqliteMaster {
/**
* type
* 使 @TableField "type" "sqlite_master" "type"
* 'table''index''view'
*/
@TableField("type")
private String type;
/**
* tblName
* @TableField "tbl_name"
* "sqlite_master" 便
*/
@TableField("tbl_name")
private String tblName;
/**
* rootPage
* @TableField "rootpage" SQLite"rootpage"
*
*/
@TableField("rootpage")
private String rootPage;
/**
* sql
* 使 @TableField "sql" "sqlite_master" "sql" SQL
* 使CREATE TABLE
*/
@TableField("sql")
private String sql;
}

@ -0,0 +1,156 @@
package com.xcs.wx.domain.bo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
/**
* 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" 子元素,用于存储应用的名称,用于明确该应用的标识等情况。
}
}

@ -0,0 +1,36 @@
package com.xcs.wx.domain.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 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;
}

@ -0,0 +1,235 @@
package com.xcs.wx.domain.bo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
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;
// 关联 "emoji" 元素的属性 "attachedtext",用于存储与表情符号相关联的附加文本信息,例如表情的说明文字、提示语等,

@ -0,0 +1,251 @@
package com.xcs.wx.domain.bo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
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;
/**
* 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" 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" 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 "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表示这个属性对应的是XML元素的属性而不是子元素
// 对应 "url" 元素的属性 "type",用于存储链接的类型信息

@ -0,0 +1,32 @@
package com.xcs.wx.domain.bo;
import lombok.Builder;
import lombok.Data;
// UserBO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@Builder
//自动生成一种被称为 “建造者Builder” 模式的代码实现
public class UserBO {
//初始化文件目录...
private String basePath;
//初始化微信id..
private String wxId;
//初始化昵称..
private String nickname;
//初始化版本号..
private String version;
//初始化账号..
private String account;
//初始化手机号
private String mobile;
}

@ -0,0 +1,37 @@
package com.xcs.wx.domain.bo;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlCData;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.Data;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@JsonIgnoreProperties(ignoreUnknown = true)
//这个注解告诉Jackson在进行JSON反序列化时忽略那些在目标对象中不存在对应属性的未知属性
//防止因为额外的、不认识的JSON字段而抛出异常
@JacksonXmlRootElement(localName = "voipmsg")
//用于指定在将对象序列化为XML时这个类对应的XML根元素的名称为"voipmsg"
public class VoipMsgBO {
@JacksonXmlProperty(localName = "VoIPBubbleMsg")
private VoIPBubbleMsg voIPBubbleMsg;
//使用JacksonXmlProperty注解指定这个字段在序列化为XML时对应的元素名称为"VoIPBubbleMsg"
//它的类型是内部定义的VoIPBubbleMsg类用于封装相关的数据
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class VoIPBubbleMsg {
//定义了一个内部静态类同样使用了Data注解和JsonIgnoreProperties注解具备和外部类类似的功能
@JacksonXmlCData
@JacksonXmlProperty(localName = "msg")
private String msg;
//@JacksonXmlCData注解表示这个字段在序列化为XML时其内容会被包裹在<![CDATA[...]]>中
//通常用于包含可能包含特殊XML字符如<、>等的数据防止XML解析出错
//@JacksonXmlProperty注解指定该字段在XML中的元素名称为"msg",它用于存储一个字符串类型的消息内容
}
}

@ -0,0 +1,21 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@EqualsAndHashCode(callSuper = true)
//Lombok 提供的便捷工具用于自动帮你生成equals和hashCode方法的实现代码减少手动编写这些相对样板化代码的工作量
public class ChatRoomDTO extends PageDTO {
//初始化群聊标题...
private String chatRoomTitle;
//初始化群昵称...
private String selfDisplayName;
//初始化创建人...
private String createBy;
}

@ -0,0 +1,23 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@EqualsAndHashCode(callSuper = true)
//Lombok 提供的便捷工具用于自动帮你生成equals和hashCode方法的实现代码减少手动编写这些相对样板化代码的工作量
public class ContactDTO extends PageDTO {
//初始化备注
private String remark;
//初始化昵称
private String nickName;
//初始化标签id
private String labels;
//初始化描述
private String describe;
}

@ -0,0 +1,32 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class DecryptDTO {
//初始化pid
private int pid;
//初始化文件目录
private String basePath;
//初始化微信id
private String wxId;
//初始化昵称
private String nickname;
//初始化版本号
private String version;
//初始化账号
private String account;
//初始化手机号
private String mobile;
}

@ -0,0 +1,25 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@EqualsAndHashCode(callSuper = true)
//Lombok 提供的便捷工具用于自动帮你生成equals和hashCode方法的实现代码减少手动编写这些相对样板化代码的工作量
public class FeedsDTO extends PageDTO {
//初始化用户名
private String userName;
//初始化开始时间
private Long startTime;
//初始化结束时间
private Long endTime;
}

@ -0,0 +1,15 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class PageDTO {
//初始化当前页数
private Long current;
//初始化页数大小
private Long pageSize;
}

@ -0,0 +1,20 @@
package com.xcs.wx.domain.dto;
//导入库
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@EqualsAndHashCode(callSuper = true)
//Lombok 提供的便捷工具用于自动帮你生成equals和hashCode方法的实现代码减少手动编写这些相对样板化代码的工作量
public class RecoverContactDTO extends PageDTO{
//初始化nickname
private String nickname;
//初始化c2remark
private String remark;
}

@ -0,0 +1,19 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//AllContactVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class AllContactVO {
//用户名
private String userName;
//昵称。
private String nickName;
}

@ -0,0 +1,27 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
// CardLinkVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class CardLinkVO {
//title
private String title;
//sourceDisplayName
private String sourceDisplayName;
//des
private String des;
// url
private String url;
}

@ -0,0 +1,54 @@
package com.xcs.wx.domain.vo;
//导入库
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.List;
// ChatRoomDetailVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ChatRoomDetailVO {
//群聊名称
private String chatRoomName;
//群聊标题
private String chatRoomTitle;
// 自己在聊天室中的显示名称。
private String selfDisplayName;
//创建人
private String createBy;
//头像
private String headImgUrl;
//预留字段2
@JsonIgnore
//在处理 JSON 序列化和反序列化时,控制对象的属性是否参与序列化和反序列化过程
private String reserved2;
//roomData
@JsonIgnore
//在处理 JSON 序列化和反序列化时,控制对象的属性是否参与序列化和反序列化过程
private byte[] roomData;
//群聊信息
private ChatRoomInfoVO chatRoomInfo;
//群成员
private List<ChatRoomMemberVO> members;
}

@ -0,0 +1,39 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//ChatRoomInfoVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ChatRoomInfoVO {
//聊天室公告内容。
private String announcement;
//信息版本号,默认为 0。
private Integer infoVersion;
//公告编辑者。
private String announcementEditor;
//公告发布人
private String announcementPublisher;
//公告发布时间,存储为时间戳,默认为 0。
private Long announcementPublishTime;
//公告发布时间
private String strAnnouncementPublishTime;
//聊天室状态,默认为 0。
private Integer chatRoomStatus;
}

@ -0,0 +1,35 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//ChatRoomMemberVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ChatRoomMemberVO {
/**
*id
*/
private String wxId;
/**
*
*/
private String remark;
/**
*
*/
private Integer state;
/**
*
*/
private String headImgUrl;
}

@ -0,0 +1,53 @@
package com.xcs.wx.domain.vo;
//导入库
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
//ChatRoomVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ChatRoomVO {
//聊天室名称
private String chatRoomName;
//群聊标题
private String chatRoomTitle;
//是否显示名称的标志
private Integer isShowName;
//自己在聊天室中的显示名称。
private String selfDisplayName;
//创建人
private String createBy;
//头像
private String headImgUrl;
//群聊是否已经解散
private Boolean dissolution;
//是否为企业微信群
private Boolean enterprise;
//群聊数据
@JsonIgnore
private byte[] roomData;
//群聊人数
private Integer memberCount;
}

@ -0,0 +1,19 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//ContactLabelVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ContactLabelVO {
//标签Id
private String labelId;
//标签名称
private String labelName;
}

@ -0,0 +1,45 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
import java.util.List;
//ContactVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class ContactVO {
//用户名
private String userName;
//别名。
private String alias;
//备注信息。
private String remark;
//昵称。
private String nickName;
//描述
private String describe;
// 头像
private String headImgUrl;
//标签Id
private String labelIdList;
//标签
private List<String> labels;
}

@ -0,0 +1,23 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
// CountRecentMsgsVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class CountRecentMsgsVO {
// 类型
private String type;
//值
private Long value;
//分类
private String category;
}

@ -0,0 +1,19 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//DatabaseVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class DatabaseVO {
//文件路径
private String filePath;
//文件大小
private String fileSize;
}

@ -0,0 +1,31 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Builder;
import lombok.Data;
//DecryptVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@Builder
//在编译阶段自动生成一些 Java 样板代码如构造函数、getter/setter 方法等,以减少开发人员编写的冗余代码量。
public class DecryptVO {
//文件名称
private String fileName;
//文件大小
private String fileSize;
//当前进度
private int currentProgress;
//总数量
private int total;
}

@ -0,0 +1,90 @@
package com.xcs.wx.domain.vo;
//导入库
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import lombok.Data;
// ExportChatRoomVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
//用于自定义某种内容的样式。
// 其中horizontalAlignment = HorizontalAlignmentEnum.CENTER表示设置内容的水平对齐方式为居中。
public class ExportChatRoomVO {
//群号
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("群号")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String chatRoomName;
//群聊名称
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("群聊名称")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String chatRoomTitle;
//备注
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("备注")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String selfDisplayName;
//创建人
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("创建人")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String createBy;
//群聊是否已经解散
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("群聊是否已经解散")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Boolean dissolution;
//是否为企业微信群
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("是否为企业微信群")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Boolean enterprise;
//群聊数据
@ExcelIgnore
//它的主要作用是在将 Java 对象的数据导出到 Excel 文件或者从 Excel 文件读取数据并映射到 Java 对象时
// ,指定被该注解标记的属性将被忽略。
private byte[] roomData;
//群聊人数
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("群聊人数")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Integer memberCount;
}

@ -0,0 +1,72 @@
package com.xcs.wx.domain.vo;
//导入库
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import lombok.Data;
// ExportContactVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
//用于自定义某种内容的样式。
// 其中horizontalAlignment = HorizontalAlignmentEnum.CENTER表示设置内容的水平对齐方式为居中。
public class ExportContactVO {
//用户名
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("微信Id")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String userName;
// 别名
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("微信号")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String alias;
//备注
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("备注")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String remark;
// 昵称
@ColumnWidth(30)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("昵称")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String nickName;
//描述
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("描述")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String describe;
//标签Id
@ColumnWidth(20)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("标签Id")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String labelIdList;
}

@ -0,0 +1,81 @@
package com.xcs.wx.domain.vo;
//导入库
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.enums.poi.HorizontalAlignmentEnum;
import lombok.Data;
//ExportMsgVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
//用于自定义某种内容的样式。
// 其中horizontalAlignment = HorizontalAlignmentEnum.CENTER表示设置内容的水平对齐方式为居中。
public class ExportMsgVO {
//消息服务器 ID
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("消息Id")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String msgSvrId;
//聊天人Id
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用,这里的 “25” 应该是代表某种宽度的度量单位,
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("聊天人Id")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String wxId;
//消息类型
@ColumnWidth(10)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("类型")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Integer type;
//消息子类型
@ColumnWidth(10)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("子类型")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Integer subType;
// 是否为发送者
@ColumnWidth(15)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("是否发送者")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private Integer isSender;
//消息创建时间
@ColumnWidth(25)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("创建时间")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String strCreateTime;
//消息内容字符串
@ColumnWidth(80)
//一个用于指定列宽度的注解。通常在表格相关的编程场景中使用
// 可能是像素px、点pt或者字符宽度等具体取决于使用这个注解的框架或库的定义。
@ExcelProperty("消息内容")
//用于在将数据导出到 Excel 文件或者从 Excel 文件读取数据时,对 Excel 中的列进行标识。
private String strContent;
}

@ -0,0 +1,31 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//FeedsLocationVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class FeedsLocationVO {
//poiClassifyId
private String poiClassifyId;
//poiName
private String poiName;
//poiAddress
private String poiAddress;
//poiClassifyType
private Integer poiClassifyType;
//city
private String city;
}

@ -0,0 +1,19 @@
package com.xcs.wx.domain.vo;
//导入库
import lombok.Data;
//FeedsMediaVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class FeedsMediaVO {
//大图Url
private String url;
// 缩略图Url
private String thumb;
}

@ -0,0 +1,81 @@
package com.xcs.wx.domain.vo;
//导入库
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.List;
//FeedsVO
@Data
//使用Lombok的Data注解会自动为类中的非静态、非final字段生成对应的getter、setter方法
//以及toString、equals、hashCode方法简化代码编写减少样板代码量
public class FeedsVO {
//动态的唯一标识ID。
private Long feedId;
//创建时间,存储为整数形式。
@JsonIgnore
//在处理 JSON 序列化和反序列化时,控制对象的属性是否参与序列化和反序列化过程
private Integer createTime;
//创建时间
private String strCreateTime;
//故障ID用于记录相关故障信息。
private Integer faultId;
//动态的类型。
private Integer type;
//发布用户的用户名。
private String userName;
//发布用户的用户名。
private String nickName;
//动态的状态。
private Integer status;
//扩展标志,用于存储额外信息。
private Integer extFlag;
//隐私标志,指示动态的隐私级别。
private Integer privFlag;
//字符串ID可能用于关联其他数据。
private String stringId;
//动态的内容文本。
@JsonIgnore
//在处理 JSON 序列化和反序列化时,控制对象的属性是否参与序列化和反序列化过程
private String content;
//内容描述
private String contentDesc;
//媒体内容
private List<FeedsMediaVO> medias;
// 位置
private FeedsLocationVO location;
//联系人头像
private String headImgUrl;
}

@ -0,0 +1,45 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* MsgTypeDistributionVOValue ObjectVO
* VO
*
*
* 便
*
* @author xcs
**/
@Data
// @Data注解由Lombok库提供它的功能非常实用会自动为该类生成一系列常用的方法。
// 具体来说它会为类中的每一个私有属性自动生成对应的getter方法用于获取属性的值和setter方法用于设置属性的值
// 同时还会生成toString方法方便将对象以字符串形式展示常用于调试或者日志输出等场景能直观看到对象的属性值情况
// hashCode方法在涉及基于哈希的数据结构如HashMap等进行对象存储和查找等操作时会用到用于快速定位对象以及
// equals方法用于比较两个对象是否在逻辑上相等即属性值是否都相等通过使用这个注解大大简化了代码编写过程中
// 手动去编写这些重复且常规的方法的工作量,让代码更加简洁、易读和易维护。
@AllArgsConstructor
// @AllArgsConstructor注解同样来自Lombok库它会自动为这个类生成一个包含所有参数的构造函数。
// 例如对于这个MsgTypeDistributionVO类就会生成一个构造函数其参数顺序和类型与类中的属性声明顺序和类型一致
// 像这样public MsgTypeDistributionVO(String type, Integer value) {...}
// 这样在创建该类的对象实例时,就可以很方便地通过传入对应参数来完成对象的初始化,提高了代码的便利性和可读性,
// 尤其是当需要一次性为对象的多个属性赋值时不用再逐个调用setter方法来设置属性值了。
public class MsgTypeDistributionVO {
/**
* String
* "TEXT""IMAGE"
* 便
*/
private String type;
/**
* Integer
* 100"TEXT"
* value100便
*
*/
private Integer value;
}

@ -0,0 +1,196 @@
package com.xcs.wx.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
/**
* MsgVOValue ObjectVO
* 便访
*
*
* @author xcs
**/
@Data
// @Data注解是由Lombok库提供的便捷注解它会自动为该类生成多个实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法通过这些方法外部代码可以方便地获取类中各个属性的值
// 这在访问对象的具体属性信息时非常有用,例如获取消息的类型、内容等。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够对类中的属性进行赋值操作
// 便于根据业务需求动态地修改对象的属性值,比如更新消息的创建时间、聊天者信息等。
// - 自动生成toString方法该方法将对象以一种易于阅读的字符串形式表示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速直观地查看对象的具体状态了解各个属性的当前取值情况。
// - 自动生成hashCode方法这个方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会被用到
// 它根据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便快速查找和比较对象。
// - 自动生成equals方法用于比较两个MsgVO对象是否在逻辑上相等即判断它们的所有属性值是否都完全相同
// 在涉及对象比较的业务逻辑中(如判断两条消息是否完全一致),该方法起着关键作用。
// 通过使用@Data注解大大减少了手动编写这些重复且基础的方法的工作量使代码更加简洁、易读和易维护。
public class MsgVO {
/**
*
* 1
* 使
*
*/
private Integer localId;
/**
* ID
* ID
* IDID
*
*/
private String msgSvrId;
/**
*
* 1234
*
*
*/
private Integer type;
/**
*
* type
* JPEGPNG
*
* 使
*/
private Integer subType;
/**
*
*
*
*
*
*/
private Long sequence;
/**
* 使10
*
*
*
*/
private Integer isSender;
/**
* 19701100:00:00 UTCUnix
*
*
*
*
*/
private Long createTime;
/**
* 便
* 使使"yyyy-MM-dd HH:mm:ss"
* -- ::
*
*/
private String strCreateTime;
/**
*
*
*
*
*
*/
private String strContent;
/**
*
*
* 便
*
*/
private String referMsgContent;
/**
*
* ID
* 便
* 使
*/
private String strTalker;
/**
*
*
* Base64
* 使
*/
private String avatar;
/**
* Md5URLMD5
* MD5
* MD5
* MD5
*/
private String imgMd5;
/**
* 便
* Base64便使
*
*
*/
private String thumb;
/**
*
* Base64使
*
*
*/
private String image;
/**
* Url使
* Url
*
*/
private String emojiUrl;
/**
* compressContent
* @JsonIgnore
* JSONJavaJSONJSONJava
* JSONJSON
*
*/
@JsonIgnore
private byte[] compressContent;
/**
* bytesExtra
* IP
* compressContent@JsonIgnoreJSON
* 使
*/
@JsonIgnore
private byte[] bytesExtra;
/**
* WeAppInfoVOWeAppInfoVO
* MsgVOweAppInfo便ID
*
* WeAppInfoVO
* 便
*/
private WeAppInfoVO weAppInfo;
/**
* CardLinkVOCardLinkVO
*
*
* CardLinkVO便
*
*/
private CardLinkVO cardLink;}

@ -0,0 +1,66 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* PageVOValue ObjectVO
* 使 <T>使
* 访
*
*
* @author xcs
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体包括
// - 为类中的每一个私有属性自动生成对应的getter方法方便外部代码获取各个属性的值。例如在其他类中可以通过调用getCurrent()方法获取当前页数,
// 调用getPageSize()方法获取每页显示的数据条数等,这有助于对分页相关属性进行访问和使用。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值。比如根据用户的选择改变当前页数或者每页显示的数量等
// 增强了对象属性值的可修改性和灵活性。
// - 生成toString方法该方法能将PageVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前分页对象的具体状态了解各个分页属性的取值情况便于排查问题。
// - 生成hashCode方法在将PageVO对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个PageVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及分页数据比较的业务逻辑中(如判断两个分页结果是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@AllArgsConstructor
// @AllArgsConstructor注解同样来自Lombok库它会自动为这个类生成一个包含所有参数的构造函数。
// 对于PageVO类来说这个构造函数的参数顺序和类型与类中的属性声明顺序和类型是一一对应的
// 即构造函数形如public PageVO(Long current, Long pageSize, Long total, List<T> records) {...}。
// 这样在创建PageVO对象实例时就可以很方便地一次性传入当前页数、页数大小、总页数以及查询结果数据列表这些参数来完成对象的初始化
// 提高了代码创建分页对象的便利性和可读性尤其是在需要同时为多个属性赋值时避免了逐个调用setter方法来设置属性值的繁琐操作。
public class PageVO<T> {
/**
* 11
* 3
*
* 便
*/
private Long current;
/**
* 1010
*
* 便
*/
private Long pageSize;
/**
*
* 1001010
*
*
*/
private Long total;
/**
* 使List<T>T
* TUserVO
* TProductVO
* 便
*/
private List<T> records;
}

@ -0,0 +1,41 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* RecentUsedKeyWordVOValue ObjectVO使
* VO便
*
*
* @author xcs
**/
@Data
// @Data注解由Lombok库提供它为该类自动生成了多个常用的方法具体如下
// - 自动生成对应的getter方法通过这个方法名为getText())可以方便地从对象中获取关键字的字符串内容,
// 在其他类需要访问这个关键字信息时,只需调用该方法即可,使得对关键字属性的访问更加便捷、规范。
// - 自动生成对应的setter方法名为setText(String text)),允许外部代码根据业务需求对关键字进行修改,
// 例如当用户输入了新的最近使用关键字时可以通过调用这个setter方法来更新对象中的关键字内容增强了对象属性的可操作性。
// - 生成toString方法该方法能将RecentUsedKeyWordVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及关键字的具体值
// 在调试程序或者记录日志等场景下通过打印对象的toString结果可以快速查看当前关键字的具体情况有助于排查问题和了解对象状态。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它根据对象的关键字属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便快速查找和比较对象。
// - 生成equals方法用于比较两个RecentUsedKeyWordVO对象是否在逻辑上相等也就是判断它们所包含的关键字内容是否完全相同
// 在涉及关键字比较的业务逻辑中(比如判断两个最近使用的关键字是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@AllArgsConstructor
// @AllArgsConstructor注解同样来自Lombok库它会自动为这个类生成一个包含所有参数的构造函数
// 对于RecentUsedKeyWordVO类而言构造函数的形式为public RecentUsedKeyWordVO(String text) {...}
// 这意味着在创建该类的对象实例时,只需要传入表示关键字的字符串参数即可完成对象的初始化,操作非常简便,
// 提高了创建对象时传递关键字数据的便利性和代码的可读性,使得代码在实例化这类对象时更加简洁明了。
public class RecentUsedKeyWordVO {
/**
* String
* 使
* 使便
* 使
*/
private String text;
}

@ -0,0 +1,68 @@
package com.xcs.wx.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
/**
* RecoverContactVOValue ObjectVO
* Excel使
* 使
*
* @author xcs
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体包括
// - 自动生成所有私有属性对应的getter方法方便外部代码获取各个属性的值例如通过调用getDocId()、getAlias()等方法来获取相应属性内容,
// 这有助于在其他类中访问RecoverContactVO对象的具体属性信息。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值比如可以通过调用setAlias(String alias)等方法来更新属性值,
// 增强了对象属性的可操作性,便于数据的动态变化和处理。
// - 生成toString方法该方法能将RecoverContactVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个RecoverContactVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及对象比较的业务逻辑中(如判断两个联系人信息是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
public class RecoverContactVO {
/**
*
* 1
* 便
* 使@ExcelIgnore使Excel
* ExcelExcel
*
*/
@ExcelIgnore
private Integer docId;
/**
* alias使@ExcelPropertyExcel
* 使ExcelRecoverContactVOExcel
* 使@ColumnWidth50Excel50Excel
* Excel使便
*/
@ExcelProperty("微信号")
@ColumnWidth(50)
private String alias;
/**
* nickname@ExcelPropertyExcel
* Excel便
* 使@ColumnWidth100Excel
*/
@ExcelProperty("昵称")
@ColumnWidth(100)
private String nickname;
/**
* c2remark使@ExcelPropertyExcel
* 使Excel便
* @ColumnWidth(100)Excel
*/
@ExcelProperty("备注")
@ColumnWidth(100)
private String remark;
}

@ -0,0 +1,134 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* ResponseVOValue ObjectVO
* JSON
* 使便
*
* @author xcs
* &#064;date 20231225 1731
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 为类中的每一个私有属性自动生成对应的getter方法方便外部代码获取各个属性的值例如可以通过调用getSuccess()获取业务编码状态,
// 通过getErrorCode()获取错误编码等,便于对响应结果中的各部分信息进行访问和后续处理。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值比如在构建响应对象时
// 通过调用setSuccess(boolean success)方法来设置业务是否成功等,增强了对象属性值的可修改性和灵活性。
// - 生成toString方法该方法能将ResponseVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前响应对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个ResponseVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及响应结果比较的业务逻辑中(如判断两次相同操作的响应是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
public class ResponseVO<T> {
/**
* 使Booleantruefalse
* 便
*
*/
private Boolean success;
/**
* Integer
* Web10011002便
*
*/
private Integer errorCode;
/**
* String
* 便
*
*/
private String errorMessage;
/**
* 使
* 便
* 1total使
*/
private Long page;
/**
* 使page
* 便100210
*
*/
private Long total;
/**
* 使
* 12
*
*/
private Integer showType;
/**
* T
* TUserVO
* TProductVO
*/
private T data;
/**
* 便ResponseVO
* dataResponseVO
* successtruedataResponseVO
* 便
*
* @param data T
* @param <T> 使
* @return ResponseVO<T>ResponseVO
*/
public static <T> ResponseVO<T> ok(T data) {
ResponseVO<T> wrapper = new ResponseVO<>();
wrapper.setSuccess(true);
wrapper.setData(data);
return wrapper;
}
/**
* ok(T data)pagetotal
* datapagetotal
* ResponseVOtruedatapagetotal
* 便
*
* @param data T
* @param <T> 使
* @param page 1
* @param total page
* @return ResponseVO<T>ResponseVO
*/
public static <T> ResponseVO<T> ok(T data, Long page, Long total) {
ResponseVO<T> wrapper = new ResponseVO<>();
wrapper.setSuccess(true);
wrapper.setData(data);
wrapper.setPage(page);
wrapper.setTotal(total);
return wrapper;
}
/**
* ResponseVOerrorCodeerrorMessage
* 便ResponseVO
* successfalseerrorCodeerrorMessage
* showType2ResponseVO
* 使便便
*
* @param <T> 使
* ResponseVOT
* @return ResponseVO<T>ResponseVO
*/
public static <T> ResponseVO<T> error(Integer errorCode, String errorMessage) {
ResponseVO<T> wrapper = new ResponseVO<>();
wrapper.setSuccess(false);
wrapper.setErrorCode(errorCode);
wrapper.setShowType(2);
wrapper.setErrorMessage(errorMessage);
return wrapper;
}
}

@ -0,0 +1,68 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* SessionVOValue ObjectVO
* 线便
*
*
* @author xcs
* &#064;date 20231221 1813
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法通过这些方法例如getUserName()、getNickName()等),外部代码可以方便地获取类中各个属性的值,
// 这在访问会话相关的具体属性信息时非常有用,比如在展示会话信息时获取用户名、用户昵称等内容。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够对类中的属性进行赋值操作便于根据业务需求动态地修改对象的属性值
// 例如当用户更新了昵称就可以通过调用setNickName(String newNickName)方法来更新nickName属性的值。
// - 生成toString方法该方法能将SessionVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前会话对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法这个方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会被用到
// 它根据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便快速查找和比较对象。
// - 生成equals方法用于比较两个SessionVO对象是否在逻辑上相等即判断它们的所有属性值是否都完全相同
// 在涉及会话对象比较的业务逻辑中(如判断两个会话是否为同一用户、同一时间等情况),该方法起着关键作用。
// 通过使用@Data注解大大减少了手动编写这些重复且基础的方法的工作量使代码更加简洁、易读和易维护。
public class SessionVO {
/**
* String
*
*
*/
private String userName;
/**
*
* 便
*
*/
private String nickName;
/**
*
*
*/
private String content;
/**
* IntegerUnix19701100:00:00 UTC
*
* 便
*/
private Integer time;
/**
*
* 10:301030 15:20便
* 便
*/
private String shortTime;
/**
* Url
* 使
*
*/
private String headImgUrl;
}

@ -0,0 +1,62 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* StatsPanelVOValue ObjectVO
*
* 便便
*
* @author xcs
* &#064;date 20240123 1725
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法通过这些方法例如getContact()、getChatRoom()等),外部代码可以方便地获取类中各个属性的值,
// 这在访问统计面板相关的具体属性信息时非常有用,比如在前端页面展示统计数据时获取联系人数量、群聊数量等内容,便于进行数据展示和后续处理。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够对类中的属性进行赋值操作便于根据业务需求动态地修改对象的属性值
// 例如当有新的联系人添加或者消息收发情况发生变化时可以通过调用相应的setter方法来更新对象中的属性值增强了对象属性的可操作性和灵活性。
// - 生成toString方法该方法能将StatsPanelVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前统计面板对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个StatsPanelVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及统计数据比较的业务逻辑中(如判断不同时间段或者不同用户的统计面板数据是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@AllArgsConstructor
// @AllArgsConstructor注解同样来自Lombok库它会自动为这个类生成一个包含所有参数的构造函数
// 对于StatsPanelVO类而言构造函数的形式为public StatsPanelVO(Integer contact, Integer chatRoom, Integer sent, Integer received) {...}
// 这意味着在创建该类的对象实例时,只需要依次传入表示联系人数量、群聊数量、今日发送消息数量以及今日接收消息数量的整数参数,即可完成对象的初始化,
// 操作非常简便,提高了创建对象时传递统计数据的便利性和代码的可读性,使得代码在实例化这类对象时更加简洁明了。
public class StatsPanelVO {
/**
* 使Integer
*
*
*/
private Integer contact;
/**
*
*
* 便
*/
private Integer chatRoom;
/**
*
*
* 使
*/
private Integer sent;
/**
*
*
*
/
*/
private Integer received;
}

@ -0,0 +1,55 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* TopContactsVOValue ObjectVO
* 便
* 使便
*
* @author xcs
* &#064;date 20240106 1538
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体作用如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getUserName()、getNickName()等方法,外部代码可以方便地获取类中各个属性的值,
// 这在需要访问联系人的具体属性信息时非常有用,比如在前端页面展示联系人信息时获取用户名、昵称等内容,便于数据的展示和使用。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当联系人更新了昵称
// 可以通过调用setNickName(String newNickName)方法来更新nickName属性的值增强了对象属性的可操作性和灵活性。
// - 生成toString方法该方法能将TopContactsVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前对象所代表的联系人的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个TopContactsVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及联系人对象比较的业务逻辑中(如判断两个联系人是否为同一人等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
public class TopContactsVO {
/**
* String
*
* TopContactsVO
*/
private String userName;
/**
*
* 便
*
*/
private String nickName;
/**
*
*
* 使
*/
private String headImgUrl;
/**
* total使Long
*
* 便
*/
private Long total;
}

@ -0,0 +1,70 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* UserInfoVOValue ObjectVO
*
* 使
* 便
*
* @author xcs
* &#064;date 202462816:13:53
*/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getBasePath()、getWxId()等方法,外部代码可以方便地获取类中各个属性的值,
// 这在需要访问用户具体属性信息时非常有用比如在展示用户详情页面时获取文件目录、微信Id等内容便于数据展示与后续使用。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当用户更新了手机号
// 可以通过调用setMobile(String newMobile)方法来更新mobile属性的值增强了对象属性的可操作性和灵活性。
// - 生成toString方法该方法能将UserInfoVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前用户信息对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个UserInfoVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及用户对象比较的业务逻辑中(如判断两个用户信息是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
public class UserInfoVO {
/**
* String
*
*
*/
private String basePath;
/**
* Id使
* Id
* Id
*/
private String wxId;
/**
*
* 便
*
*/
private String nickname;
/**
* 使
* 1.0.1便
*
*/
private String version;
/**
*
*
*
*/
private String account;
/**
*
*
/
*/
private String mobile;
}

@ -0,0 +1,61 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* UserVOValue ObjectVO
*
* 使便
* @author xcs
* &#064;date 2023121020:21:02
*/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体作用如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getWxId()、getNickname()等方法,外部代码能够方便地获取类中各个属性的值,
// 在需要展示用户信息、根据用户属性进行相关业务逻辑判断等场景下这些getter方法能便捷地提供对应属性的数据访问途径。
// - 自动生成所有私有属性对应的setter方法使得外部代码可以根据业务需求动态地修改对象的属性值比如当用户更新了昵称
// 可以通过调用setNickname(String newNickname)方法来更新nickname属性的值从而保证对象属性能够灵活地反映用户数据的变化。
// - 生成toString方法该方法会将UserVO对象以一种直观、易于阅读的字符串形式展示出来通常包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前用户对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个UserVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及用户对象比较的业务逻辑中(如判断两个用户是否为同一人、状态是否一致等情况),该方法能够准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@AllArgsConstructor
// @AllArgsConstructor注解同样来自Lombok库它会自动为这个类生成一个包含所有参数的构造函数
// 对于UserVO类而言构造函数的形式为public UserVO(String wxId, String nickname, String avatar, boolean current) {...}
// 这意味着在创建该类的对象实例时只需要依次传入微信IdwxId、昵称nickname、头像avatar以及当前选中状态current这些参数
// 即可完成对象的初始化操作,这种方式提高了创建用户对象时传递数据的便利性和代码的可读性,使代码在实例化该类对象时更加简洁明了。
public class UserVO {
/**
* wxIdString使
*
*
*/
private String wxId;
/**
*
*
*
*/
private String nickname;
/**
*
*
* 使
*/
private String avatar;
/**
* 使boolean
* truefalse
* 便
*/
private boolean current;
}

@ -0,0 +1,55 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* WeAppInfoVOValue ObjectVOWeApp
* 便
* 便
* @author xcs
* &#064;date 20240117 1419
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法像通过调用getTitle()、getSourceDisplayName()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要展示小程序信息例如在前端页面呈现小程序的标题、来源显示名称等内容时这些getter方法能便捷地提供对应属性的数据访问途径便于信息展示。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值比如当小程序的标题发生变化
// 可以通过调用setTitle(String newTitle)方法来更新title属性的值保证对象属性能够灵活地反映小程序相关信息的变化增强了属性的可操作性。
// - 生成toString方法该方法能将WeAppInfoVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前小程序信息对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个WeAppInfoVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及小程序信息比较的业务逻辑中(如判断两个小程序的相关属性是否一致),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
public class WeAppInfoVO {
/**
* titleString
*
* 便
*/
private String title;
/**
* sourceDisplayName
*
/
*/
private String sourceDisplayName;
/**
* weAppIconUrl
* 使
//是小程序信息展示中重要的可视化元素相关属性。
*/
private String weAppIconUrl;
/**
* weAppPageThumbRawUrl
//或者查看小程序特定页面的预览图时,通过这个链接可以获取到相应页面的缩略图进行展示,让用户提前了解页面的大致内容和布局,
//是用于呈现小程序页面相关视觉信息的重要属性,有助于提升用户对小程序页面内容的认知和交互体验。
*/
private String weAppPageThumbRawUrl;
}

@ -0,0 +1,98 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
/**
* WeChatConfigVOValue ObjectVO
*
* 便
* 便
* @author xcs
* &#064;date 20231225 0938
**/
@Data
// @Data注解由Lombok库提供它会自动为这个类生成一系列实用的方法具体如下
// - 自动生成所有私有属性对应的getter方法例如通过调用getPid()、getBaseAddress()等方法,外部代码可以方便地获取类中各个属性的值,
// 在需要访问微信配置的具体属性信息时比如查看进程Id、基址等内容这些getter方法能提供便捷的数据访问途径便于后续业务逻辑使用这些数据。
// - 自动生成所有私有属性对应的setter方法使得外部代码能够根据业务需求动态地修改对象的属性值例如当微信账号发生变更
// 可以通过调用setAccount(String newAccount)方法来更新account属性的值从而保证对象的属性能够灵活地反映微信配置信息的实际变化情况增强了属性的可操作性。
// - 生成toString方法该方法能将WeChatConfigVO对象以一种直观、易于阅读的字符串形式展示出来通常会包含类名以及各个属性的值
// 在调试程序时通过打印对象的toString结果可以快速查看当前微信配置对象的具体状态了解各个属性的取值情况便于排查问题。
// - 生成hashCode方法在将对象存储到基于哈希的集合如HashMap、HashSet等中时会用到这个方法
// 它依据对象的属性值计算出一个唯一的哈希码,用于确定对象在哈希集合中的存储位置,方便在集合中快速查找和比较对象。
// - 生成equals方法用于比较两个WeChatConfigVO对象是否在逻辑上相等也就是判断它们的所有属性值是否都完全相同
// 在涉及微信配置对象比较的业务逻辑中(如判断不同环境下微信配置是否一致等情况),该方法能准确地进行对象的相等性判断。
// 通过使用@Data注解大大减少了手动编写这些常规方法的工作量让代码更加简洁、易读且易于维护。
@RequiredArgsConstructor
// @RequiredArgsConstructor注解同样来自Lombok库它会基于类中被声明为final的非空字段自动生成一个构造函数
// 要求在创建对象实例时,必须传入这些被标记为必需的参数,以此保证对象在初始化时关键属性有值,增强了对象创建的规范性和数据完整性。
@AllArgsConstructor
// @AllArgsConstructor注解也由Lombok库提供它会自动为这个类生成一个包含所有参数的构造函数
// 即构造函数的形式为public WeChatConfigVO(Integer pid, Long baseAddress, String version, String nickname, String account, String mobile, String basePath, String wxId) {...}
// 这意味着在创建该类的对象实例时只需要依次传入进程Idpid、基址baseAddress、版本号version、昵称nickname、账号account
// 手机号mobile、文件目录basePath以及微信IdwxId这些参数即可完成对象的初始化操作这种方式提高了创建对象时传递微信配置数据的便利性和代码的可读性
// 使代码在实例化该类对象时更加简洁明了,不过需要注意同时使用@RequiredArgsConstructor和@AllArgsConstructor时要根据实际情况合理使用构造函数。
public class WeChatConfigVO {
/**
* Id使IntegerId
//通过这个Id可以对微信进程进行管理、监控以及与其他进程进行交互等操作例如判断微信进程是否正常运行、获取其资源占用情况等
//是在涉及微信运行状态管理以及与系统层面交互时重要的基础属性之一。
*/
private Integer pid;
/**
* Long
//它通常指的是微信程序在内存中的起始地址,通过这个基址可以进一步定位和访问微信程序在内存中的其他数据结构、模块等,
//对于一些涉及微信内存数据读取、修改以及与底层代码交互的高级操作(比如插件开发、逆向分析等情况),基址是关键的参考信息之一。
*/
private Long baseAddress;
/**
* String8.0.1
//版本号用于区分不同阶段发布的微信版本,方便进行版本管理、功能更新提示以及兼容性判断等操作,
//在涉及微信升级、不同版本间功能差异处理、与其他系统或插件的兼容性适配等业务场景中,版本号是重要的参考依据,
//确保系统能根据微信的版本情况准确地提供相应服务或进行相应的业务逻辑调整。
*/
private String version;
/**
*
//在微信的社交互动场景中,如聊天界面、好友列表展示等,昵称往往更能直观地让其他用户识别是谁,相比于账号等相对固定且较为正式的标识,
//昵称更具亲和力,是体现用户个性化以及方便用户之间交互识别的重要属性之一。
*/
private String nickname;
/**
*
//是用户进入微信、获取相应服务的重要“钥匙”,在微信的用户登录、权限管理以及涉及用户身份验证的诸多业务逻辑中起着核心的标识作用。
*/
private String account;
/**
*
//还常用于身份验证(如接收验证码进行注册、登录、修改重要信息等操作)、消息通知(如接收微信推送的短信提醒)以及关联其他服务(如与手机号绑定的第三方账号授权等),
//是与用户联系紧密且具有多种重要用途的关键属性,在涉及微信用户安全验证、信息推送以及多平台账号整合等业务场景中有着重要地位。
*/
private String mobile;
/**
*
//例如存储聊天记录文件、缓存文件、用户自定义配置文件等的文件夹所在位置,也可以是网络存储中与微信相关文件的特定路径(在一些特殊的企业级应用或者云服务场景下),
//它用于定位和管理与微信相关的各类文件,是涉及微信文件操作以及数据管理时的重要属性之一。
*/
private String basePath;
/**
* Id
//通过这个Id可以在微信的服务器端、客户端等进行用户的精准定位、数据关联以及各种业务操作
//在整合微信相关功能或者基于微信账号进行用户认证、信息同步等业务场景中微信Id是关键的用户标识属性。
*/
private String wxId;
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save