Compare commits

..

No commits in common. 'develop' and 'main' have entirely different histories.

54
.gitignore vendored

@ -1,54 +0,0 @@
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

@ -1,21 +0,0 @@
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,163 +1,2 @@
<p align="center">
<a href="https://wx.xxccss.com/"><img src="image/logo.png" width="45%"></a>
</p>
# wx-dump-4j
<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 | 不支持 |
## ⚠️免责声明
本软件仅供技术研究和教育目的使用,旨在解密用户个人微信聊天记录。严禁将本软件用于任何非法目的,包括但不限于侵犯隐私权或非授权数据访问。作为软件开发者,我不对因使用或滥用本软件产生的任何形式的损失或损害承担责任。
## 👀 演示图
<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>

@ -1,211 +0,0 @@
## 微信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`

@ -1,29 +0,0 @@
![](../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.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

@ -1,130 +0,0 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.xcs.wx</groupId>
<artifactId>wx-dump-4j</artifactId>
<packaging>pom</packaging>
<version>${revision}</version>
<modules>
<module>wx-dump-admin</module>
<module>wx-dump-dist</module>
</modules>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<maven-assembly-plugin.version>3.5.0</maven-assembly-plugin.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<revision>1.1.0</revision>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.15</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
<version>2.7.15</version>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.34.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.4.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.20</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.8.0</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>3.25.1</version>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.25.1</version>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
<version>1.11.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.3</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.19</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.13.5</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>com.xcs.wx</groupId>
<artifactId>wx-dump-admin</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

@ -1,111 +0,0 @@
<?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>
<artifactId>wx-dump-admin</artifactId>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
</dependency>
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
</dependency>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-all</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
</dependencies>
<build>
<finalName>wx-dump-admin</finalName>
<plugins>
<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>

@ -1,54 +0,0 @@
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;
/**
*
* Spring
*/
@SpringBootApplication // 指定这是一个Spring Boot应用
@EnableTransactionManagement // 启用事务管理
public class WxDumpApplication {
/**
*
* Spring
* @param args
* @throws UnknownHostException
*/
public static void main(String[] args) throws UnknownHostException {
long startTime = System.currentTimeMillis(); // 记录启动开始时间
ConfigurableApplicationContext context = SpringApplication.run(WxDumpApplication.class, args); // 启动Spring应用
long endTime = System.currentTimeMillis(); // 记录启动结束时间
// 获取应用的端口和上下文路径
String port = context.getEnvironment().getProperty("server.port", "8080");
String contextPath = context.getEnvironment().getProperty("server.servlet.context-path", "");
// 获取本地主机地址
String localHostAddress = InetAddress.getLocalHost().getHostAddress();
// 构建本地和网络访问的URL
String localUrl = "http://localhost:" + port + contextPath;
String networkUrl = "http://" + localHostAddress + ":" + port + contextPath;
// 打印启动信息
System.out.println("DONE successfully in " + (endTime - startTime) + "ms");
System.out.println("Time: " + new Date());
System.out.println("╔════════════════════════════════════════════════════╗");
System.out.println("║ App listening at: ║");
System.out.println("║ > Local: " + localUrl + " ");
System.out.println("║ > Network: " + networkUrl + " ");
System.out.println("║ ║");
System.out.println("║ Now you can open browser with the above addresses↑ ║");
System.out.println("╚══════════════════════════════════════════════════╝");
}
}

@ -1,46 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 202462714:29:32
*/
@Slf4j
@Aspect
@Component
public class RepositoryAspect {
@Around("execution(public * com.xcs.wx.repository..*.*(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
String previousDs = DynamicDataSourceContextHolder.peek();
try {
// 获取拦截方法所在的类
Class<?> targetClass = joinPoint.getTarget().getClass();
// 获取类上的@DS注解
DS dsAnnotation = AnnotationUtil.getAnnotation(targetClass, DS.class);
// 有指定的注解
if (dsAnnotation != null) {
DynamicDataSourceContextHolder.push(DSNameUtil.getDSName(dsAnnotation.value()));
}
return joinPoint.proceed();
} finally {
// 恢复之前的ds
if (previousDs != null) {
DynamicDataSourceContextHolder.push(previousDs);
} else {
DynamicDataSourceContextHolder.clear();
}
}
}
}

@ -1,60 +0,0 @@
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 1729
**/
@Slf4j
@RestControllerAdvice
@ResponseStatus(HttpStatus.OK)
public class ExceptionAdviceConfig {
/**
* BizException
**/
@ExceptionHandler(BizException.class)
public ResponseVO<String> handleException(BizException e) {
return ResponseVO.error(e.getCode(), e.getMsg());
}
/**
* MyBatisSystemException
**/
@ExceptionHandler(MyBatisSystemException.class)
public ResponseVO<String> myBatisSystemException(MyBatisSystemException e) {
// 数据库未就绪状态
if (e.getCause().getCause() instanceof CannotFindDataSourceException) {
return ResponseVO.error(-1, "微信数据库未就绪状态,请先点击左侧解密工具进行数据解密!");
}
log.error("mybatis system exception", e);
return ResponseVO.error(-1, "系统异常");
}
/**
* RuntimeException
**/
@ExceptionHandler(RuntimeException.class)
public ResponseVO<String> handleException(RuntimeException e) {
log.error("runtime exception", e);
return ResponseVO.error(-1, "系统异常");
}
/**
* Exception
**/
@ExceptionHandler(Exception.class)
public ResponseVO<String> handleException(Exception e) {
log.error("exception", e);
return ResponseVO.error(-1, "系统异常");
}
}

@ -1,27 +0,0 @@
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;
/**
* @author xcs
* @date 20231229 1610
**/
@Configuration
@MapperScan({"com.xcs.wx.mapper"})
public class MybatisPlusConfig {
/**
*
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQLITE));
return interceptor;
}
}

@ -1,20 +0,0 @@
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;
/**
* @author xcs
* @date 20240126 1146
**/
@Configuration
@EnableWebMvc
public class UseStaticResourceConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("file:../html/");
}
}

@ -1,31 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231225 1005
**/
@Data
@Configuration(proxyBeanMethods = false)
@ConfigurationProperties(prefix = "wechat-offset")
public class WeChatOffsetProperties {
/**
*
*/
private Map<String, VersionConfig> version;
@Data
public static class VersionConfig {
private Long nickname;
private Long account;
private Long mobile;
}
}

@ -1,16 +0,0 @@
package com.xcs.wx.constant;
/**
*
*
* @author xcs
* @date 20240125 1634
**/
public class ChatRoomConstant {
private ChatRoomConstant() {
}
public static final String CHATROOM_SUFFIX = "@chatroom";
}

@ -1,91 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231225 1641
**/
public class DataSourceType {
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
*
* @return
*/
public static List<String> getMsgDb() {
String wxId = SpringUtil.getBean(UserService.class).currentUser();
// 空校验
if (wxId == null) {
return Collections.emptyList();
}
return getDb(wxId + "#" + "MSG.*\\.db");
}
/**
* pattern
*
* @param pattern
* @return
*/
private static List<String> getDb(String pattern) {
// 获取动态数据源
DynamicRoutingDataSource dynamicRoutingDataSource = SpringUtil.getBean(DynamicRoutingDataSource.class);
// 获取所有数据源
Map<String, DataSource> dataSources = dynamicRoutingDataSource.getDataSources();
// 筛选出符合模式的数据源键,并进行降序排序
return dataSources.keySet().stream()
.filter(key -> key.matches(pattern))
.sorted(Comparator.naturalOrder())
.collect(Collectors.toList());
}
}

@ -1,20 +0,0 @@
package com.xcs.wx.constant;
/**
* sqlite
*
* @author xcs
* @date 202412021:12:51
*/
public class SqliteConstant {
/**
* url
*/
public static final String URL_PREFIX = "jdbc:sqlite:";
/**
* sqlite
*/
public static final String DRIVER_CLASS_NAME = "org.sqlite.JDBC";
}

@ -1,64 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240108 1603
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/chatroom")
public class ChatRoomController {
private final ChatRoomService chatRoomService;
/**
*
*
* @param chatRoomDTO
* @return ChatRoomVO
*/
@GetMapping("/list")
public ResponseVO<List<ChatRoomVO>> list(ChatRoomDTO chatRoomDTO) {
// 查询群聊列表
PageVO<ChatRoomVO> pageVO = chatRoomService.queryChatRoom(chatRoomDTO);
// 返回数据
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
/**
*
*
* @param chatRoomName
* @return ChatRoomDetailVO
*/
@GetMapping("/detail")
public ResponseVO<ChatRoomDetailVO> detail(@RequestParam String chatRoomName) {
return ResponseVO.ok(chatRoomService.queryChatRoomDetail(chatRoomName));
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(chatRoomService.exportChatRoom());
}
}

@ -1,69 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20231222 1416
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/contact")
public class ContactController {
private final ContactService contactService;
/**
*
*
* @param contactDTO
* @return ResponseVO
*/
@GetMapping("/list")
public ResponseVO<List<ContactVO>> list(ContactDTO contactDTO) {
// 查询联系人
PageVO<ContactVO> pageVO = contactService.queryContact(contactDTO);
// 返回数据
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/all")
public ResponseVO<List<AllContactVO>> all() {
return ResponseVO.ok(contactService.queryAllContact());
}
/**
*
*
* @return ContactLabelVO
*/
@GetMapping("/label")
public ResponseVO<List<ContactLabelVO>> label() {
return ResponseVO.ok(contactService.queryContactLabel());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(contactService.exportContact());
}
}

@ -1,50 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 202461815:45:17
**/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/contact/headImg")
public class ContactHeadImgController {
private final ContactHeadImgService contactHeadImgService;
/**
*
*
* @param userName
* @param response HttpServletResponse
*/
@GetMapping("/avatar")
public void avatar(String userName, HttpServletResponse response) {
byte[] avatarBytes = contactHeadImgService.avatar(userName);
if (avatarBytes != null) {
response.setContentType("image/gif");
response.setContentLength(avatarBytes.length);
try (OutputStream os = response.getOutputStream()) {
os.write(avatarBytes);
os.flush();
} catch (IOException e) {
log.error("avatar fail", e);
}
} else {
response.setStatus(HttpServletResponse.SC_NOT_FOUND);
}
}
}

@ -1,74 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240115 1126
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/dashboard")
public class DashboardController {
private final DashboardService dashBoardService;
/**
*
*
* @return ResponseVO
*/
@GetMapping("/statsPanel")
public ResponseVO<StatsPanelVO> statsPanel() {
return ResponseVO.ok(dashBoardService.statsPanel());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/msgTypeDistribution")
public ResponseVO<List<MsgTypeDistributionVO>> msgTypeDistribution() {
return ResponseVO.ok(dashBoardService.msgTypeDistribution());
}
/**
* 15
*
* @return ResponseVO
*/
@GetMapping("/countRecentMsgs")
public ResponseVO<List<CountRecentMsgsVO>> countRecentMsgs() {
return ResponseVO.ok(dashBoardService.countRecentMsgs());
}
/**
* 10
*
* @return ResponseVO
*/
@GetMapping("/topContacts")
public ResponseVO<List<TopContactsVO>> topContacts() {
return ResponseVO.ok(dashBoardService.topContacts());
}
/**
* 使
*
* @return ResponseVO
*/
@GetMapping("/queryRecentUsedKeyWord")
public ResponseVO<List<RecentUsedKeyWordVO>> queryRecentUsedKeyWord() {
return ResponseVO.ok(dashBoardService.queryRecentUsedKeyWord());
}
}

@ -1,67 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240120 1435
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/database")
public class DatabaseController {
private final DatabaseService databaseService;
/**
*
*
* @return ResponseVO
*/
@GetMapping("/decrypt")
public SseEmitter decrypt(DecryptDTO decryptDTO) {
SseEmitter emitter = new SseEmitter(0L);
// 启动一个子线程,异步回调给前端
new Thread(() -> {
// 读取JDK版本号
if (SystemUtil.getJavaInfo().getVersionInt() < 1100) {
try {
emitter.send(ResponseVO.error(-1, "微信解密必须要求JDK11以上版本,请更换JDK版本。"), MediaType.APPLICATION_JSON);
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
emitter.complete();
}
return;
}
databaseService.decrypt(emitter, decryptDTO);
}).start();
// 返回数据
return emitter;
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/getDatabase")
public ResponseVO<List<DatabaseVO>> decrypt(String wxId) {
return ResponseVO.ok(databaseService.getDatabase(wxId));
}
}

@ -1,52 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240105 1556
**/
@Controller
@RequiredArgsConstructor
@RequestMapping("/api/export")
public class ExportController {
/**
*
*/
@GetMapping("download")
public ResponseEntity<Resource> download(@RequestParam String path) throws IOException {
Path filePath = Paths.get(path);
Resource resource = new FileSystemResource(filePath.toFile());
// 处理文件不存在的情况
if (!resource.exists()) {
return ResponseEntity.notFound().build();
}
String encodedFilename = URLEncoder.encode(resource.getFilename(), StandardCharsets.UTF_8.name()).replace("+", "%20");
String contentDisposition = "attachment; filename*=UTF-8''" + encodedFilename;
return ResponseEntity.ok()
.contentType(MediaType.parseMediaType("application/vnd.ms-excel"))
.header("Content-Disposition", contentDisposition)
.body(resource);
}
}

@ -1,41 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240104 1348
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/feeds")
public class FeedsController {
private final FeedsService feedsService;
/**
*
*
* @param feedsDTO
* @return FeedsVO
*/
@GetMapping("/list")
public ResponseVO<List<FeedsVO>> list(FeedsDTO feedsDTO) {
// 查询朋友圈
PageVO<FeedsVO> pageVO = feedsService.queryFeeds(feedsDTO);
// 返回数据
return ResponseVO.ok(pageVO.getRecords(), pageVO.getCurrent(), pageVO.getTotal());
}
}

@ -1,57 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 202412416:41:52
*/
@Controller
@RequiredArgsConstructor
@RequestMapping("/api/image")
public class ImageController {
private final ImageService imageService;
/**
* Md5
*
* @param md5 Md5
* @return
*/
@GetMapping("/downloadImgMd5")
public ResponseEntity<Resource> downloadImgMd5(@RequestParam String md5) {
return imageService.downloadImgMd5(md5);
}
/**
*
*
* @param path Md5
* @return
*/
@GetMapping("/downloadImg")
public ResponseEntity<Resource> downloadImg(@RequestParam String path) {
return imageService.downloadImg(path);
}
/**
*
*
* @param localPath
* @return
*/
@GetMapping("/downloadImgFormLocal")
public ResponseEntity<Resource> downloadImgFormLocal(@RequestParam String localPath) {
return imageService.downloadImgFormLocal(localPath);
}
}

@ -1,23 +0,0 @@
package com.xcs.wx.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author xcs
* @date 20240126 1134
**/
@Controller
public class IndexController {
/**
* url
*
* @return html
*/
@RequestMapping(value = {"/", "/{path:[^.]*}"})
public String index() {
return "index";
}
}

@ -1,48 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20231225 1706
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/msg")
public class MsgController {
private final MsgService msgService;
/**
*
*
* @param talker
* @param nextSequence
* @return ResponseVO
*/
@GetMapping("/list")
public ResponseVO<List<MsgVO>> list(@RequestParam String talker, @RequestParam Long nextSequence) {
return ResponseVO.ok(msgService.queryMsg(talker, nextSequence));
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/export")
public ResponseVO<String> export(@RequestParam String talker) {
return ResponseVO.ok(msgService.exportMsg(talker));
}
}

@ -1,48 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20240104 1348
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/recover/contact")
public class RecoverContactController {
private final RecoverContactService recoverContactService;
/**
*
*
* @param recoverContactDTO
* @return FeedsVO
*/
@GetMapping("/list")
public ResponseVO<List<RecoverContactVO>> list(RecoverContactDTO recoverContactDTO) {
// 返回数据
return ResponseVO.ok(recoverContactService.queryRecoverContact(recoverContactDTO));
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/export")
public ResponseVO<String> export() {
return ResponseVO.ok(recoverContactService.exportRecoverContact());
}
}

@ -1,35 +0,0 @@
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;
/**
* Controller
*
* @author xcs
* @date 20231221 1738
**/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/session")
public class SessionController {
private final SessionService sessionService;
/**
*
*
* @return SessionVO
*/
@GetMapping("/list")
public ResponseVO<List<SessionVO>> list() {
return ResponseVO.ok(sessionService.querySession());
}
}

@ -1,93 +0,0 @@
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;
/**
* UserController
*
* @author xcs
* @date 202461516:05:49
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/user")
public class UserController {
private final UserService userService;
private final WeChatService weChatService;
/**
*
*
* @return ResponseVO
*/
@GetMapping("/readWeChatConfig")
public ResponseVO<List<WeChatConfigVO>> readWeChatConfig() {
return ResponseVO.ok(weChatService.readWeChatConfig());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/userInfo")
public ResponseVO<UserInfoVO> userInfo() {
return ResponseVO.ok(userService.userInfo());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/avatar")
public ResponseVO<String> avatar() {
return ResponseVO.ok(userService.avatar());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/nickname")
public ResponseVO<String> nickname() {
return ResponseVO.ok(userService.nickname());
}
/**
*
*
* @return ResponseVO
*/
@GetMapping("/users")
public ResponseVO<List<UserVO>> users() {
return ResponseVO.ok(userService.users());
}
/**
*
*
* @param wxId wxId
* @return ResponseVO
*/
@PutMapping("/switchUser")
public ResponseVO<String> switchUser(String wxId) {
userService.switchUser(wxId);
return ResponseVO.ok("切换成功");
}
}

@ -1,115 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20240108 0945
**/
@Data
@TableName(value = "ChatRoom", autoResultMap = true)
public class ChatRoom {
/**
*
*/
@TableId("ChatRoomName")
private String chatRoomName;
/**
*
*/
@TableField("UserNameList")
private String userNameList;
/**
*
*/
@TableField("DisplayNameList")
private String displayNameList;
/**
* 0
*/
@TableField("ChatRoomFlag")
private Integer chatRoomFlag;
/**
* 0
*/
@TableField("Owner")
private Integer owner;
/**
* 0
*/
@TableField("IsShowName")
private Integer isShowName;
/**
*
*/
@TableField("SelfDisplayName")
private String selfDisplayName;
/**
* 1
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2
*/
@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;
/**
* BLOB
*/
@TableField(value = "RoomData", typeHandler = ByteArrayTypeHandler.class)
private byte[] roomData;
/**
* 7
*/
@TableField("Reserved7")
private Integer reserved7;
/**
* 8
*/
@TableField("Reserved8")
private String reserved8;
}

@ -1,101 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20240109 1453
**/
@Data
@TableName("ChatRoomInfo")
public class ChatRoomInfo {
/**
*
*/
@TableId("ChatRoomName")
private String chatRoomName;
/**
*
*/
@TableField("Announcement")
private String announcement;
/**
* 0
*/
@TableField("InfoVersion")
private Integer infoVersion;
/**
*
*/
@TableField("AnnouncementEditor")
private String announcementEditor;
/**
* 0
*/
@TableField("AnnouncementPublishTime")
private Long announcementPublishTime;
/**
* 0
*/
@TableField("ChatRoomStatus")
private Integer chatRoomStatus;
/**
* 1
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2
*/
@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;
/**
* 7
*/
@TableField("Reserved7")
private Integer reserved7;
/**
* 8
*/
@TableField("Reserved8")
private String reserved8;
}

@ -1,204 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231222 1059
**/
@Data
@TableName(value = "Contact",autoResultMap = true)
public class Contact {
/**
*
*/
@TableId(value = "UserName")
private String userName;
/**
*
*/
@TableField("Alias")
private String alias;
/**
*
*/
@TableField("EncryptUserName")
private String encryptUserName;
/**
* 0
*/
@TableField("DelFlag")
private Integer delFlag;
/**
* 0
*/
@TableField("Type")
private Integer type;
/**
* 0
*/
@TableField("VerifyFlag")
private Integer verifyFlag;
/**
* 1
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3
*/
@TableField("Reserved3")
private String reserved3;
/**
* 4
*/
@TableField("Reserved4")
private String reserved4;
/**
*
*/
@TableField("Remark")
private String remark;
/**
*
*/
@TableField("NickName")
private String nickName;
/**
* ID
*/
@TableField("LabelIDList")
private String labelIdList;
/**
*
*/
@TableField("DomainList")
private String domainList;
/**
*
*/
@TableField("ChatRoomType")
private Integer chatRoomType;
/**
*
*/
@TableField("PYInitial")
private String pyInitial;
/**
*
*/
@TableField("QuanPin")
private String quanPin;
/**
*
*/
@TableField("RemarkPYInitial")
private String remarkPyInitial;
/**
*
*/
@TableField("RemarkQuanPin")
private String remarkQuanPin;
/**
* URL
*/
@TableField("BigHeadImgUrl")
private String bigHeadImgUrl;
/**
* URL
*/
@TableField("SmallHeadImgUrl")
private String smallHeadImgUrl;
/**
* MD5
*/
@TableField("HeadImgMd5")
private String headImgMd5;
/**
* 0
*/
@TableField("ChatRoomNotify")
private Integer chatRoomNotify;
/**
* 5
*/
@TableField("Reserved5")
private Integer reserved5;
/**
* 6
*/
@TableField("Reserved6")
private String reserved6;
/**
* 7
*/
@TableField("Reserved7")
private String reserved7;
/**
* 8
*/
@TableField("Reserved8")
private Integer reserved8;
/**
* 9
*/
@TableField("Reserved9")
private Integer reserved9;
/**
* 10
*/
@TableField("Reserved10")
private String reserved10;
/**
* 11
*/
@TableField("Reserved11")
private String reserved11;
/**
*
*/
@TableField(value = "ExtraBuf", typeHandler = ByteArrayTypeHandler.class)
private byte[] extraBuf;
}

@ -1,42 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231222 1059
**/
@Data
@TableName("ContactHeadImg1")
public class ContactHeadImg {
/**
*
*/
@TableId("usrName")
private String usrName;
/**
*
*/
@TableField("createTime")
private Integer createTime;
/**
*
*/
@TableField(value = "smallHeadBuf", typeHandler = ByteArrayTypeHandler.class)
private byte[] smallHeadBuf;
/**
* MD5
*/
@TableField("m_headImgMD5")
private String headImgMd5;
}

@ -1,53 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231221 1831
**/
@Data
@TableName("ContactHeadImgUrl")
public class ContactHeadImgUrl {
/**
*
*/
@TableId("usrName")
private String usrName;
/**
* URL
*/
@TableField("smallHeadImgUrl")
private String smallHeadImgUrl;
/**
* URL
*/
@TableField("bigHeadImgUrl")
private String bigHeadImgUrl;
/**
* MD5
*/
@TableField("headImgMd5")
private String headImgMd5;
/**
* 0
*/
@TableField("reverse0")
private Integer reverse0;
/**
* 1
*/
@TableField("reverse1")
private String reverse1;
}

@ -1,66 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231222 1653
**/
@Data
@TableName("ContactLabel")
public class ContactLabel {
/**
* Id
*/
@TableId("LabelId")
private String labelId;
/**
*
*/
@TableField("LabelName")
private String labelName;
/**
* 1
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3
*/
@TableField("Reserved3")
private String reserved3;
/**
* 4
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5
*/
@TableField("Reserved5")
private String reserved5;
/**
*
*/
@TableField("RespData")
private String respData;
}

@ -1,42 +0,0 @@
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
*
* @author xcs
* @date 202461415:12:27
**/
@Data
@TableName(value = "FTSContact15_content", autoResultMap = true)
public class FTSContactContent {
/**
*
*/
@TableId(value = "docid", type = IdType.AUTO)
private Integer docId;
/**
* alias
*/
@TableField("c0alias")
private String alias;
/**
* nickname
*/
@TableField("c1nickname")
private String nickname;
/**
* c2remark
*/
@TableField("c2remark")
private String remark;
}

@ -1,35 +0,0 @@
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;
/**
* 使
*
* @author xcs
* @date 20240123 1109
**/
@Data
@TableName("FTSRecentUsed15")
public class FTSRecentUsed {
/**
*
*/
@TableId("queryText")
private String queryText;
/**
*
*/
@TableField("username")
private Integer username;
/**
*
*/
@TableField("updateTime")
private String updateTime;
}

@ -1,77 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20240103 1641
**/
@Data
@TableName(value = "FeedsV20", autoResultMap = true)
public class Feeds {
/**
* ID
*/
@TableId("FeedId")
private Long feedId;
/**
*
*/
@TableField("CreateTime")
private Integer createTime;
/**
* ID
*/
@TableField("FaultId")
private Integer faultId;
/**
*
*/
@TableField("Type")
private Integer type;
/**
*
*/
@TableField("UserName")
private String userName;
/**
*
*/
@TableField("Status")
private Integer status;
/**
*
*/
@TableField("ExtFlag")
private Integer extFlag;
/**
*
*/
@TableField("PrivFlag")
private Integer privFlag;
/**
* ID
*/
@TableField("StringId")
private String stringId;
/**
*
*/
@TableField("Content")
private String content;
}

@ -1,55 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20240104 1755
**/
@Data
@TableName(value = "HardLinkImageAttribute", autoResultMap = true)
public class HardLinkImageAttribute {
/**
* ID
*/
@TableId("Md5Hash")
private Long md5Hash;
/**
*
*/
@TableField("DirID1")
private String dirId1;
/**
*
*/
@TableField("DirID2")
private String dirId2;
/**
*
*/
@TableField(value = "Md5", typeHandler = ByteArrayTypeHandler.class)
private byte[] md5;
/**
*
*/
@TableField("ModifyTime")
private String modifyTime;
/**
*
*/
@TableField("FileName")
private String fileName;
}

@ -1,55 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20240207 1524
**/
@Data
@TableName(value = "HardLinkVideoAttribute", autoResultMap = true)
public class HardLinkVideoAttribute {
/**
* ID
*/
@TableId("Md5Hash")
private Long md5Hash;
/**
*
*/
@TableField("DirID1")
private String dirId1;
/**
*
*/
@TableField("DirID2")
private String dirId2;
/**
*
*/
@TableField(value = "Md5", typeHandler = ByteArrayTypeHandler.class)
private byte[] md5;
/**
*
*/
@TableField("ModifyTime")
private String modifyTime;
/**
*
*/
@TableField("FileName")
private String fileName;
}

@ -1,176 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231225 1508
**/
@Data
@TableName(value = "MSG", autoResultMap = true)
public class Msg {
/**
*
*/
@TableId(value = "localId",type = IdType.AUTO)
private Integer localId;
/**
* ID
*/
@TableField("TalkerId")
private Integer talkerId;
/**
* ID
*/
@TableField("MsgSvrID")
private String msgSvrId;
/**
*
*/
@TableField("Type")
private Integer type;
/**
*
*/
@TableField("SubType")
private Integer subType;
/**
*
*/
@TableField("IsSender")
private Integer isSender;
/**
*
*/
@TableField("CreateTime")
private Integer createTime;
/**
* 0
*/
@TableField("Sequence")
private Long sequence;
/**
* 0
*/
@TableField("StatusEx")
private Integer statusEx;
/**
*
*/
@TableField("FlagEx")
private Integer flagEx;
/**
*
*/
@TableField("Status")
private Integer status;
/**
*
*/
@TableField("MsgServerSeq")
private Integer msgServerSeq;
/**
*
*/
@TableField("MsgSequence")
private Integer msgSequence;
/**
*
*/
@TableField("StrTalker")
private String strTalker;
/**
*
*/
@TableField("StrContent")
private String strContent;
/**
*
*/
@TableField("DisplayContent")
private String displayContent;
/**
* 0 0
*/
@TableField("Reserved0")
private Integer reserved0;
/**
* 1 0
*/
@TableField("Reserved1")
private Integer reserved1;
/**
* 2 0
*/
@TableField("Reserved2")
private Integer reserved2;
/**
* 3 0
*/
@TableField("Reserved3")
private Integer reserved3;
/**
* 4
*/
@TableField("Reserved4")
private String reserved4;
/**
* 5
*/
@TableField("Reserved5")
private String reserved5;
/**
* 6
*/
@TableField("Reserved6")
private String reserved6;
/**
*
*/
@TableField(value = "CompressContent", typeHandler = ByteArrayTypeHandler.class)
private byte[] compressContent;
/**
*
*/
@TableField(value = "BytesExtra", typeHandler = ByteArrayTypeHandler.class)
private byte[] bytesExtra;
/**
*
*/
@TableField(value = "BytesTrans", typeHandler = ByteArrayTypeHandler.class)
private byte[] bytesTrans;
}

@ -1,95 +0,0 @@
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;
/**
*
*
* @author xcs
* @date 20231221 1705
**/
@Data
@TableName("Session")
public class Session {
/**
*
*/
@TableId("strUsrName")
private String usrName;
/**
*
*/
@TableField("nUnReadCount")
private Integer unReadCount;
/**
*
*/
@TableField("parentRef")
private String parentRef;
/**
*
*/
@TableField("strNickName")
private String nickName;
/**
*
*/
@TableField("nStatus")
private Integer status;
/**
*
*/
@TableField("nIsSend")
private Integer isSend;
/**
*
*/
@TableField("strContent")
private String content;
/**
*
*/
@TableField("nMsgType")
private Integer msgType;
/**
* ID
*/
@TableField("nMsgLocalID")
private Integer msgLocalId;
/**
*
*/
@TableField("nMsgStatus")
private Integer msgStatus;
/**
*
*/
@TableField("nTime")
private Integer time;
/**
*
*/
@TableField("editContent")
private String editContent;
/**
* @
*/
@TableField("othersAtMe")
private Integer othersAtMe;
}

@ -1,41 +0,0 @@
package com.xcs.wx.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* SQLite
*
* @author xcs
* @date 202461309:18:29
*/
@Data
@TableName("sqlite_master")
public class SqliteMaster {
/**
* type
*/
@TableField("type")
private String type;
/**
* tblName
*/
@TableField("tbl_name")
private String tblName;
/**
* rootPage
*/
@TableField("rootpage")
private String rootPage;
/**
* sql
*/
@TableField("sql")
private String sql;
}

@ -1,106 +0,0 @@
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;
/**
* CompressContentBO
*
* @author xcs
* @date 20240116 1459
**/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "msg")
public class CompressContentBO {
@JacksonXmlProperty(localName = "appmsg")
private AppMsg appMsg;
@JacksonXmlProperty(localName = "fromusername")
private String fromUsername;
@JacksonXmlProperty(localName = "scene")
private int scene;
@JacksonXmlProperty(localName = "appinfo")
private AppInfo appInfo;
@JacksonXmlProperty(localName = "titile")
private String titile;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppMsg {
@JacksonXmlProperty(localName = "title")
private String title;
@JacksonXmlProperty(localName = "sourcedisplayname")
private String sourceDisplayName;
@JacksonXmlProperty(localName = "des")
private String des;
@JacksonXmlProperty(localName = "url")
private String url;
@JacksonXmlProperty(localName = "action")
private String action;
@JacksonXmlProperty(localName = "type")
private int type;
@JacksonXmlProperty(localName = "showtype")
private int showType;
@JacksonXmlProperty(localName = "refermsg")
private ReferMsg referMsg;
@JacksonXmlProperty(localName = "weappinfo")
private WeAppInfo weAppInfo;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ReferMsg {
@JacksonXmlProperty(localName = "type")
private int type;
@JacksonXmlProperty(localName = "svrid")
private long svrId;
@JacksonXmlProperty(localName = "fromusr")
private String fromUsr;
@JacksonXmlProperty(localName = "displayname")
private String displayName;
@JacksonXmlProperty(localName = "content")
private String content;
@JacksonXmlProperty(localName = "msgsource")
private String msgSource;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class WeAppInfo {
@JacksonXmlProperty(localName = "weappiconurl")
private String weAppIconUrl;
@JacksonXmlProperty(localName = "weapppagethumbrawurl")
private String weAppPageThumbRawUrl;
}
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppInfo {
@JacksonXmlProperty(localName = "version")
private int version;
@JacksonXmlProperty(localName = "appname")
private String appName;
}
}

@ -1,25 +0,0 @@
package com.xcs.wx.domain.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* DecryptBO
*
* @author xcs
* @date 2023121020:21:02
*/
@Data
@AllArgsConstructor
public class DecryptBO {
/**
*
*/
private String input;
/**
*
*/
private String output;
}

@ -1,169 +0,0 @@
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;
/**
* @author xcs
* @date 20240116 1459
**/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "msg")
public class MsgBO {
@JacksonXmlProperty(localName = "img")
public Img img;
@JacksonXmlProperty(localName = "emoji")
private Emoji emoji;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Img {
@JacksonXmlProperty(isAttribute = true, localName = "aeskey")
public String aesKey;
@JacksonXmlProperty(isAttribute = true, localName = "encryver")
public String encryVer;
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbaeskey")
public String cdnThumbAesKey;
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumburl")
public String cdnThumbUrl;
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumblength")
public int cdnThumbLength;
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbheight")
public int cdnThumbHeight;
@JacksonXmlProperty(isAttribute = true, localName = "cdnthumbwidth")
public int cdnThumbWidth;
@JacksonXmlProperty(isAttribute = true,localName = "cdnmidheight")
public int cdnMidHeight;
@JacksonXmlProperty(isAttribute = true, localName = "cdnmidwidth")
public int cdnMidWidth;
@JacksonXmlProperty(isAttribute = true, localName = "cdnhdheight")
public int cdnHdHeight;
@JacksonXmlProperty(isAttribute = true, localName = "cdnhdwidth")
public int cdnHdWidth;
@JacksonXmlProperty(isAttribute = true, localName = "cdnmidimgurl")
public String cdnMidImgUrl;
@JacksonXmlProperty(isAttribute = true, localName = "length")
public int length;
@JacksonXmlProperty(isAttribute = true, localName = "md5")
public String md5;
@JacksonXmlProperty(isAttribute = true, localName = "hevc_mid_size")
public int hevcMidSize;
@JacksonXmlProperty(isAttribute = true, localName = "originsourcemd5")
public String originSourceMd5;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Emoji {
@JacksonXmlProperty(isAttribute = true, localName = "fromusername")
private String fromUsername;
@JacksonXmlProperty(isAttribute = true, localName = "tousername")
private String toUsername;
@JacksonXmlProperty(isAttribute = true, localName = "type")
private String type;
@JacksonXmlProperty(isAttribute = true, localName = "idbuffer")
private String idBuffer;
@JacksonXmlProperty(isAttribute = true, localName = "md5")
private String md5;
@JacksonXmlProperty(isAttribute = true, localName = "len")
private String len;
@JacksonXmlProperty(isAttribute = true, localName = "productid")
private String productId;
@JacksonXmlProperty(isAttribute = true, localName = "androidmd5")
private String androidMd5;
@JacksonXmlProperty(isAttribute = true, localName = "androidlen")
private String androidLen;
@JacksonXmlProperty(isAttribute = true, localName = "s60v3md5")
private String s60v3Md5;
@JacksonXmlProperty(isAttribute = true, localName = "s60v3len")
private String s60v3Len;
@JacksonXmlProperty(isAttribute = true, localName = "s60v5md5")
private String s60v5Md5;
@JacksonXmlProperty(isAttribute = true, localName = "s60v5len")
private String s60v5Len;
@JacksonXmlProperty(isAttribute = true, localName = "cdnurl")
private String cdnUrl;
@JacksonXmlProperty(isAttribute = true, localName = "designerid")
private String designerId;
@JacksonXmlProperty(isAttribute = true, localName = "thumburl")
private String thumbUrl;
@JacksonXmlProperty(isAttribute = true, localName = "encrypturl")
private String encryptUrl;
@JacksonXmlProperty(isAttribute = true, localName = "aeskey")
private String aesKey;
@JacksonXmlProperty(isAttribute = true, localName = "externurl")
private String externUrl;
@JacksonXmlProperty(isAttribute = true, localName = "externmd5")
private String externMd5;
@JacksonXmlProperty(isAttribute = true, localName = "width")
private String width;
@JacksonXmlProperty(isAttribute = true, localName = "height")
private String height;
@JacksonXmlProperty(isAttribute = true, localName = "tpurl")
private String tpUrl;
@JacksonXmlProperty(isAttribute = true, localName = "tpauthkey")
private String tpAuthKey;
@JacksonXmlProperty(isAttribute = true, localName = "attachedtext")
private String attachedText;
@JacksonXmlProperty(isAttribute = true, localName = "attachedtextcolor")
private String attachedTextColor;
@JacksonXmlProperty(isAttribute = true, localName = "lensid")
private String lensId;
@JacksonXmlProperty(isAttribute = true, localName = "emojiattr")
private String emojiAttr;
@JacksonXmlProperty(isAttribute = true, localName = "linkid")
private String linkId;
@JacksonXmlProperty(isAttribute = true, localName = "desc")
private String desc;
}
}

@ -1,223 +0,0 @@
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;
/**
* TimelineObjectBO
*
* @author xcs
* @date 20240103 1747
**/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "TimelineObject")
public class TimelineObjectBO {
@JacksonXmlProperty(localName = "id")
private String id;
@JacksonXmlProperty(localName = "username")
private String username;
@JacksonXmlProperty(localName = "createTime")
private Long createTime;
@JacksonXmlProperty(localName = "contentDesc")
private String contentDesc;
@JacksonXmlProperty(localName = "contentDescShowType")
private String contentDescShowType;
@JacksonXmlProperty(localName = "contentDescScene")
private String contentDescScene;
@JacksonXmlProperty(localName = "private")
private String asPrivate;
@JacksonXmlProperty(localName = "sightFolded")
private String sightFolded;
@JacksonXmlProperty(localName = "showFlag")
private String showFlag;
@JacksonXmlProperty(localName = "appInfo")
private AppInfo appInfo;
@JacksonXmlProperty(localName = "sourceUserName")
private String sourceUserName;
@JacksonXmlProperty(localName = "sourceNickName")
private String sourceNickName;
@JacksonXmlProperty(localName = "statisticsData")
private String statisticsData;
@JacksonXmlProperty(localName = "statExtStr")
private String statExtStr;
@JacksonXmlProperty(localName = "ContentObject")
private ContentObject contentObject;
@JacksonXmlProperty(localName = "publicUserName")
private String publicUserName;
@JacksonXmlProperty(localName = "location")
private Location location;
@JacksonXmlProperty(localName = "streamvideo")
private StreamVideo streamVideo;
/**
* AppInfo
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class AppInfo {
@JacksonXmlProperty(localName = "id")
private String id;
@JacksonXmlProperty(localName = "version")
private String version;
@JacksonXmlProperty(localName = "appName")
private String appName;
@JacksonXmlProperty(localName = "installUrl")
private String installUrl;
@JacksonXmlProperty(localName = "fromUrl")
private String fromUrl;
@JacksonXmlProperty(localName = "isForceUpdate")
private String isForceUpdate;
@JacksonXmlProperty(localName = "isHidden")
private String isHidden;
}
/**
* ContentObject
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class ContentObject {
@JacksonXmlProperty(localName = "contentStyle")
private Integer contentStyle;
@JacksonXmlProperty(localName = "description")
private String description;
@JacksonXmlProperty(localName = "title")
private String title;
@JacksonXmlProperty(localName = "contentUrl")
private String contentUrl;
@JacksonXmlProperty(localName = "mediaList")
private List<Media> mediaList;
/**
* Media
*/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Media {
@JacksonXmlProperty(localName = "id")
private String id;
@JacksonXmlProperty(localName = "type")
private String type;
@JacksonXmlProperty(localName = "title")
private String title;
@JacksonXmlProperty(localName = "description")
private String description;
@JacksonXmlProperty(localName = "private")
private String asPrivate;
@JacksonXmlProperty(localName = "userData")
private String userData;
@JacksonXmlProperty(localName = "subType")
private String subType;
@JacksonXmlProperty(localName = "videoSize")
private String videoSize;
@JacksonXmlProperty(localName = "url")
private Url url;
@JacksonXmlProperty(localName = "thumb")
private Thumb thumb;
@JacksonXmlProperty(localName = "size")
private String size;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Url {
@JacksonXmlProperty(isAttribute = true)
private int type;
@JacksonXmlProperty(isAttribute = true)
private String md5;
@JacksonXmlProperty(isAttribute = true)
private String videomd5;
@JacksonXmlText
private String value;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Thumb {
@JacksonXmlProperty(isAttribute = true)
private int type;
@JacksonXmlText
private String value;
}
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class Location {
@JacksonXmlProperty(isAttribute = true, localName = "poiClassifyId")
private String poiClassifyId;
@JacksonXmlProperty(isAttribute = true, localName = "poiName")
private String poiName;
@JacksonXmlProperty(isAttribute = true, localName = "poiAddress")
private String poiAddress;
@JacksonXmlProperty(isAttribute = true, localName = "poiClassifyType")
private Integer poiClassifyType;
@JacksonXmlProperty(isAttribute = true, localName = "city")
private String city;
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class StreamVideo {
@JacksonXmlProperty(localName = "streamvideourl")
private String streamVideoUrl;
@JacksonXmlProperty(localName = "streamvideothumburl")
private String streamVideoThumbUrl;
@JacksonXmlProperty(localName = "streamvideoweburl")
private String streamVideoWebUrl;
}
}

@ -1,45 +0,0 @@
package com.xcs.wx.domain.bo;
import lombok.Builder;
import lombok.Data;
/**
* UserBO
*
* @author xcs
* @date 2023123115:25:21
*/
@Data
@Builder
public class UserBO {
/**
*
*/
private String basePath;
/**
* Id
*/
private String wxId;
/**
*
*/
private String nickname;
/**
*
*/
private String version;
/**
*
*/
private String account;
/**
*
*/
private String mobile;
}

@ -1,31 +0,0 @@
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;
/**
* VoipMsgBO
*
* @author xcs
* @date 20240117 1515
**/
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JacksonXmlRootElement(localName = "voipmsg")
public class VoipMsgBO {
@JacksonXmlProperty(localName = "VoIPBubbleMsg")
private VoIPBubbleMsg voIPBubbleMsg;
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class VoIPBubbleMsg {
@JacksonXmlCData
@JacksonXmlProperty(localName = "msg")
private String msg;
}
}

@ -1,30 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* ChatRoomDTO
*
* @author xcs
* @date 20240108 1624
**/
@Data
@EqualsAndHashCode(callSuper = true)
public class ChatRoomDTO extends PageDTO {
/**
*
*/
private String chatRoomTitle;
/**
*
*/
private String selfDisplayName;
/**
*
*/
private String createBy;
}

@ -1,35 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* ContactDTO
*
* @author xcs
* @date 2023123115:25:21
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ContactDTO extends PageDTO {
/**
*
*/
private String remark;
/**
*
*/
private String nickName;
/**
* Id
*/
private String labels;
/**
*
*/
private String describe;
}

@ -1,48 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
/**
* DecryptDTO
*
* @author xcs
* @date 2023123115:25:21
*/
@Data
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;
}

@ -1,30 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* FeedsDTO
*
* @author xcs
* @date 20240103 1717
**/
@Data
@EqualsAndHashCode(callSuper = true)
public class FeedsDTO extends PageDTO {
/**
*
*/
private String userName;
/**
*
*/
private Long startTime;
/**
*
*/
private Long endTime;
}

@ -1,23 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
/**
* PageDTO
*
* @author xcs
* @date 20231229 1558
**/
@Data
public class PageDTO {
/**
*
*/
private Long current;
/**
*
*/
private Long pageSize;
}

@ -1,25 +0,0 @@
package com.xcs.wx.domain.dto;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* RecoverContactDTO
*
* @author xcs
* @date 202461415:29:54
**/
@Data
@EqualsAndHashCode(callSuper = true)
public class RecoverContactDTO extends PageDTO{
/**
* nickname
*/
private String nickname;
/**
* c2remark
*/
private String remark;
}

@ -1,23 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* AllContactVO
*
* @author xcs
* @date 20240207 1115
**/
@Data
public class AllContactVO {
/**
*
*/
private String userName;
/**
*
*/
private String nickName;
}

@ -1,33 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* CardLinkVO
*
* @author xcs
* @date 20240117 1450
**/
@Data
public class CardLinkVO {
/**
* title
*/
private String title;
/**
* sourceDisplayName
*/
private String sourceDisplayName;
/**
* des
*/
private String des;
/**
* url
*/
private String url;
}

@ -1,63 +0,0 @@
package com.xcs.wx.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.List;
/**
* ChatRoomDetailVO
*
* @author xcs
* @date 20240108 1610
**/
@Data
public class ChatRoomDetailVO {
/**
*
*/
private String chatRoomName;
/**
*
*/
private String chatRoomTitle;
/**
*
*/
private String selfDisplayName;
/**
*
*/
private String createBy;
/**
*
*/
private String headImgUrl;
/**
* 2
*/
@JsonIgnore
private String reserved2;
/**
* roomData
*/
@JsonIgnore
private byte[] roomData;
/**
*
*/
private ChatRoomInfoVO chatRoomInfo;
/**
*
*/
private List<ChatRoomMemberVO> members;
}

@ -1,48 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* ChatRoomInfoVO
*
* @author xcs
* @date 20240109 1527
**/
@Data
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;
}

@ -1,33 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* ChatRoomMemberVO
*
* @author xcs
* @date 20240108 1610
**/
@Data
public class ChatRoomMemberVO {
/**
* wxId
*/
private String wxId;
/**
*
*/
private String remark;
/**
*
*/
private Integer state;
/**
*
*/
private String headImgUrl;
}

@ -1,65 +0,0 @@
package com.xcs.wx.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
/**
* ChatRoomVO
*
* @author xcs
* @date 20240108 1610
**/
@Data
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;
}

@ -1,23 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* ContactLabelVO
*
* @author xcs
* @date 20231221 1813
**/
@Data
public class ContactLabelVO {
/**
* Id
*/
private String labelId;
/**
*
*/
private String labelName;
}

@ -1,55 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
import java.util.List;
/**
* ContactVO
*
* @author xcs
* @date 20231222 1443
**/
@Data
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;
}

@ -1,28 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* CountRecentMsgsVO
*
* @author xcs
* @date 20240106 1421
**/
@Data
public class CountRecentMsgsVO {
/**
*
*/
private String type;
/**
*
*/
private Long value;
/**
*
*/
private String category;
}

@ -1,23 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* DatabaseVO
*
* @author
* @date 202462811:08:45
*/
@Data
public class DatabaseVO {
/**
*
*/
private String filePath;
/**
*
*/
private String fileSize;
}

@ -1,35 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Builder;
import lombok.Data;
/**
* DecryptVO
*
* @author xcs
* @date 20231221 1813
**/
@Data
@Builder
public class DecryptVO {
/**
*
*/
private String fileName;
/**
*
*/
private String fileSize;
/**
*
*/
private int currentProgress;
/**
*
*/
private int total;
}

@ -1,74 +0,0 @@
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
*
* @author xcs
* @date 20240108 1610
**/
@Data
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class ExportChatRoomVO {
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("群号")
private String chatRoomName;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("群聊名称")
private String chatRoomTitle;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("备注")
private String selfDisplayName;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("创建人")
private String createBy;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("群聊是否已经解散")
private Boolean dissolution;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("是否为企业微信群")
private Boolean enterprise;
/**
*
*/
@ExcelIgnore
private byte[] roomData;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("群聊人数")
private Integer memberCount;
}

@ -1,60 +0,0 @@
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
*
* @author xcs
* @date 20231222 1443
**/
@Data
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class ExportContactVO {
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("微信Id")
private String userName;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("微信号")
private String alias;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("备注")
private String remark;
/**
*
*/
@ColumnWidth(30)
@ExcelProperty("昵称")
private String nickName;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("描述")
private String describe;
/**
* Id
*/
@ColumnWidth(20)
@ExcelProperty("标签Id")
private String labelIdList;
}

@ -1,67 +0,0 @@
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
*
* @author xcs
* @date 20240125 1616
**/
@Data
@ContentStyle(horizontalAlignment = HorizontalAlignmentEnum.CENTER)
public class ExportMsgVO {
/**
* ID
*/
@ColumnWidth(25)
@ExcelProperty("消息Id")
private String msgSvrId;
/**
* Id
*/
@ColumnWidth(25)
@ExcelProperty("聊天人Id")
private String wxId;
/**
*
*/
@ColumnWidth(10)
@ExcelProperty("类型")
private Integer type;
/**
*
*/
@ColumnWidth(10)
@ExcelProperty("子类型")
private Integer subType;
/**
*
*/
@ColumnWidth(15)
@ExcelProperty("是否发送者")
private Integer isSender;
/**
*
*/
@ColumnWidth(25)
@ExcelProperty("创建时间")
private String strCreateTime;
/**
*
*/
@ColumnWidth(80)
@ExcelProperty("消息内容")
private String strContent;
}

@ -1,38 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* FeedsLocationVO
*
* @author xcs
* @date 20240104 1425
**/
@Data
public class FeedsLocationVO {
/**
* poiClassifyId
*/
private String poiClassifyId;
/**
* poiName
*/
private String poiName;
/**
* poiAddress
*/
private String poiAddress;
/**
* poiClassifyType
*/
private Integer poiClassifyType;
/**
* city
*/
private String city;
}

@ -1,23 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* FeedsMediaVO
*
* @author xcs
* @date 20240104 1425
**/
@Data
public class FeedsMediaVO {
/**
* Url
*/
private String url;
/**
* Url
*/
private String thumb;
}

@ -1,98 +0,0 @@
package com.xcs.wx.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
import java.util.List;
/**
* FeedsVO
*
* @author xcs
* @date 20240103 1641
**/
@Data
public class FeedsVO {
/**
* ID
*/
private Long feedId;
/**
*
*/
@JsonIgnore
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
private String content;
/**
*
*/
private String contentDesc;
/**
*
*/
private List<FeedsMediaVO> medias;
/**
*
*/
private FeedsLocationVO location;
/**
*
*/
private String headImgUrl;
}

@ -1,25 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* MsgTypeDistributionVO
*
* @author xcs
* @date 20240105 1525
**/
@Data
@AllArgsConstructor
public class MsgTypeDistributionVO {
/**
*
*/
private String type;
/**
*
*/
private Integer value;
}

@ -1,121 +0,0 @@
package com.xcs.wx.domain.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.Data;
/**
* MsgVO
*
* @author xcs
* @date 20231222 1443
**/
@Data
public class MsgVO {
/**
*
*/
private Integer localId;
/**
* ID
*/
private String msgSvrId;
/**
*
*/
private Integer type;
/**
*
*/
private Integer subType;
/**
*
*/
private Long sequence;
/**
*
*/
private Integer isSender;
/**
*
*/
private Long createTime;
/**
*
*/
private String strCreateTime;
/**
*
*/
private String strContent;
/**
*
*/
private String referMsgContent;
/**
*
*/
private String strTalker;
/**
*
*/
private String avatar;
/**
* Md5
*/
private String imgMd5;
/**
*
*/
private String thumb;
/**
*
*/
private String image;
/**
* Url
*/
private String emojiUrl;
/**
* compressContent
*/
@JsonIgnore
private byte[] compressContent;
/**
* bytesExtra
*/
@JsonIgnore
private byte[] bytesExtra;
/**
*
*/
private WeAppInfoVO weAppInfo;
/**
*
*/
private CardLinkVO cardLink;
/**
* Id
*/
private String wxId;
}

@ -1,37 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
/**
* PageVO
*
* @author xcs
* @date 20231229 1619
**/
@Data
@AllArgsConstructor
public class PageVO<T> {
/**
*
*/
private Long current;
/**
*
*/
private Long pageSize;
/**
*
*/
private Long total;
/**
*
*/
private List<T> records;
}

@ -1,20 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* RecentUsedKeyWordVO
*
* @author xcs
* @date 20240123 1127
**/
@Data
@AllArgsConstructor
public class RecentUsedKeyWordVO {
/**
*
*/
private String text;
}

@ -1,43 +0,0 @@
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;
/**
* RecoverContactVO
*
* @author xcs
* @date 202461415:29:54
**/
@Data
public class RecoverContactVO {
/**
*
*/
@ExcelIgnore
private Integer docId;
/**
* alias
*/
@ExcelProperty("微信号")
@ColumnWidth(50)
private String alias;
/**
* nickname
*/
@ExcelProperty("昵称")
@ColumnWidth(100)
private String nickname;
/**
* c2remark
*/
@ExcelProperty("备注")
@ColumnWidth(100)
private String remark;
}

@ -1,95 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* ResponseVO
*
* @author xcs
* @date 20231225 1731
**/
@Data
public class ResponseVO<T> {
/**
*
*/
private Boolean success;
/**
*
*/
private Integer errorCode;
/**
*
*/
private String errorMessage;
/**
*
*/
private Long page;
/**
*
*/
private Long total;
/**
*
*/
private Integer showType;
/**
*
*/
private T data;
/**
*
*
* @param data
* @param <T>
* @return ResponseDTO
*/
public static <T> ResponseVO<T> ok(T data) {
ResponseVO<T> wrapper = new ResponseVO<>();
wrapper.setSuccess(true);
wrapper.setData(data);
return wrapper;
}
/**
*
*
* @param data
* @param <T>
* @param page
* @param total
* @return ResponseDTO
*/
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;
}
/**
*
*
* @param <T>
* @return ResponseDTO
*/
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;
}
}

@ -1,43 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* SessionVO
*
* @author xcs
* @date 20231221 1813
**/
@Data
public class SessionVO {
/**
*
*/
private String userName;
/**
*
*/
private String nickName;
/**
*
*/
private String content;
/**
*
*/
private Integer time;
/**
*
*/
private String shortTime;
/**
* Url
*/
private String headImgUrl;
}

@ -1,35 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* StatsPanelVO
*
* @author xcs
* @date 20240123 1725
**/
@Data
@AllArgsConstructor
public class StatsPanelVO {
/**
*
*/
private Integer contact;
/**
*
*/
private Integer chatRoom;
/**
*
*/
private Integer sent;
/**
*
*/
private Integer received;
}

@ -1,33 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* TopContactsVO
*
* @author xcs
* @date 20240106 1538
**/
@Data
public class TopContactsVO {
/**
*
*/
private String userName;
/**
*
*/
private String nickName;
/**
*
*/
private String headImgUrl;
/**
* total
*/
private Long total;
}

@ -1,43 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* UserInfoVO
*
* @author xcs
* @date 202462816:13:53
*/
@Data
public class UserInfoVO {
/**
*
*/
private String basePath;
/**
* Id
*/
private String wxId;
/**
*
*/
private String nickname;
/**
*
*/
private String version;
/**
*
*/
private String account;
/**
*
*/
private String mobile;
}

@ -1,35 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* UserVO
*
* @author xcs
* @date 2023121020:21:02
*/
@Data
@AllArgsConstructor
public class UserVO {
/**
* wxId
*/
private String wxId;
/**
*
*/
private String nickname;
/**
*
*/
private String avatar;
/**
*
*/
private boolean current;
}

@ -1,33 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.Data;
/**
* WeAppInfoVO
*
* @author xcs
* @date 20240117 1419
**/
@Data
public class WeAppInfoVO {
/**
* title
*/
private String title;
/**
* sourceDisplayName
*/
private String sourceDisplayName;
/**
* weAppIconUrl
*/
private String weAppIconUrl;
/**
* weAppPageThumbRawUrl
*/
private String weAppPageThumbRawUrl;
}

@ -1,57 +0,0 @@
package com.xcs.wx.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
/**
* WeChatConfigVO
*
* @author xcs
* @date 20231225 0938
**/
@Data
@RequiredArgsConstructor
@AllArgsConstructor
public class WeChatConfigVO {
/**
* Id
*/
private Integer pid;
/**
*
*/
private Long baseAddress;
/**
*
*/
private String version;
/**
*
*/
private String nickname;
/**
*
*/
private String account;
/**
*
*/
private String mobile;
/**
*
*/
private String basePath;
/**
* Id
*/
private String wxId;
}

@ -1,25 +0,0 @@
package com.xcs.wx.exception;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author xcs
* @date 20231225 1739
**/
@Data
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class BaseException extends RuntimeException {
/**
*
*/
private Integer code;
/**
*
*/
private String msg;
}

@ -1,14 +0,0 @@
package com.xcs.wx.exception;
/**
*
*
* @author xcs
* @date 20231225 1738
**/
public class BizException extends BaseException {
public BizException(Integer code, String msg) {
super(code, msg);
}
}

@ -1,13 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.ChatRoomInfo;
/**
* Mapper
*
* @author xcs
* @date 20240109 1520
**/
public interface ChatRoomInfoMapper extends BaseMapper<ChatRoomInfo> {
}

@ -1,43 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcs.wx.domain.ChatRoom;
import com.xcs.wx.domain.dto.ChatRoomDTO;
import com.xcs.wx.domain.vo.ChatRoomVO;
import com.xcs.wx.domain.vo.ExportChatRoomVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* Mapper
*
* @author xcs
* @date 20240108 1555
**/
public interface ChatRoomMapper extends BaseMapper<ChatRoom> {
/**
*
*
* @param page
* @param chatRoomDTO
* @return ChatRoomVO
*/
Page<ChatRoomVO> queryChatRoom(Page<ChatRoomVO> page, @Param("chatRoomDTO") ChatRoomDTO chatRoomDTO);
/**
*
*
* @return
*/
int countChatRoom();
/**
*
*
* @return ExportChatRoomVO
*/
List<ExportChatRoomVO> exportChatRoom();
}

@ -1,21 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.ContactHeadImg;
/**
* Mapper
*
* @author xcs
* @date 202461815:33:26
**/
public interface ContactHeadImgMapper extends BaseMapper<ContactHeadImg> {
/**
*
*
* @param usrName
* @return ContactHeadImg
*/
ContactHeadImg getContactHeadImg(String usrName);
}

@ -1,13 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.ContactHeadImgUrl;
/**
* Mapper
*
* @author xcs
* @date 20231221 1708
**/
public interface ContactHeadImgUrlMapper extends BaseMapper<ContactHeadImgUrl> {
}

@ -1,13 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.ContactLabel;
/**
* Mapper
*
* @author xcs
* @date 2023122217:19:20
*/
public interface ContactLabelMapper extends BaseMapper<ContactLabel> {
}

@ -1,59 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xcs.wx.domain.Contact;
import com.xcs.wx.domain.dto.ContactDTO;
import com.xcs.wx.domain.vo.AllContactVO;
import com.xcs.wx.domain.vo.ContactVO;
import com.xcs.wx.domain.vo.ExportContactVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Set;
/**
* Mapper
*
* @author xcs
* @date 20231222 1351
**/
public interface ContactMapper extends BaseMapper<Contact> {
/**
*
*
* @param page
* @param contactDTO
* @return Contact
*/
Page<ContactVO> queryContact(Page<ContactVO> page, @Param("contactDTO") ContactDTO contactDTO);
/**
*
*
* @return AllContactVO
*/
List<AllContactVO> queryAllContact();
/**
* Id
*
* @return Contact
*/
Set<String> getContactWithMp();
/**
*
*
* @return
*/
int countContact();
/**
*
*
* @return ExportContactVO
*/
List<ExportContactVO> exportContact();
}

@ -1,14 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.FTSContactContent;
/**
* FTSContactContentMapper
*
* @author xcs
* @date 202461414:24:43
**/
public interface FTSContactContentMapper extends BaseMapper<FTSContactContent> {
}

@ -1,13 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.FTSRecentUsed;
/**
* 使 Mapper
*
* @author xcs
* @date 20231222 1351
**/
public interface FTSRecentUsedMapper extends BaseMapper<FTSRecentUsed> {
}

@ -1,14 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.Feeds;
/**
* Mapper
*
* @author xcs
* @date 20231222 1351
**/
public interface FeedsMapper extends BaseMapper<Feeds> {
}

@ -1,22 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.HardLinkImageAttribute;
import org.apache.ibatis.annotations.Param;
/**
* Mapper
*
* @author xcs
* @date 202411621:50:13
*/
public interface HardLinkImageAttributeMapper extends BaseMapper<HardLinkImageAttribute> {
/**
*
*
* @param md5 md5
* @return
*/
String queryHardLinkImage(@Param("md5") byte[] md5);
}

@ -1,22 +0,0 @@
package com.xcs.wx.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xcs.wx.domain.HardLinkVideoAttribute;
import org.apache.ibatis.annotations.Param;
/**
* Mapper
*
* @author xcs
* @date 202411621:50:13
*/
public interface HardLinkVideoAttributeMapper extends BaseMapper<HardLinkVideoAttribute> {
/**
*
*
* @param md5 md5
* @return
*/
String queryHardLinkVideo(@Param("md5") byte[] md5);
}

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

Loading…
Cancel
Save