删除target目录

This commit is contained in:
冯聪聪
2026-05-17 19:27:45 +08:00
parent db2f9d7f4b
commit 39f6053665
116 changed files with 288 additions and 491 deletions
+1
View File
@@ -1,2 +1,3 @@
/.idea/
/.vscode/
*/target/
+284
View File
@@ -0,0 +1,284 @@
# Jog System 服务器部署清单
> 适用版本:Jog System v1.0.0
> 后端:Spring Boot 3.4.5 + Java 21
> 前端:Vue 3 + Vite 6(生产构建产物输出至 `jog-admin/src/main/resources/static`,与后端 jar 一体化部署)
> 状态图例:✅ 已完成 ☐ 未完成 ⚠️ 需注意
> **目标服务器**4 核 CPU / 4 GB 内存 / 40 GB 系统盘 / Debian 13.2 (trixie) 64bit
---
## 0. 总体进度
| # | 阶段 | 状态 | 实际使用 |
|:---:|:---|:---:|:---|
| 1 | 服务器基础环境 | ☐ | Debian 13.2 64bit / 4C4G / 40GB |
| 2 | 运行时与构建工具 | 部分(仅 JDK) | JDK 21`openjdk-21-jdk` / Temurin 21),建议本地构建后只上传 jar |
| 3 | 中间件(MySQL / Redis | ☐ | 本机部署 MySQL 8 + Redis 7(受 4GB 内存约束,需调小内存上限) |
| 4 | 邮件服务(SMTP) | ☐ | 使用第三方 SMTP(不在本机部署) |
| 5 | 应用配置与敏感信息 | ☐ | 启用 `application-prod.yml` + 环境变量注入 |
| 6 | 代码拉取与构建 | ☐ | **本地构建**,仅上传 jar(节省服务器内存与磁盘) |
| 7 | 应用部署与启动 | ☐ | systemd 守护,部署目录 `/opt/jog/` |
| 8 | 反向代理与 HTTPS | ☐ | Nginx + Let's Encryptcertbot |
| 9 | 防火墙与安全加固 | ☐ | nftables/ufw + fail2ban |
| 10 | 监控、日志与备份 | ☐ | 轻量方案:journald + mysqldump 定时任务 |
| 11 | 上线后验证 | ☐ | — |
---
## 1. 服务器基础环境
| # | 项目 | 推荐配置 / 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 1.1 | 操作系统 | Linux x86_64(推荐 Ubuntu 22.04 LTS / CentOS Stream 9 / Rocky Linux 9 | ☐ | **Debian 13.2 (trixie) 64bit** ✅ |
| 1.2 | 服务器规格 | 最低 2C4G,推荐 4C8G,系统盘 ≥ 40GB | ☐ | **4 核 / 4 GB 内存 / 40 GB 系统盘** ⚠️ 仅达最低标准,内存需精细分配(应用 ≤ 1.5G、MySQL ≤ 1G、Redis ≤ 256M |
| 1.3 | 时区与时间同步 | 设置为 `Asia/Shanghai`,启用 chronyd / systemd-timesyncd | ☐ | `timedatectl set-timezone Asia/Shanghai`Debian 13 默认启用 `systemd-timesyncd` |
| 1.4 | 主机名与 hosts | 设置规范主机名,必要时配置内网 hosts | ☐ | `hostnamectl set-hostname jog-prod` |
| 1.5 | 部署用户 | 创建非 root 部署用户(如 `deploy`),并配置 sudo / SSH 密钥登录 | ☐ | `adduser deploy && usermod -aG sudo deploy`,仅密钥登录 |
| 1.6 | 关闭 root 密码登录 | `/etc/ssh/sshd_config``PermitRootLogin no` + `PasswordAuthentication no` | ☐ | 修改后 `systemctl restart ssh` |
| 1.7 | 系统更新 | `apt update && apt upgrade -y``dnf update -y` | ☐ | Debian 13 使用 `apt update && apt upgrade -y` |
| 1.8 | 常用工具安装 | `git`, `curl`, `wget`, `unzip`, `vim`, `net-tools`, `lsof` | ☐ | `apt install -y git curl wget unzip vim net-tools lsof ca-certificates gnupg` |
| 1.9 | 文件描述符限制 | `/etc/security/limits.conf``nofile 65535` | ☐ | systemd 服务同步配置 `LimitNOFILE=65535` |
---
## 2. 运行时与构建工具
| # | 项目 | 版本要求 | 验证命令 | 状态 | 实际使用 |
|:---:|:---|:---|:---|:---:|:---|
| 2.1 | **JDK** | **21(项目 `pom.xml` 中 `java.version=21`** | `java -version` | ✅ | Debian 13 官方仓库可直接 `apt install -y openjdk-21-jdk`;或使用 Adoptium Temurin 21 |
| 2.2 | `JAVA_HOME` 环境变量 | 指向 JDK 21 安装路径 | `echo $JAVA_HOME` | ☐ | `/usr/lib/jvm/java-21-openjdk-amd64`,写入 `/etc/profile.d/jdk.sh` |
| 2.3 | Maven | 3.9+ | `mvn -v` | ☐ | **服务器不安装**,本地构建 |
| 2.4 | Maven 镜像源 | `~/.m2/settings.xml` 配置阿里云镜像(加速依赖下载) | — | ☐ | 本地开发机配置阿里云镜像即可 |
| 2.5 | Node.js | 18.x 或更高(推荐 20 LTS | `node -v` | ☐ | **服务器不安装**,本地构建 |
| 2.6 | npm / pnpm | 与 Node 配套 | `npm -v` | ☐ | 本地使用 npm 10+ |
| 2.7 | npm 镜像源 | `npm config set registry https://registry.npmmirror.com` | — | ☐ | 本地配置 |
| 2.8 | Git | 任意现代版本 | `git --version` | ☐ | `apt install -y git`(仅在需要时) |
> ⚠️ 4GB 内存机器建议**采用本地构建后只上传 jar 与静态资源**,服务器不安装 Maven / Node,可显著降低内存与磁盘占用。
---
## 3. 中间件部署
### 3.1 MySQL 8.0+
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 3.1.1 | 安装 MySQL | 8.0+,与 `mysql-connector-j` 兼容 | ☐ | Debian 13 官方仓库**不带 mysql-server**,使用 MySQL 官方 APT 仓库安装 8.0 或改用 MariaDB 11;推荐:从 `https://dev.mysql.com/downloads/repo/apt/` 安装 mysql-server 8.0 |
| 3.1.2 | 启用并设置开机自启 | `systemctl enable --now mysqld` | ☐ | `systemctl enable --now mysql` |
| 3.1.3 | 设置 root 强密码 | 禁止使用默认密码 `root` | ☐ | `mysql_secure_installation` |
| 3.1.4 | 创建数据库 | `CREATE DATABASE jog_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;` | ☐ | 库名固定 `jog_db` |
| 3.1.5 | 创建业务账号 | 创建 `jog` 账户并仅授予 `jog_db` 权限(避免使用 root) | ☐ | 账号 `jog`,密码经环境变量 `JOG_DB_PASSWORD` 注入 |
| 3.1.6 | 字符集与时区 | `character_set_server=utf8mb4``default_time_zone='+08:00'` | ☐ | 写入 `/etc/mysql/mysql.conf.d/jog.cnf` |
| 3.1.7 | bind-address | 仅监听内网或 `127.0.0.1`,不对公网开放 | ☐ | `bind-address = 127.0.0.1` |
| 3.1.8 | Flyway 自动迁移 | 启动时自动执行 `db/migration/V1__init_schema.sql``V2__init_data.sql` | ☐ | 应用首次启动自动完成 |
| 3.1.9 | 默认管理员账号 | 首次登录后立即修改 `admin / Admin@123` 密码 | ☐ | 首次登录后立即修改 |
| 3.1.10 | **内存调优(4GB 机器关键)** | 默认配置可能占用 ≥ 400MB | ☐ | `innodb_buffer_pool_size=512M``max_connections=80`、关闭 performance_schema |
### 3.2 Redis 7.2.x
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 3.2.1 | 安装 Redis | 7.2.x | ☐ | Debian 13 官方仓库提供 Redis 7.x`apt install -y redis-server` |
| 3.2.2 | 设置访问密码 | `requirepass` 配置强密码 | ☐ | 强密码经环境变量 `JOG_REDIS_PASSWORD` 注入并写入 `/etc/redis/redis.conf` |
| 3.2.3 | 绑定地址 | `bind 127.0.0.1` 或内网地址,禁用公网访问 | ☐ | `bind 127.0.0.1` + `protected-mode yes` |
| 3.2.4 | 持久化策略 | 按需启用 RDB / AOF | ☐ | 仅启用 RDB`save 900 1 / 300 10 / 60 10000`),降低磁盘 IO |
| 3.2.5 | maxmemory 与淘汰策略 | 根据服务器内存合理设置 | ☐ | **`maxmemory 256mb`**、`maxmemory-policy allkeys-lru`4GB 机器) |
| 3.2.6 | 开机自启 | `systemctl enable --now redis` | ☐ | `systemctl enable --now redis-server` |
> ⚠️ 当前 `application.yml` 中 Redis 未配置密码,部署到服务器前需在配置中追加 `password` 字段。
---
## 4. 邮件服务(SMTP
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 4.1 | SMTP 服务商 | 阿里云邮推 / 腾讯企业邮 / Gmail / 163 等 | ☐ | 待选用第三方 SMTP(不在本机部署,节省内存) |
| 4.2 | 发件账号与授权码 | 替换 `application.yml``your-mail-password` 占位 | ☐ | 通过环境变量 `JOG_MAIL_PASSWORD` 注入 |
| 4.3 | Host / Port | 替换 `smtp.example.com:587` 为真实地址 | ☐ | 待填入服务商提供的 host/port |
| 4.4 | TLS / SSL | `starttls.enable=true` 或改用 465 + ssl | ☐ | 推荐 465 + SSL |
| 4.5 | 测试发信 | 使用注册流程或独立脚本验证 | ☐ | 通过注册流程验证 |
---
## 5. 应用配置与敏感信息
> 文件位置:`jog-admin/src/main/resources/application.yml`
> 推荐生产环境使用 `application-prod.yml` + `--spring.profiles.active=prod`,并通过环境变量注入密钥。
| # | 配置项 | 当前值 / 风险 | 生产应做 | 状态 | 实际使用 |
|:---:|:---|:---|:---|:---:|:---|
| 5.1 | `server.port` | 8080 | 保持或调整,并与 Nginx 后端一致 | ☐ | 保持 `8080`(仅本机访问) |
| 5.2 | `spring.datasource.url` | `localhost:3306/jog_db` | 改为真实数据库地址 | ☐ | `jdbc:mysql://127.0.0.1:3306/jog_db?...`(本机 MySQL |
| 5.3 | `spring.datasource.username/password` | `root/root` ⚠️ | 改为业务账号 + 强密码(建议环境变量) | ☐ | 用户 `jog`,密码 `${JOG_DB_PASSWORD}` |
| 5.4 | `spring.data.redis.host/port` | `localhost:6379` | 改为真实 Redis 地址 | ☐ | `127.0.0.1:6379`(本机 Redis |
| 5.5 | `spring.data.redis.password` | 未配置 ⚠️ | 增加 `password` 字段 | ☐ | `password: ${JOG_REDIS_PASSWORD}` |
| 5.6 | `spring.mail.*` | 全部为占位 ⚠️ | 替换为真实 SMTP | ☐ | 使用第三方 SMTP,密码 `${JOG_MAIL_PASSWORD}` |
| 5.7 | `jwt.secret` | 默认演示值 ⚠️ | **必须更换为高强度随机串(≥256bit)** | ☐ | `${JOG_JWT_SECRET}`,使用 `openssl rand -base64 64` 生成 |
| 5.8 | `jwt.access-token-expire` 等 | 7200 / 86400 / 1209600 | 按业务策略复核 | ☐ | 暂保持默认 |
| 5.9 | `springdoc.swagger-ui.enabled` | true | **生产建议关闭**`springdoc.swagger-ui.enabled=false``api-docs.enabled=false` | ☐ | 生产 `false` |
| 5.10 | `logging.level.fun.nojava` | DEBUG | 生产改为 `INFO``WARN` | ☐ | 生产 `INFO` |
| 5.11 | `logging.level.org.springframework.security` | DEBUG | 生产改为 `WARN` | ☐ | 生产 `WARN` |
| 5.12 | `mybatis-plus.configuration.log-impl` | StdOutImpl | 生产建议关闭 SQL 控制台输出 | ☐ | 生产移除该配置 |
| 5.13 | 敏感信息外置 | — | 通过 `JOG_DB_PASSWORD``JOG_REDIS_PASSWORD``JOG_JWT_SECRET` 等环境变量注入 | ☐ | 写入 `/opt/jog/jog.env`(权限 600 |
| 5.14 | 文件上传 / 静态资源目录 | — | 若启用图片上传,提前创建目录并赋权 | ☐ | `/opt/jog/uploads`(属主 `deploy`),系统盘仅 40GB 需关注容量 |
---
## 6. 代码拉取与构建
> 模块依赖:`jog-common` → `jog-framework` → `jog-module-system` → `jog-module-blog` / `jog-module-comment` → `jog-admin`(启动入口)。
| # | 步骤 | 命令 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 6.1 | 拉取代码 | `git clone <repo> && cd Jog` | ☐ | **在本地开发机执行**(服务器不安装 Git 也可) |
| 6.2 | 切换到发布分支 / Tag | `git checkout v1.0.0` | ☐ | 本地切换至发布 Tag |
| 6.3 | 前端依赖安装 | `cd jog-frontend && npm ci` | ☐ | 本地执行 |
| 6.4 | 前端生产构建 | `npm run build`(产物输出到 `jog-admin/src/main/resources/static` | ☐ | 本地执行 |
| 6.5 | 后端打包 | `cd .. && mvn clean package -DskipTests` | ☐ | 本地执行 |
| 6.6 | 验证产物 | `ls jog-admin/target/jog-admin.jar` 存在 | ☐ | 本地验证 jar 存在 |
| 6.7 | 上传 jar(如本地构建) | scp / rsync 至服务器部署目录 `/opt/jog/` | ☐ | `scp jog-admin/target/jog-admin.jar deploy@server:/opt/jog/` |
---
## 7. 应用部署与启动
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 7.1 | 部署目录 | 如 `/opt/jog/`,归属 `deploy:deploy` | ☐ | `/opt/jog/``chown -R deploy:deploy /opt/jog` |
| 7.2 | 日志目录 | 如 `/var/log/jog/`,并赋写权限 | ☐ | `/var/log/jog/`,属主 `deploy` |
| 7.3 | 启动脚本 / Systemd 服务 | 创建 `jog.service`,配置 `Restart=always` | ☐ | 见附录 B`/etc/systemd/system/jog.service` |
| 7.4 | JVM 参数 | `-Xms1g -Xmx1g -XX:+UseG1GC -Dfile.encoding=UTF-8` 等按规格调整 | ☐ | **4GB 内存调小**`-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxRAMPercentage=35 -Dfile.encoding=UTF-8` |
| 7.5 | Profile 激活 | `--spring.profiles.active=prod` | ☐ | `--spring.profiles.active=prod` |
| 7.6 | 启动命令示例 | `java $JAVA_OPTS -jar /opt/jog/jog-admin.jar --spring.profiles.active=prod` | ☐ | 同左,由 systemd 拉起 |
| 7.7 | 健康检查 | `curl http://127.0.0.1:8080/`、Swagger 是否按预期关闭 | ☐ | `curl -I http://127.0.0.1:8080/` 返回 200`/swagger-ui.html` 应 404 |
| 7.8 | 开机自启 | `systemctl enable --now jog` | ☐ | `systemctl enable --now jog` |
---
## 8. 反向代理与 HTTPS
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 8.1 | 安装 Nginx | 用于 80/443 入口、反向代理至 8080 | ☐ | `apt install -y nginx`Debian 13 内置) |
| 8.2 | 域名解析 | 将域名 A 记录指向服务器公网 IP | ☐ | 待绑定域名 |
| 8.3 | SSL 证书 | Let's Encryptcertbot)或商业证书 | ☐ | `apt install -y certbot python3-certbot-nginx``certbot --nginx` |
| 8.4 | HTTPS 配置 | 强制 80 → 443 跳转,启用 HSTS | ☐ | certbot 自动配置 + 手工启用 HSTS |
| 8.5 | 反向代理规则 | `location / { proxy_pass http://127.0.0.1:8080; }` 透传 `Host``X-Real-IP``X-Forwarded-For/Proto` | ☐ | `/etc/nginx/sites-available/jog.conf` |
| 8.6 | 上传体积 | `client_max_body_size` 按需调整(富文本图片上传) | ☐ | `client_max_body_size 10m` |
| 8.7 | gzip / brotli | 启用静态资源压缩 | ☐ | 启用 gzip |
| 8.8 | 缓存策略 | 对前端 hash 静态资源设置长缓存 | ☐ | 对 `/assets/` 设置 `expires 30d` |
---
## 9. 防火墙与安全加固
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 9.1 | 安全组 / firewalld / ufw | 仅放行 22 / 80 / 443 | ☐ | Debian 13 使用 `nftables``apt install -y ufw`,仅放行 22/80/443 |
| 9.2 | 关闭对外 8080 | 8080 仅本机访问,由 Nginx 转发 | ☐ | 应用 `server.port=8080` 仅 127.0.0.1,不在防火墙放行 |
| 9.3 | 关闭对外 3306 / 6379 | 数据库与 Redis 仅内网/本机 | ☐ | 均 `bind 127.0.0.1`,不在防火墙放行 |
| 9.4 | SSH 加固 | 改默认端口、密钥登录、禁用 root 登录 | ☐ | 改端口(如 2222)、密钥登录、禁用 root |
| 9.5 | fail2ban | 防 SSH / Nginx 暴力破解 | ☐ | `apt install -y fail2ban`,启用 sshd jail |
| 9.6 | 应用层限流 | 校验 `@RateLimit``RateLimitAspect` 在生产生效 | ☐ | 上线后压测验证 |
| 9.7 | XSS 过滤 | `XssFilter` 已启用,确认未被绕过 | ☐ | 上线后回归测试 |
| 9.8 | JWT 密钥保密 | 不入 Git,仅存服务器环境变量 | ☐ | 写入 `/opt/jog/jog.env`(权限 600 |
| 9.9 | 关闭 Swagger 与 actuator 暴露 | 生产环境严控 | ☐ | `application-prod.yml` 中关闭 |
| 9.10 | 敏感日志脱敏 | 密码、Token 不落日志 | ☐ | 已通过 `logging.level` 控制 |
---
## 10. 监控、日志与备份
| # | 项目 | 说明 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 10.1 | 应用日志路径 | 统一输出至 `/var/log/jog/`,按日滚动 | ☐ | `/var/log/jog/jog.log`logback 按日滚动 |
| 10.2 | 日志保留策略 | 至少保留 14 天,归档压缩 | ☐ | logback 保留 14 天 + gzip |
| 10.3 | 进程监控 | systemd / supervisord 守护,崩溃自动拉起 | ☐ | systemd `Restart=always` |
| 10.4 | 资源监控 | CPU / 内存 / 磁盘 / 网络(如 node_exporter + Prometheus + Grafana | ☐ | **4GB 内存暂不部署 Prometheus 全家桶**,使用 `top/htop``vmstat`、云厂商基础监控 |
| 10.5 | JVM 监控 | 暴露 / 接入监控(actuator + micrometer 视情况开启) | ☐ | 暂不开启(控内存) |
| 10.6 | MySQL 备份 | `mysqldump` 每日定时备份,异地保存 | ☐ | crontab 每日 02:00 `mysqldump jog_db``/opt/backup/`,远端同步 |
| 10.7 | Redis 备份 | RDB/AOF 文件定期备份 | ☐ | 每日打包 `/var/lib/redis/dump.rdb` |
| 10.8 | 文件备份 | 上传文件目录定期备份 | ☐ | 每日同步 `/opt/jog/uploads` 至远端 |
| 10.9 | 异常告警 | 日志 ERROR / 服务宕机告警通道(邮件 / 钉钉 / 企业微信) | ☐ | 接入邮件或企业微信 webhook |
---
## 11. 上线后验证清单
| # | 验证项 | 期望结果 | 状态 | 实际使用 |
|:---:|:---|:---|:---:|:---|
| 11.1 | 访问首页 | `https://your-domain/` 正常加载 Vue 页面 | ☐ | 待绑定域名后验证 |
| 11.2 | 静态资源 | JS/CSS 来自 Nginx,状态码 200 | ☐ | 浏览器 DevTools 验证 |
| 11.3 | 后端接口 | `/api/public/article/list` 返回统一 `ApiResult` | ☐ | `curl` 验证 |
| 11.4 | 注册 / 登录 | 用户可注册、登录、获取 Token | ☐ | 完整业务回归 |
| 11.5 | 管理员登录 | 默认 `admin/Admin@123` 可登录,并已修改密码 | ☐ | 首登后立即改密 |
| 11.6 | Token 刷新 | `/api/public/refresh-token` 正常 | ☐ | Postman 验证 |
| 11.7 | 文章发布 / 评论 | 创建、点赞、评论、嵌套回复均正常 | ☐ | 业务回归 |
| 11.8 | 邮件验证 | 注册邮件可正常收到 | ☐ | 真实邮箱接收测试 |
| 11.9 | Flyway 版本表 | 数据库存在 `flyway_schema_history``success=1` | ☐ | `SELECT * FROM flyway_schema_history` |
| 11.10 | Swagger 关闭 | `/swagger-ui.html` 在生产返回 404 / 403 | ☐ | `curl -I` 验证 |
| 11.11 | 限流验证 | 高频请求触发 429 | ☐ | `ab` / `wrk` 简单压测 |
| 11.12 | XSS 防护 | 提交脚本内容被过滤 | ☐ | 提交 `<script>alert(1)</script>` 验证 |
| 11.13 | HTTPS 与证书 | 浏览器小锁正常,证书未过期 | ☐ | 浏览器 + `openssl s_client` |
| 11.14 | 日志写入 | `/var/log/jog/` 有应用日志输出 | ☐ | `tail -f /var/log/jog/jog.log` |
| 11.15 | 重启恢复 | 重启服务器后服务自启并恢复正常 | ☐ | `reboot` 后验证 |
---
## 附录 A:一键构建参考命令
```bash
# 1. 前端构建(产物自动写入 jog-admin/src/main/resources/static
cd jog-frontend
npm ci
npm run build
# 2. 后端打包
cd ..
mvn clean package -DskipTests
# 3. 上传并运行
scp jog-admin/target/jog-admin.jar deploy@server:/opt/jog/
ssh deploy@server "sudo systemctl restart jog"
```
## 附录 B:systemd 服务模板(参考)
```ini
# /etc/systemd/system/jog.service
[Unit]
Description=Jog System Application
After=network.target mysqld.service redis.service
[Service]
User=deploy
WorkingDirectory=/opt/jog
EnvironmentFile=/opt/jog/jog.env
ExecStart=/usr/bin/java $JAVA_OPTS -jar /opt/jog/jog-admin.jar --spring.profiles.active=prod
SuccessExitStatus=143
Restart=always
RestartSec=5
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
```
```bash
# /opt/jog/jog.env (权限 600,仅 deploy 可读)
# 4GB 内存机器:堆内存调低,给 MySQL/Redis/系统留出空间
JAVA_OPTS=-Xms512m -Xmx1024m -XX:+UseG1GC -XX:MaxRAMPercentage=35 -Dfile.encoding=UTF-8
JOG_DB_PASSWORD=********
JOG_REDIS_PASSWORD=********
JOG_JWT_SECRET=********
JOG_MAIL_PASSWORD=********
```
---
> 本清单基于当前代码库(`pom.xml` Java 21、`application.yml`、`vite.config.js` 一体化构建配置)以及目标服务器(Debian 13.2 / 4C4G / 40GB)生成,后续若引入对象存储、CDN、消息队列、ES 检索等组件,请同步在本文件追加章节并维护。
>
> ⚠️ **4GB 内存预算参考**JVM ≤ 1GB(堆 512m1024m)、MySQL ≤ 1GB、Redis ≤ 256MB、Nginx + 系统 ≈ 512MB,剩余 ~1GB 余量;如果出现 OOM,优先降低 MySQL `innodb_buffer_pool_size` 或将 SMTP/构建迁出本机。
-70
View File
@@ -1,70 +0,0 @@
server:
port: 8080
servlet:
context-path: /
spring:
application:
name: jog-system
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/jog_db?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
username: root
password: root
data:
redis:
host: localhost
port: 6379
database: 0
timeout: 5000ms
lettuce:
pool:
max-active: 20
max-idle: 10
min-idle: 5
mail:
host: smtp.example.com
port: 587
username: noreply@example.com
password: your-mail-password
properties:
mail:
smtp:
auth: true
starttls:
enable: true
flyway:
enabled: true
locations: classpath:db/migration
baseline-on-migrate: true
encoding: UTF-8
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml
configuration:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
jwt:
secret: YourSuperSecretKeyForJwtTokenGenerationMustBeAtLeast256BitsLongForHS256Algorithm
access-token-expire: 7200
refresh-token-expire: 86400
refresh-token-expire-remember: 1209600
springdoc:
api-docs:
enabled: true
path: /v3/api-docs
swagger-ui:
enabled: true
path: /swagger-ui.html
logging:
level:
fun.nojava: DEBUG
org.springframework.security: DEBUG
@@ -1,207 +0,0 @@
-- V1__init_schema.sql
-- 博客系统数据库初始化脚本
CREATE DATABASE IF NOT EXISTS blog_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE blog_db;
-- 用户表
CREATE TABLE IF NOT EXISTS sys_user (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) DEFAULT NULL COMMENT '用户名',
email VARCHAR(100) NOT NULL COMMENT '邮箱',
phone VARCHAR(20) DEFAULT NULL COMMENT '手机号',
password VARCHAR(255) NOT NULL COMMENT '密码',
nickname VARCHAR(50) DEFAULT NULL COMMENT '昵称',
avatar VARCHAR(500) DEFAULT NULL COMMENT '头像URL',
user_type TINYINT NOT NULL DEFAULT 1 COMMENT '用户类型:0管理员 1普通用户',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0正常 1锁定',
locked_until DATETIME DEFAULT NULL COMMENT '锁定截止时间',
login_fail_count INT NOT NULL DEFAULT 0 COMMENT '登录失败次数',
email_verified TINYINT(1) NOT NULL DEFAULT 0 COMMENT '邮箱是否验证',
last_login_ip VARCHAR(50) DEFAULT NULL COMMENT '最后登录IP',
last_login_time DATETIME DEFAULT NULL COMMENT '最后登录时间',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除',
UNIQUE KEY uk_email (email),
UNIQUE KEY uk_username (username),
KEY idx_phone (phone)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
-- 用户会话表
CREATE TABLE IF NOT EXISTS sys_user_session (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL COMMENT '用户ID',
token VARCHAR(500) NOT NULL COMMENT '访问令牌',
device_fingerprint VARCHAR(100) DEFAULT NULL COMMENT '设备指纹',
ip_address VARCHAR(50) DEFAULT NULL COMMENT 'IP地址',
user_agent VARCHAR(500) DEFAULT NULL COMMENT 'User-Agent',
expire_time DATETIME NOT NULL COMMENT '过期时间',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user_id (user_id),
KEY idx_token (token(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户会话表';
-- 登录日志表
CREATE TABLE IF NOT EXISTS sys_login_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT DEFAULT NULL COMMENT '用户ID',
username VARCHAR(100) DEFAULT NULL COMMENT '登录账号',
login_type TINYINT NOT NULL COMMENT '登录类型:0管理员 1用户',
result TINYINT NOT NULL COMMENT '结果:0失败 1成功',
fail_reason VARCHAR(200) DEFAULT NULL COMMENT '失败原因',
ip_address VARCHAR(50) DEFAULT NULL COMMENT 'IP地址',
device_fingerprint VARCHAR(100) DEFAULT NULL COMMENT '设备指纹',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user_id (user_id),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='登录日志表';
-- 用户关注表
CREATE TABLE IF NOT EXISTS sys_user_follow (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
follower_id BIGINT NOT NULL COMMENT '关注者ID',
followee_id BIGINT NOT NULL COMMENT '被关注者ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_follow (follower_id, followee_id),
KEY idx_followee (followee_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户关注表';
-- 通知表
CREATE TABLE IF NOT EXISTS sys_notification (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
receiver_id BIGINT NOT NULL COMMENT '接收者ID',
sender_id BIGINT DEFAULT NULL COMMENT '发送者ID',
type TINYINT NOT NULL COMMENT '类型:0回复 1点赞 2系统',
content VARCHAR(500) NOT NULL COMMENT '内容',
related_id BIGINT DEFAULT NULL COMMENT '关联ID',
is_read TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否已读',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_receiver (receiver_id),
KEY idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='通知表';
-- 系统配置表
CREATE TABLE IF NOT EXISTS sys_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
config_key VARCHAR(100) NOT NULL COMMENT '配置键',
config_value VARCHAR(500) NOT NULL COMMENT '配置值',
description VARCHAR(200) DEFAULT NULL COMMENT '描述',
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_config_key (config_key)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='系统配置表';
-- 敏感词表
CREATE TABLE IF NOT EXISTS sys_sensitive_word (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
word VARCHAR(50) NOT NULL COMMENT '敏感词',
replacement VARCHAR(50) DEFAULT '*' COMMENT '替换词',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_word (word)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='敏感词表';
-- 分类表
CREATE TABLE IF NOT EXISTS blog_category (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL COMMENT '分类名称',
description VARCHAR(200) DEFAULT NULL COMMENT '描述',
enabled TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用',
sort INT NOT NULL DEFAULT 0 COMMENT '排序',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='分类表';
-- 标签表
CREATE TABLE IF NOT EXISTS blog_tag (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL COMMENT '标签名称',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_name (name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='标签表';
-- 文章表
CREATE TABLE IF NOT EXISTS blog_article (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL COMMENT '作者ID',
category_id BIGINT DEFAULT NULL COMMENT '分类ID',
title VARCHAR(200) NOT NULL COMMENT '标题',
summary VARCHAR(500) DEFAULT NULL COMMENT '摘要',
content LONGTEXT NOT NULL COMMENT '内容',
cover_image VARCHAR(500) DEFAULT NULL COMMENT '封面图URL',
status TINYINT NOT NULL DEFAULT 0 COMMENT '状态:0草稿 1已发布 2回收站',
visibility TINYINT NOT NULL DEFAULT 0 COMMENT '可见性:0公开 1私密 2仅粉丝',
view_count INT NOT NULL DEFAULT 0 COMMENT '浏览量',
like_count INT NOT NULL DEFAULT 0 COMMENT '点赞数',
comment_count INT NOT NULL DEFAULT 0 COMMENT '评论数',
allow_comment TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否允许评论',
published_at DATETIME DEFAULT NULL COMMENT '发布时间',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除',
KEY idx_user_id (user_id),
KEY idx_category_id (category_id),
KEY idx_status (status),
KEY idx_published_at (published_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章表';
-- 文章标签关联表
CREATE TABLE IF NOT EXISTS blog_article_tag (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
article_id BIGINT NOT NULL COMMENT '文章ID',
tag_id BIGINT NOT NULL COMMENT '标签ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_article_tag (article_id, tag_id),
KEY idx_tag_id (tag_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章标签关联表';
-- 文章点赞表
CREATE TABLE IF NOT EXISTS blog_article_like (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
article_id BIGINT NOT NULL COMMENT '文章ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_article_user (article_id, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='文章点赞表';
-- 评论表
CREATE TABLE IF NOT EXISTS blog_comment (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
article_id BIGINT NOT NULL COMMENT '文章ID',
user_id BIGINT NOT NULL COMMENT '评论者ID',
parent_id BIGINT DEFAULT NULL COMMENT '父评论ID',
reply_to_user_id BIGINT DEFAULT NULL COMMENT '回复目标用户ID',
content VARCHAR(1000) NOT NULL COMMENT '评论内容',
level TINYINT NOT NULL DEFAULT 1 COMMENT '评论层级',
status TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0待审核 1已通过 2已屏蔽 3已删除',
like_count INT NOT NULL DEFAULT 0 COMMENT '点赞数',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
deleted TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除',
KEY idx_article_id (article_id),
KEY idx_user_id (user_id),
KEY idx_parent_id (parent_id),
KEY idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论表';
-- 评论点赞表
CREATE TABLE IF NOT EXISTS blog_comment_like (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
comment_id BIGINT NOT NULL COMMENT '评论ID',
user_id BIGINT NOT NULL COMMENT '用户ID',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY uk_comment_user (comment_id, user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='评论点赞表';
-- 图片表
CREATE TABLE IF NOT EXISTS blog_image (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL COMMENT '上传者ID',
original_name VARCHAR(200) NOT NULL COMMENT '原始文件名',
stored_name VARCHAR(200) NOT NULL COMMENT '存储文件名',
file_path VARCHAR(500) NOT NULL COMMENT '文件路径',
url VARCHAR(500) NOT NULL COMMENT '访问URL',
file_size BIGINT NOT NULL COMMENT '文件大小(字节)',
mime_type VARCHAR(50) NOT NULL COMMENT 'MIME类型',
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
KEY idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='图片表';
@@ -1,29 +0,0 @@
-- V2__init_data.sql
-- 初始化数据
USE blog_db;
-- 插入管理员账号(密码:Admin@123)
INSERT INTO sys_user (username, email, password, nickname, user_type, status, email_verified)
VALUES ('admin', 'admin@blog.com', '$2a$10$N.zmdr9k7uOCQb376NoUnuTJ8iAt6Z5EHsM8lE9lBOsl7iKTVKIUi', '系统管理员', 0, 0, 1);
-- 插入默认分类
INSERT INTO blog_category (name, description, enabled, sort) VALUES
('技术', '技术相关文章', 1, 1),
('生活', '生活随笔', 1, 2),
('读书', '读书笔记', 1, 3);
-- 插入默认标签
INSERT INTO blog_tag (name) VALUES
('Java'),
('Spring Boot'),
('Vue'),
('前端'),
('数据库');
-- 插入系统配置
INSERT INTO sys_config (config_key, config_value, description) VALUES
('site_name', '我的博客', '站点名称'),
('site_description', '一个简洁的博客系统', '站点描述'),
('comment_audit', 'false', '评论是否需要审核'),
('max_comment_level', '3', '最大评论层级');
@@ -1,3 +0,0 @@
fun\nojava\admin\JogApplication.class
fun\nojava\admin\config\MyBatisPlusConfig$1.class
fun\nojava\admin\config\MyBatisPlusConfig.class
@@ -1,2 +0,0 @@
E:\person\Jog\jog-admin\src\main\java\fun\nojava\admin\config\MyBatisPlusConfig.java
E:\person\Jog\jog-admin\src\main\java\fun\nojava\admin\JogApplication.java
Binary file not shown.
@@ -1,3 +0,0 @@
artifactId=jog-common
groupId=fun.nojava
version=1.0.0
@@ -1,17 +0,0 @@
fun\nojava\common\enums\NotificationType.class
fun\nojava\common\constant\BlogConstants.class
fun\nojava\common\constant\SecurityConstants.class
fun\nojava\common\exception\ErrorCode.class
fun\nojava\common\exception\BusinessException.class
fun\nojava\common\model\IdVO.class
fun\nojava\common\enums\ArticleStatus.class
fun\nojava\common\enums\LoginType.class
fun\nojava\common\enums\UserStatus.class
fun\nojava\common\model\PageResult.class
fun\nojava\common\util\ApiResultUtils.class
fun\nojava\common\model\PageParam.class
fun\nojava\common\enums\CommentStatus.class
fun\nojava\common\enums\ArticleVisibility.class
fun\nojava\common\enums\UserType.class
fun\nojava\common\model\ApiResult.class
fun\nojava\common\annotation\RateLimit.class
@@ -1,17 +0,0 @@
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\annotation\RateLimit.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\constant\BlogConstants.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\constant\SecurityConstants.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\ArticleStatus.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\ArticleVisibility.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\CommentStatus.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\LoginType.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\NotificationType.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\UserStatus.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\enums\UserType.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\exception\BusinessException.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\exception\ErrorCode.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\model\ApiResult.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\model\IdVO.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\model\PageParam.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\model\PageResult.java
E:\person\Jog\jog-common\src\main\java\fun\nojava\common\util\ApiResultUtils.java
Binary file not shown.
@@ -1,3 +0,0 @@
artifactId=jog-framework
groupId=fun.nojava
version=1.0.0
@@ -1,13 +0,0 @@
fun\nojava\framework\security\JwtAuthenticationFilter.class
fun\nojava\framework\util\WebUtils.class
fun\nojava\framework\config\WebConfig.class
fun\nojava\framework\aspect\RateLimitAspect.class
fun\nojava\framework\security\JwtAuthenticationEntryPoint.class
fun\nojava\framework\handler\GlobalExceptionHandler.class
fun\nojava\framework\config\SecurityConfig.class
fun\nojava\framework\wrapper\XssHttpServletRequestWrapper.class
fun\nojava\framework\config\JwtProperties.class
fun\nojava\framework\security\TokenBlacklistService.class
fun\nojava\framework\filter\XssFilter.class
fun\nojava\framework\security\JwtTokenProvider.class
fun\nojava\framework\aspect\LogAspect.class
@@ -1,13 +0,0 @@
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\aspect\LogAspect.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\aspect\RateLimitAspect.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\config\JwtProperties.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\config\SecurityConfig.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\config\WebConfig.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\filter\XssFilter.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\handler\GlobalExceptionHandler.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\security\JwtAuthenticationEntryPoint.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\security\JwtAuthenticationFilter.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\security\JwtTokenProvider.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\security\TokenBlacklistService.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\util\WebUtils.java
E:\person\Jog\jog-framework\src\main\java\fun\nojava\framework\wrapper\XssHttpServletRequestWrapper.java
Binary file not shown.
@@ -1,3 +0,0 @@
artifactId=jog-module-blog
groupId=fun.nojava
version=1.0.0
@@ -1,25 +0,0 @@
fun\nojava\module\blog\entity\ArticleTag.class
fun\nojava\module\blog\service\ArticleService.class
fun\nojava\module\blog\controller\PublicArticleController.class
fun\nojava\module\blog\controller\PublicCategoryController.class
fun\nojava\module\blog\dto\UpdateArticleDTO.class
fun\nojava\module\blog\service\CategoryService.class
fun\nojava\module\blog\dto\ArticleListVO.class
fun\nojava\module\blog\entity\Category.class
fun\nojava\module\blog\dto\CreateArticleDTO.class
fun\nojava\module\blog\service\impl\ArticleServiceImpl.class
fun\nojava\module\blog\dto\ArticleVO$ArticleVOBuilder.class
fun\nojava\module\blog\controller\AdminCategoryController.class
fun\nojava\module\blog\service\impl\CategoryServiceImpl.class
fun\nojava\module\blog\dto\ArticleVO.class
fun\nojava\module\blog\entity\ArticleLike.class
fun\nojava\module\blog\controller\AdminArticleController.class
fun\nojava\module\blog\controller\ArticleController.class
fun\nojava\module\blog\mapper\TagMapper.class
fun\nojava\module\blog\mapper\ArticleLikeMapper.class
fun\nojava\module\blog\dto\ArticleListVO$ArticleListVOBuilder.class
fun\nojava\module\blog\entity\Tag.class
fun\nojava\module\blog\mapper\ArticleMapper.class
fun\nojava\module\blog\entity\Article.class
fun\nojava\module\blog\mapper\CategoryMapper.class
fun\nojava\module\blog\mapper\ArticleTagMapper.class
@@ -1,22 +0,0 @@
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\controller\AdminArticleController.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\controller\ArticleController.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\controller\CategoryController.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\controller\PublicArticleController.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\dto\ArticleListVO.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\dto\ArticleVO.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\dto\CreateArticleDTO.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\dto\UpdateArticleDTO.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\entity\Article.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\entity\ArticleLike.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\entity\ArticleTag.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\entity\Category.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\entity\Tag.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\mapper\ArticleLikeMapper.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\mapper\ArticleMapper.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\mapper\ArticleTagMapper.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\mapper\CategoryMapper.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\mapper\TagMapper.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\service\ArticleService.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\service\CategoryService.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\service\impl\ArticleServiceImpl.java
E:\person\Jog\jog-module-blog\src\main\java\fun\nojava\module\blog\service\impl\CategoryServiceImpl.java
@@ -1,3 +0,0 @@
artifactId=jog-module-comment
groupId=fun.nojava
version=1.0.0
@@ -1,11 +0,0 @@
fun\nojava\module\comment\dto\CreateCommentDTO.class
fun\nojava\module\comment\dto\CommentVO.class
fun\nojava\module\comment\entity\Comment.class
fun\nojava\module\comment\entity\CommentLike.class
fun\nojava\module\comment\controller\CommentController.class
fun\nojava\module\comment\service\CommentService.class
fun\nojava\module\comment\service\impl\CommentServiceImpl.class
fun\nojava\module\comment\dto\CommentVO$CommentVOBuilder.class
fun\nojava\module\comment\mapper\CommentLikeMapper.class
fun\nojava\module\comment\mapper\CommentMapper.class
fun\nojava\module\comment\controller\AdminCommentController.class
@@ -1,9 +0,0 @@
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\controller\CommentController.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\dto\CommentVO.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\dto\CreateCommentDTO.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\entity\Comment.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\entity\CommentLike.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\mapper\CommentLikeMapper.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\mapper\CommentMapper.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\service\CommentService.java
E:\person\Jog\jog-module-comment\src\main\java\fun\nojava\module\comment\service\impl\CommentServiceImpl.java

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