docs: Refresh deployment and API documentation
- Align deployment guidance with the current three-node Compose topology - Document the current frontend architecture and development workflow - Replace the stale API list with a controller-based route index
This commit is contained in:
@@ -0,0 +1,577 @@
|
||||
# HAOVP 1Panel 单机部署指南
|
||||
|
||||
本文档面向一台服务器上的 1Panel 部署。目标是用 1Panel 的容器编排启动后端、基础设施、前端 Nginx,并用 1Panel 网站/OpenResty 对外提供域名访问。
|
||||
|
||||
## 1. 部署结构
|
||||
|
||||
默认编排文件:
|
||||
|
||||
```text
|
||||
backend/docker-compose.1panel.yml
|
||||
```
|
||||
|
||||
配套文件:
|
||||
|
||||
```text
|
||||
backend/.env.1panel.example
|
||||
backend/Dockerfile.service.1panel
|
||||
backend/config/rocketmq/broker-1panel.conf
|
||||
frontend/video-frontend-web/Dockerfile.1panel
|
||||
frontend/video-frontend-web/deploy/nginx.1panel.conf
|
||||
frontend/video-frontend-admin/Dockerfile.1panel
|
||||
frontend/video-frontend-admin/deploy/nginx.1panel.conf
|
||||
```
|
||||
|
||||
默认服务分层:
|
||||
|
||||
| 层级 | 服务 |
|
||||
| --- | --- |
|
||||
| 基础设施 | MySQL, Redis, Redis Sentinel, Nacos, RocketMQ, MinIO, Sentinel Dashboard |
|
||||
| 后端 | video-gateway, video-auth, video-user, video-content, video-comment, video-recommend, video-admin |
|
||||
| 前端 | frontend-web, frontend-admin |
|
||||
| 可选监控 | Prometheus, Grafana, exporters,默认不启动 |
|
||||
|
||||
## 2. 服务器要求
|
||||
|
||||
建议配置:
|
||||
|
||||
| 用途 | 建议 |
|
||||
| --- | --- |
|
||||
| CPU | 最低 4 核,建议 8 核 |
|
||||
| 内存 | 最低 8 GB,建议 16 GB |
|
||||
| 磁盘 | 最低 80 GB,视频上传环境建议更大 |
|
||||
| 系统 | Debian 12 / Ubuntu 22.04+ / CentOS Stream 类系统 |
|
||||
|
||||
1Panel 需已安装 Docker 和 OpenResty。首次构建后端镜像会下载 Maven 依赖,耗时较长。
|
||||
|
||||
## 3. 端口策略
|
||||
|
||||
1Panel 版默认不直接占用公网 `80/443`,避免和 1Panel OpenResty 冲突。
|
||||
|
||||
默认端口绑定:
|
||||
|
||||
| 服务 | 宿主机绑定 | 说明 |
|
||||
| --- | --- | --- |
|
||||
| 用户前端 | `127.0.0.1:18080` | 给 1Panel 网站反代 |
|
||||
| 管理前端 | `127.0.0.1:18081` | 给 1Panel 网站反代 |
|
||||
| API Gateway | `127.0.0.1:9000` | 调试用,不建议公网开放 |
|
||||
| Nacos | `127.0.0.1:8848` | 控制台,仅本机 |
|
||||
| MinIO API | `127.0.0.1:9100` | 对象存储 API,仅本机 |
|
||||
| MinIO Console | `127.0.0.1:9101` | 控制台,仅本机 |
|
||||
| Sentinel | `127.0.0.1:8880` | 控制台,仅本机 |
|
||||
| Prometheus | `127.0.0.1:9090` | 可选监控 |
|
||||
| Grafana | `127.0.0.1:3000` | 可选监控 |
|
||||
|
||||
生产环境防火墙建议只放行:
|
||||
|
||||
```text
|
||||
80/tcp
|
||||
443/tcp
|
||||
1Panel 面板端口
|
||||
SSH 端口
|
||||
```
|
||||
|
||||
不要把 MySQL、Redis、Nacos、RocketMQ、MinIO Console 直接暴露到公网。
|
||||
|
||||
如确需临时从外部访问前端容器端口,可在 `.env.1panel` 中把:
|
||||
|
||||
```env
|
||||
FRONTEND_BIND_ADDR=127.0.0.1
|
||||
```
|
||||
|
||||
改为:
|
||||
|
||||
```env
|
||||
FRONTEND_BIND_ADDR=0.0.0.0
|
||||
```
|
||||
|
||||
不建议在生产长期这样配置。
|
||||
|
||||
## 4. 上传项目
|
||||
|
||||
在服务器上准备项目目录,例如:
|
||||
|
||||
```bash
|
||||
cd /opt
|
||||
git clone <你的仓库地址> HAOVP
|
||||
cd /opt/HAOVP/backend
|
||||
```
|
||||
|
||||
如果通过 1Panel 文件管理上传压缩包,保证目录结构仍然是:
|
||||
|
||||
```text
|
||||
/opt/HAOVP/backend
|
||||
/opt/HAOVP/frontend
|
||||
```
|
||||
|
||||
因为 `docker-compose.1panel.yml` 会从 `../frontend/...` 构建前端镜像。
|
||||
|
||||
## 5. 配置环境变量
|
||||
|
||||
复制示例文件:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP/backend
|
||||
cp .env.1panel.example .env.1panel
|
||||
```
|
||||
|
||||
必须修改这些值:
|
||||
|
||||
```env
|
||||
MYSQL_ROOT_PASSWORD=强密码
|
||||
MYSQL_APP_PASSWORD=强密码
|
||||
REDIS_PASSWORD=强密码
|
||||
MINIO_SECRET_KEY=强密码
|
||||
USER_JWT_SECRET=至少32字节随机字符串
|
||||
ADMIN_JWT_SECRET=至少32字节随机字符串
|
||||
SERVICE_AUTH_TOKEN=至少32字节随机字符串
|
||||
ADMIN_INIT_PASSWORD=后台管理员初始密码
|
||||
NACOS_AUTH_TOKEN=Base64编码且解码后至少32字节的随机字符串
|
||||
GRAFANA_ADMIN_PASSWORD=强密码
|
||||
```
|
||||
|
||||
生成 Nacos token:
|
||||
|
||||
```bash
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
示例值:
|
||||
|
||||
```env
|
||||
NACOS_AUTH_TOKEN=U0VDUkVUS0VZMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkw
|
||||
```
|
||||
|
||||
国内服务器建议保留默认 Maven 镜像:
|
||||
|
||||
```env
|
||||
MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public
|
||||
```
|
||||
|
||||
如果服务器网络能稳定访问 Maven Central,也可以改成:
|
||||
|
||||
```env
|
||||
MAVEN_MIRROR_URL=https://repo.maven.apache.org/maven2
|
||||
```
|
||||
|
||||
首次部署建议保持:
|
||||
|
||||
```env
|
||||
NACOS_USERNAME=nacos
|
||||
NACOS_PASSWORD=nacos
|
||||
```
|
||||
|
||||
原因:Nacos 默认初始化用户是 `nacos/nacos`。如果想改 Nacos 密码,先部署成功,再进入 Nacos 控制台修改用户密码,并同步更新 `.env.1panel` 后重启后端微服务。
|
||||
|
||||
## 6. 在 1Panel 创建编排
|
||||
|
||||
进入 1Panel:
|
||||
|
||||
```text
|
||||
容器 -> 编排 -> 创建编排
|
||||
```
|
||||
|
||||
推荐配置:
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| 名称 | `haovp-1panel` |
|
||||
| 工作目录 | `/opt/HAOVP/backend` |
|
||||
| Compose 文件 | `docker-compose.1panel.yml` |
|
||||
| 环境变量文件 | `.env.1panel` |
|
||||
|
||||
创建后启动编排。
|
||||
|
||||
首次构建会执行:
|
||||
|
||||
| 镜像 | 构建内容 |
|
||||
| --- | --- |
|
||||
| 后端微服务 | Maven 多阶段构建 |
|
||||
| 用户前端 | Node 构建 Vue/Vite,然后 Nginx 托管 |
|
||||
| 管理前端 | Node 构建 Vue/Vite,然后 Nginx 托管 |
|
||||
| Sentinel Dashboard | 下载并打包 Sentinel Dashboard |
|
||||
|
||||
如果服务器网络访问 Maven/npm/Docker Hub 较慢,首次构建可能需要较长时间。
|
||||
|
||||
## 7. 配置 1Panel 网站反代
|
||||
|
||||
推荐用两个域名:
|
||||
|
||||
```text
|
||||
www.example.com -> 用户端
|
||||
admin.example.com -> 管理端
|
||||
```
|
||||
|
||||
### 用户端
|
||||
|
||||
在 1Panel 创建反向代理网站:
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| 主域名 | `www.example.com` |
|
||||
| 代理地址 | `http://127.0.0.1:18080` |
|
||||
|
||||
### 管理端
|
||||
|
||||
在 1Panel 创建反向代理网站:
|
||||
|
||||
| 项 | 值 |
|
||||
| --- | --- |
|
||||
| 主域名 | `admin.example.com` |
|
||||
| 代理地址 | `http://127.0.0.1:18081` |
|
||||
|
||||
然后在两个网站里申请 HTTPS 证书。
|
||||
|
||||
前端容器内部已经处理:
|
||||
|
||||
| 路径 | 转发目标 |
|
||||
| --- | --- |
|
||||
| 用户端 `/api/*` | `video-gateway:9000/*` |
|
||||
| 管理端 `/api/admin/*` | `video-gateway:9000/admin/*` |
|
||||
| `/media/*` | `minio:9000/*` |
|
||||
|
||||
所以 1Panel OpenResty 只需要代理到前端容器端口,不需要再单独配置 `/api`。
|
||||
|
||||
## 8. 启动验证
|
||||
|
||||
在服务器执行:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP/backend
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml ps
|
||||
```
|
||||
|
||||
查看关键日志:
|
||||
|
||||
```bash
|
||||
docker logs -f haovp-mysql
|
||||
docker logs -f haovp-nacos
|
||||
docker logs -f haovp-video-gateway
|
||||
docker logs -f haovp-video-content
|
||||
```
|
||||
|
||||
本机健康检查:
|
||||
|
||||
```bash
|
||||
curl http://127.0.0.1:18080/health
|
||||
curl http://127.0.0.1:18081/health
|
||||
curl http://127.0.0.1:9000/actuator/health
|
||||
```
|
||||
|
||||
浏览器访问:
|
||||
|
||||
```text
|
||||
https://www.example.com
|
||||
https://admin.example.com
|
||||
```
|
||||
|
||||
Nacos 控制台仅建议本机 SSH 隧道或 1Panel 终端访问:
|
||||
|
||||
```text
|
||||
http://127.0.0.1:8848/nacos
|
||||
```
|
||||
|
||||
## 9. 可选启用监控
|
||||
|
||||
默认不会启动 Prometheus/Grafana,节省单机资源。
|
||||
|
||||
命令行启用:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP/backend
|
||||
COMPOSE_PROFILES=monitoring docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d
|
||||
```
|
||||
|
||||
1Panel 中可在环境变量里增加:
|
||||
|
||||
```env
|
||||
COMPOSE_PROFILES=monitoring
|
||||
```
|
||||
|
||||
Grafana 默认本机端口:
|
||||
|
||||
```text
|
||||
http://127.0.0.1:3000
|
||||
```
|
||||
|
||||
不建议直接公网开放 Grafana。
|
||||
|
||||
## 10. 更新部署
|
||||
|
||||
拉取代码后重新构建:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP
|
||||
git pull
|
||||
cd backend
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d --build
|
||||
```
|
||||
|
||||
只重启某个服务:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml restart video-gateway
|
||||
```
|
||||
|
||||
查看资源占用:
|
||||
|
||||
```bash
|
||||
docker stats
|
||||
```
|
||||
|
||||
## 11. 数据备份
|
||||
|
||||
先加载部署环境变量:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP/backend
|
||||
set -a
|
||||
source .env.1panel
|
||||
set +a
|
||||
```
|
||||
|
||||
MySQL:
|
||||
|
||||
```bash
|
||||
docker exec haovp-mysql mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" --all-databases > haovp_mysql_$(date +%F).sql
|
||||
```
|
||||
|
||||
Redis:
|
||||
|
||||
```bash
|
||||
docker exec haovp-redis redis-cli -a "$REDIS_PASSWORD" BGSAVE
|
||||
docker cp haovp-redis:/data/dump.rdb haovp_redis_$(date +%F).rdb
|
||||
```
|
||||
|
||||
MinIO:
|
||||
|
||||
```bash
|
||||
docker run --rm --network haovp-1panel_haovp-network -v "$PWD/backup:/backup" minio/mc sh -c \
|
||||
"mc alias set local http://minio:9000 $MINIO_ACCESS_KEY $MINIO_SECRET_KEY && mc mirror local/$MINIO_BUCKET /backup/$MINIO_BUCKET"
|
||||
```
|
||||
|
||||
也可以直接备份 Docker volume,但数据库类服务建议优先使用逻辑备份。
|
||||
|
||||
## 12. 常见问题
|
||||
|
||||
### 首次启动很慢
|
||||
|
||||
后端镜像会在 Docker 构建阶段执行 Maven 构建,前端镜像会执行 npm 构建。国内服务器建议提前配置 Docker、Maven、npm 镜像源,或在 CI 中构建镜像后推送到私有镜像仓库。
|
||||
|
||||
### Maven 依赖下载失败
|
||||
|
||||
如果日志里出现:
|
||||
|
||||
```text
|
||||
Unknown host repo.maven.apache.org
|
||||
Non-resolvable parent POM
|
||||
```
|
||||
|
||||
说明后端镜像构建阶段无法访问 Maven Central。1Panel 版后端 Dockerfile 已支持 Maven 镜像源,默认:
|
||||
|
||||
```env
|
||||
MAVEN_MIRROR_URL=https://maven.aliyun.com/repository/public
|
||||
```
|
||||
|
||||
修改 `.env.1panel` 后,需要在 1Panel 中重新构建编排。
|
||||
|
||||
### Nacos 显示 unhealthy
|
||||
|
||||
如果 1Panel 日志出现:
|
||||
|
||||
```text
|
||||
dependency failed to start: container haovp-nacos is unhealthy
|
||||
```
|
||||
|
||||
新版编排不再让业务服务等待 Nacos `healthy`,也不再给 Nacos 配置 Docker healthcheck。这样可以避免 1Panel 因 Nacos 启动慢而判定整个编排失败。同步新版 `docker-compose.1panel.yml` 后,需要删除失败编排或重新创建容器,让新的依赖策略生效。
|
||||
|
||||
现在编排里新增了 `haovp-nacos-init` 一次性初始化容器。它会先创建 `nacos_config` 库和表,再决定是否导入默认 Nacos 配置。
|
||||
|
||||
如果仍失败,优先查看初始化容器日志:
|
||||
|
||||
```bash
|
||||
docker logs --tail 200 haovp-nacos-init
|
||||
```
|
||||
|
||||
再查看 Nacos 容器内部日志:
|
||||
|
||||
```bash
|
||||
docker logs --tail 200 haovp-nacos
|
||||
```
|
||||
|
||||
重点检查:
|
||||
|
||||
| 问题 | 处理 |
|
||||
| --- | --- |
|
||||
| `NACOS_AUTH_TOKEN` 相关报错 | 确认 `.env.1panel` 中 `NACOS_AUTH_TOKEN` 是 Base64,且解码后至少 32 字节 |
|
||||
| `No DataSource set` | 先确认服务器上的 `../backend/config/nacos/application-1panel.properties` 是“文件”而不是目录,再确认它被挂载到 `/home/nacos/conf/application.properties`,然后看 `haovp-nacos-init` 是否成功完成 |
|
||||
| 数据库连接失败 | 确认 `haovp-mysql` 正常,且 `haovp-nacos-init` 能连上 MySQL |
|
||||
| 业务服务短暂报 `nacos:9848 Connection refused` | Nacos 2.x 客户端会连接 `8848 + 1000 = 9848` 的 gRPC 端口。启动早期短暂失败后出现 `Success to connect a server [nacos:8848]` 即为自动恢复 |
|
||||
| 端口占用 | 确认宿主机 `8848` 未被其他服务占用,或修改 `NACOS_HTTP_PORT` |
|
||||
|
||||
推荐的检查顺序:
|
||||
|
||||
```bash
|
||||
ls -l /opt/HAOVP/backend/config/nacos/application-1panel.properties
|
||||
docker inspect haovp-nacos --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'
|
||||
docker logs --tail 200 haovp-nacos-init
|
||||
docker rm -f haovp-nacos
|
||||
docker rm -f haovp-nacos-init
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d --force-recreate nacos
|
||||
docker logs --tail 200 haovp-nacos
|
||||
```
|
||||
|
||||
如果 `application-1panel.properties` 在服务器上不存在,Docker 可能会把挂载源当成目录处理,Nacos 就还是读不到数据源配置。
|
||||
|
||||
如果使用了编排里的 `JAVA_OPT_EXT` 兜底,Nacos 启动日志的 `exec java ...` 行里应出现 `--nacos.plugin.datasource.db.url.0=jdbc:mysql://mysql:3306/nacos_config...`。Nacos Docker 启动脚本会把 `JAVA_OPT_EXT` 追加到 `-jar nacos-server.jar` 后面,所以这里必须按 Spring Boot 命令行参数传入。
|
||||
|
||||
如果挂载和启动参数都正确,但仍然是 `No DataSource set`,继续检查 MySQL 里的 Nacos 库表。1Panel 反复创建编排时,`mysql_data` volume 如果已经存在,`/docker-entrypoint-initdb.d/` 下的初始化 SQL 不会再次自动执行:
|
||||
|
||||
```bash
|
||||
cd /opt/HAOVP/backend
|
||||
set -a
|
||||
source .env.1panel
|
||||
set +a
|
||||
|
||||
docker exec haovp-mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -e "
|
||||
SHOW DATABASES LIKE 'nacos_config';
|
||||
SELECT TABLE_NAME FROM information_schema.TABLES
|
||||
WHERE TABLE_SCHEMA='nacos_config'
|
||||
AND TABLE_NAME IN ('config_info','config_info_beta','users','roles');
|
||||
SELECT COUNT(*) AS config_count FROM nacos_config.config_info;
|
||||
"
|
||||
```
|
||||
|
||||
如果缺库或缺表,手动补执行初始化:
|
||||
|
||||
```bash
|
||||
docker exec -i haovp-mysql mysql --default-character-set=utf8mb4 -uroot -p"$MYSQL_ROOT_PASSWORD" < ./sql/nacos-schema.sql
|
||||
docker exec -i haovp-mysql mysql --default-character-set=utf8mb4 -uroot -p"$MYSQL_ROOT_PASSWORD" --force nacos_config < ./sql/nacos-config-init.sql
|
||||
docker rm -f haovp-nacos
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml up -d --force-recreate nacos
|
||||
```
|
||||
|
||||
如果业务服务日志出现 `org.yaml.snakeyaml.parser.ParserException`,并指向 `video-gateway.yaml` 的 `response-body`,说明 Nacos 中已有的配置内容还是旧的错误引号。检查当前内容:
|
||||
|
||||
```bash
|
||||
docker exec haovp-mysql mysql --default-character-set=utf8mb4 -uroot -p"$MYSQL_ROOT_PASSWORD" -N -s -e "SELECT content FROM nacos_config.config_info WHERE data_id='video-gateway.yaml';" | sed -n '50,62p'
|
||||
```
|
||||
|
||||
正确内容应类似:
|
||||
|
||||
```yaml
|
||||
mode: response
|
||||
response-body: '{"code":500,"message":"服务不可用,请稍后再试"}'
|
||||
```
|
||||
|
||||
如果不是这个格式,在 Nacos 控制台修正 `video-gateway.yaml` 后重启网关:
|
||||
|
||||
```bash
|
||||
docker restart haovp-video-gateway
|
||||
curl -i "http://127.0.0.1:${GATEWAY_HTTP_PORT:-9000}/recommend/home?page=1&size=12"
|
||||
```
|
||||
|
||||
### 拉取 `haovp/video-*` 镜像失败
|
||||
|
||||
如果 1Panel 报错类似:
|
||||
|
||||
```text
|
||||
pull access denied for haovp/video-auth
|
||||
```
|
||||
|
||||
说明当前编排文件里仍然带有旧版本地构建镜像名。1Panel 会先按 `image:` 拉取远程镜像,而 `haovp/video-*` 并不是公开镜像仓库。
|
||||
|
||||
解决方式:
|
||||
|
||||
1. 使用新版 `../backend/docker-compose.1panel.yml`。
|
||||
2. 确认 `video-auth`、`video-user`、`video-content`、`frontend-web` 等本地构建服务只有 `build:`,没有 `image: haovp/...`。
|
||||
3. 在 1Panel 中重新加载编排文件后再启动。
|
||||
|
||||
### 后端连接 RocketMQ 失败
|
||||
|
||||
1Panel 版已使用单机配置:
|
||||
|
||||
```text
|
||||
backend/config/rocketmq/broker-1panel.conf
|
||||
NAMESRV_ADDR=rmqnamesrv:9876
|
||||
```
|
||||
|
||||
如果仍失败,检查:
|
||||
|
||||
```bash
|
||||
docker logs haovp-rmqnamesrv
|
||||
docker logs haovp-rmqbroker
|
||||
docker logs haovp-video-content
|
||||
```
|
||||
|
||||
### 前端接口 404
|
||||
|
||||
确认前端环境变量没有改错:
|
||||
|
||||
| 前端 | 构建参数 |
|
||||
| --- | --- |
|
||||
| 用户端 | `VITE_API_BASE_URL=/api` |
|
||||
| 管理端 | `VITE_API_BASE_URL=/api/admin` |
|
||||
|
||||
前端 Nginx 会把用户端 `/api/auth/login` 转发为网关 `/auth/login`,把管理端 `/api/admin/auth/login` 转发为网关 `/admin/auth/login`。
|
||||
|
||||
### 前端接口 502
|
||||
|
||||
如果 `curl http://127.0.0.1:${WEB_HTTP_PORT:-18180}/health` 正常,但 `/api/...` 返回 `502 Bad Gateway`,先看前端 Nginx 日志:
|
||||
|
||||
```bash
|
||||
docker logs --tail 120 haovp-frontend-web
|
||||
```
|
||||
|
||||
如果出现 `connect() failed (111: Connection refused) while connecting to upstream`,且 upstream 指向旧的 Docker 内网 IP,说明前端 Nginx 缓存了重建前的 gateway 地址。新版 `nginx.1panel.conf` 已使用 Docker DNS 动态解析;同步配置并重建前端,临时恢复可先执行:
|
||||
|
||||
```bash
|
||||
docker restart haovp-frontend-web
|
||||
```
|
||||
|
||||
如果直连网关仍是 404:
|
||||
|
||||
```bash
|
||||
curl -i "http://127.0.0.1:${GATEWAY_HTTP_PORT:-9000}/recommend/home?page=1&size=12"
|
||||
```
|
||||
|
||||
返回 `No static resource recommend/home` 时,表示 gateway 没加载到 `/recommend/**` 路由,优先按上面的 `video-gateway.yaml` 检查 Nacos 配置。
|
||||
|
||||
### 图片或视频无法访问
|
||||
|
||||
前端使用:
|
||||
|
||||
```text
|
||||
VITE_MEDIA_BASE_URL=/media/video-platform
|
||||
```
|
||||
|
||||
前端 Nginx 会把 `/media/video-platform/...` 转发到 MinIO 的 `/video-platform/...`。确认 `minio-init` 已成功创建 bucket:
|
||||
|
||||
```bash
|
||||
docker logs haovp-minio-init
|
||||
```
|
||||
|
||||
### Nacos 密码修改后服务启动失败
|
||||
|
||||
如果在 Nacos 控制台改了 `nacos` 用户密码,必须同步修改 `.env.1panel`:
|
||||
|
||||
```env
|
||||
NACOS_PASSWORD=新密码
|
||||
```
|
||||
|
||||
然后重启后端服务:
|
||||
|
||||
```bash
|
||||
docker compose --env-file .env.1panel -f docker-compose.1panel.yml restart video-gateway video-auth video-user video-content video-comment video-recommend video-admin
|
||||
```
|
||||
|
||||
### 内存不足
|
||||
|
||||
降低 `.env.1panel` 中各服务 JVM 参数,例如:
|
||||
|
||||
```env
|
||||
CONTENT_JAVA_OPTS=-Xms128m -Xmx384m
|
||||
AUTH_JAVA_OPTS=-Xms96m -Xmx192m
|
||||
```
|
||||
|
||||
同时不要启用 `monitoring` profile。
|
||||
+54
-1080
File diff suppressed because it is too large
Load Diff
+22
-141
@@ -1,142 +1,23 @@
|
||||
# HAOVP接口列表
|
||||
# HAOVP 接口索引
|
||||
|
||||
| 序号 | 接口名称 | 请求类型 | 接口路径 | 接口分组 |
|
||||
| ---- | ---------------------------- | -------- | ----------------------------------------------- | --------------------------------------------------- |
|
||||
| 1 | 用户登录 | POST | /auth/login | 根目录/video-auth/认证控制器 |
|
||||
| 2 | 用户注册 | POST | /auth/register | 根目录/video-auth/认证控制器 |
|
||||
| 3 | 生成验证码 | GET | /auth/captcha | 根目录/video-auth/认证控制器 |
|
||||
| 4 | 刷新令牌 | POST | /auth/refresh | 根目录/video-auth/认证控制器 |
|
||||
| 5 | 用户登出 | POST | /auth/logout | 根目录/video-auth/认证控制器 |
|
||||
| 6 | 获取当前用户信息 | GET | /auth/current | 根目录/video-auth/认证控制器 |
|
||||
| 7 | 根据ID获取用户名 | GET | /auth/username/{userId} | 根目录/video-auth/认证控制器 |
|
||||
| 8 | 获取登录统计-管理接口 | GET | /auth/admin/login/stats | 根目录/video-auth/认证管理控制器-供管理后台调用 |
|
||||
| 9 | 管理员重置用户密码-管理接口 | PUT | /auth/admin/reset-password/{userId} | 根目录/video-auth/认证管理控制器-供管理后台调用 |
|
||||
| 10 | 锁定/解锁用户账号-管理接口 | PUT | /auth/admin/lock/{userId}/{locked} | 根目录/video-auth/认证管理控制器-供管理后台调用 |
|
||||
| 11 | 关注用户 | POST | /user/follow/{followId} | 根目录/video-user/用户关注控制器 |
|
||||
| 12 | 取消关注 | DELETE | /user/follow/{followId} | 根目录/video-user/用户关注控制器 |
|
||||
| 13 | 获取用户关注列表 | GET | /user/follow/following/{userId} | 根目录/video-user/用户关注控制器 |
|
||||
| 14 | 获取用户粉丝列表 | GET | /user/follow/followers/{userId} | 根目录/video-user/用户关注控制器 |
|
||||
| 15 | 检查是否已关注 | GET | /user/follow/check/{followId} | 根目录/video-user/用户关注控制器 |
|
||||
| 16 | 发送私信 | POST | /user/message | 根目录/video-user/用户私信控制器 |
|
||||
| 17 | 获取私信列表(按会话分组) | GET | /user/message/list | 根目录/video-user/用户私信控制器 |
|
||||
| 18 | 获取与指定用户的私信记录 | GET | /user/message/detail/{targetId} | 根目录/video-user/用户私信控制器 |
|
||||
| 19 | 标记私信为已读 | PUT | /user/message/read/{senderId} | 根目录/video-user/用户私信控制器 |
|
||||
| 20 | 获取未读私信数量 | GET | /user/message/unread/count | 根目录/video-user/用户私信控制器 |
|
||||
| 21 | 初始化用户资料 | POST | /user/profile/init | 根目录/video-user/用户资料控制器 |
|
||||
| 22 | 获取当前用户资料 | GET | /user/profile/current | 根目录/video-user/用户资料控制器 |
|
||||
| 23 | 获取指定用户资料 | GET | /user/profile/public/{userId} | 根目录/video-user/用户资料控制器 |
|
||||
| 24 | 更新用户资料 | PUT | /user/profile | 根目录/video-user/用户资料控制器 |
|
||||
| 25 | 上传头像 | POST | /user/profile/avatar | 根目录/video-user/用户资料控制器 |
|
||||
| 26 | 搜索用户 | GET | /user/profile/search | 根目录/video-user/用户资料控制器 |
|
||||
| 27 | 增加用户视频数量 | POST | /user/profile/count/video/{userId}/{count} | 根目录/video-user/用户资料控制器 |
|
||||
| 28 | 增加用户获赞数量 | POST | /user/profile/count/like/{userId}/{count} | 根目录/video-user/用户资料控制器 |
|
||||
| 29 | 增加用户收藏数量 | POST | /user/profile/count/favorite/{userId}/{count} | 根目录/video-user/用户资料控制器 |
|
||||
| 30 | 获取用户设置 | GET | /user/setting | 根目录/video-user/用户设置控制器 |
|
||||
| 31 | 更新用户设置 | PUT | /user/setting | 根目录/video-user/用户设置控制器 |
|
||||
| 32 | 获取通知列表 | GET | /user/notification/list | 根目录/video-user/用户通知控制器 |
|
||||
| 33 | 标记通知为已读 | PUT | /user/notification/read | 根目录/video-user/用户通知控制器 |
|
||||
| 34 | 标记指定通知为已读 | PUT | /user/notification/read/{notificationId} | 根目录/video-user/用户通知控制器 |
|
||||
| 35 | 获取未读通知数量 | GET | /user/notification/unread/count | 根目录/video-user/用户通知控制器 |
|
||||
| 36 | 发送用户通知 | POST | /user/notification/send/{userId}/{type} | 根目录/video-user/用户通知控制器 |
|
||||
| 37 | 获取用户列表-管理接口 | GET | /user/profile/admin/list | 根目录/video-user/用户管理控制器-供管理后台调用 |
|
||||
| 38 | 获取用户详情-管理接口 | GET | /user/profile/admin/{userId} | 根目录/video-user/用户管理控制器-供管理后台调用 |
|
||||
| 39 | 禁用/启用用户-管理接口 | PUT | /user/profile/admin/status/{userId}/{status} | 根目录/video-user/用户管理控制器-供管理后台调用 |
|
||||
| 40 | 重置用户密码-管理接口 | PUT | /user/profile/admin/reset-password/{userId} | 根目录/video-user/用户管理控制器-供管理后台调用 |
|
||||
| 41 | 获取用户统计信息-管理接口 | GET | /user/profile/admin/stats | 根目录/video-user/用户管理控制器-供管理后台调用 |
|
||||
| 42 | 获取标签列表 | GET | /content/tag/list | 根目录/video-content/标签控制器 |
|
||||
| 43 | 分页获取标签列表 | GET | /content/tag/page | 根目录/video-content/标签控制器 |
|
||||
| 44 | 添加标签 | POST | /content/tag | 根目录/video-content/标签控制器 |
|
||||
| 45 | 更新标签 | PUT | /content/tag | 根目录/video-content/标签控制器 |
|
||||
| 46 | 删除标签 | DELETE | /content/tag/{id} | 根目录/video-content/标签控制器 |
|
||||
| 47 | 获取视频标签 | GET | /content/tag/video/{videoId} | 根目录/video-content/标签控制器 |
|
||||
| 48 | 上传视频 | POST | /content/video/upload | 根目录/video-content/视频控制器 |
|
||||
| 49 | 创建视频 | POST | /content/video | 根目录/video-content/视频控制器 |
|
||||
| 50 | 获取视频详情(公开接口) | GET | /content/video/public/{id} | 根目录/video-content/视频控制器 |
|
||||
| 51 | 获取视频列表(公开接口) | GET | /content/video/public/list | 根目录/video-content/视频控制器 |
|
||||
| 52 | 获取视频详情 | GET | /content/video/{id} | 根目录/video-content/视频控制器 |
|
||||
| 53 | 获取视频列表 | GET | /content/video/list | 根目录/video-content/视频控制器 |
|
||||
| 54 | 更新视频信息 | PUT | /content/video | 根目录/video-content/视频控制器 |
|
||||
| 55 | 删除视频 | DELETE | /content/video/{id} | 根目录/video-content/视频控制器 |
|
||||
| 56 | 点赞视频 | POST | /content/video/like/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 57 | 取消点赞 | DELETE | /content/video/like/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 58 | 投币 | POST | /content/video/coin/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 59 | 收藏视频 | POST | /content/video/favorite | 根目录/video-content/视频控制器 |
|
||||
| 60 | 取消收藏 | DELETE | /content/video/favorite/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 61 | 分享视频 | POST | /content/video/share/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 62 | 播放记录 | POST | /content/video/play | 根目录/video-content/视频控制器 |
|
||||
| 63 | 获取用户视频列表 | GET | /content/video/user/{userId} | 根目录/video-content/视频控制器 |
|
||||
| 64 | 视频审核 | POST | /content/video/review/{videoId} | 根目录/video-content/视频控制器 |
|
||||
| 65 | 增加视频评论数量 | POST | /content/video/count/comment/{videoId}/{count} | 根目录/video-content/视频控制器 |
|
||||
| 66 | 发送弹幕 | POST | /content/danmaku | 根目录/video-content/弹幕控制器 |
|
||||
| 67 | 获取视频指定时间段的弹幕 | GET | /content/danmaku/time | 根目录/video-content/弹幕控制器 |
|
||||
| 68 | 获取视频所有弹幕 | GET | /content/danmaku/all/{videoId} | 根目录/video-content/弹幕控制器 |
|
||||
| 69 | 获取分类树 | GET | /content/category/tree | 根目录/video-content/分类控制器 |
|
||||
| 70 | 获取分类列表 | GET | /content/category/list | 根目录/video-content/分类控制器 |
|
||||
| 71 | 添加分类 | POST | /content/category | 根目录/video-content/分类控制器 |
|
||||
| 72 | 更新分类 | PUT | /content/category | 根目录/video-content/分类控制器 |
|
||||
| 73 | 删除分类 | DELETE | /content/category/{id} | 根目录/video-content/分类控制器 |
|
||||
| 74 | 获取用户收藏夹列表 | GET | /content/favorite/list | 根目录/video-content/收藏夹控制器 |
|
||||
| 75 | 创建收藏夹 | POST | /content/favorite | 根目录/video-content/收藏夹控制器 |
|
||||
| 76 | 更新收藏夹 | PUT | /content/favorite | 根目录/video-content/收藏夹控制器 |
|
||||
| 77 | 删除收藏夹 | DELETE | /content/favorite/{id} | 根目录/video-content/收藏夹控制器 |
|
||||
| 78 | 获取收藏夹中的视频 | GET | /content/favorite/{favoriteId}/videos | 根目录/video-content/收藏夹控制器 |
|
||||
| 79 | 获取视频每日统计 | GET | /content/stat/daily/{videoId} | 根目录/video-content/视频统计控制器 |
|
||||
| 80 | 获取视频播放趋势(按小时) | GET | /content/stat/play/trend/{videoId} | 根目录/video-content/视频统计控制器 |
|
||||
| 81 | 获取视频互动统计 | GET | /content/stat/interaction/{videoId} | 根目录/video-content/视频统计控制器 |
|
||||
| 82 | 获取视频列表-管理接口 | GET | /content/video/admin/list | 根目录/video-content/视频管理控制器-供管理后台调用 |
|
||||
| 83 | 获取视频详情-管理接口 | GET | /content/video/admin/{videoId} | 根目录/video-content/视频管理控制器-供管理后台调用 |
|
||||
| 84 | 审核视频-管理接口 | POST | /content/video/admin/review/{videoId} | 根目录/video-content/视频管理控制器-供管理后台调用 |
|
||||
| 85 | 下架视频-管理接口 | PUT | /content/video/admin/disable/{videoId} | 根目录/video-content/视频管理控制器-供管理后台调用 |
|
||||
| 86 | 获取视频统计信息-管理接口 | GET | /content/video/admin/stats | 根目录/video-content/视频管理控制器-供管理后台调用 |
|
||||
| 87 | 获取分类列表-管理接口 | GET | /content/category/admin/list | 根目录/video-content/分类管理控制器-供管理后台调用 |
|
||||
| 88 | 添加分类-管理接口 | POST | /content/category/admin | 根目录/video-content/分类管理控制器-供管理后台调用 |
|
||||
| 89 | 更新分类-管理接口 | PUT | /content/category/admin | 根目录/video-content/分类管理控制器-供管理后台调用 |
|
||||
| 90 | 删除分类-管理接口 | DELETE | /content/category/admin/{categoryId} | 根目录/video-content/分类管理控制器-供管理后台调用 |
|
||||
| 91 | 获取首页推荐 | GET | /recommend/home | 根目录/video-recommend/推荐控制器 |
|
||||
| 92 | 获取热门推荐 | GET | /recommend/hot | 根目录/video-recommend/推荐控制器 |
|
||||
| 93 | 获取相似视频推荐 | GET | /recommend/similar/{videoId} | 根目录/video-recommend/推荐控制器 |
|
||||
| 94 | 获取标签视频推荐 | GET | /recommend/tag/{tagId} | 根目录/video-recommend/推荐控制器 |
|
||||
| 95 | 记录用户行为 | POST | /recommend/behavior | 根目录/video-recommend/推荐控制器 |
|
||||
| 96 | 更新用户兴趣 | POST | /recommend/interest/update | 根目录/video-recommend/推荐控制器 |
|
||||
| 97 | 添加回复 | POST | /comment/reply | 根目录/video-comment/回复控制器 |
|
||||
| 98 | 获取评论的回复列表(公开接口) | GET | /comment/reply/public/list/{commentId} | 根目录/video-comment/回复控制器 |
|
||||
| 99 | 获取评论的热门回复(公开接口) | GET | /comment/reply/public/hot/{commentId} | 根目录/video-comment/回复控制器 |
|
||||
| 100 | 删除回复 | DELETE | /comment/reply/{id} | 根目录/video-comment/回复控制器 |
|
||||
| 101 | 点赞回复 | POST | /comment/reply/like/{id} | 根目录/video-comment/回复控制器 |
|
||||
| 102 | 取消点赞回复 | DELETE | /comment/reply/like/{id} | 根目录/video-comment/回复控制器 |
|
||||
| 103 | 添加评论 | POST | /comment | 根目录/video-comment/评论控制器 |
|
||||
| 104 | 获取评论列表(公开接口) | GET | /comment/public/list | 根目录/video-comment/评论控制器 |
|
||||
| 105 | 获取评论详情(公开接口) | GET | /comment/public/detail/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 106 | 删除评论 | DELETE | /comment/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 107 | 点赞评论 | POST | /comment/like/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 108 | 取消点赞评论 | DELETE | /comment/like/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 109 | 置顶评论 | POST | /comment/top/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 110 | 取消置顶评论 | DELETE | /comment/top/{id} | 根目录/video-comment/评论控制器 |
|
||||
| 111 | 获取评论统计信息(公开接口) | GET | /comment/public/stat/{videoId} | 根目录/video-comment/评论控制器 |
|
||||
| 112 | 获取评论列表-管理接口 | GET | /comment/admin/list | 根目录/video-comment/评论管理控制器-供管理后台调用 |
|
||||
| 113 | 获取评论详情-管理接口 | GET | /comment/admin/{commentId} | 根目录/video-comment/评论管理控制器-供管理后台调用 |
|
||||
| 114 | 删除评论-管理接口 | DELETE | /comment/admin/{commentId} | 根目录/video-comment/评论管理控制器-供管理后台调用 |
|
||||
| 115 | 获取评论统计信息-管理接口 | GET | /comment/admin/stats | 根目录/video-comment/评论管理控制器-供管理后台调用 |
|
||||
| 116 | 获取验证码 | GET | /admin/auth/captcha | 根目录/video-admin/认证控制器 |
|
||||
| 117 | 登录 | POST | /admin/auth/login | 根目录/video-admin/认证控制器 |
|
||||
| 118 | 登出 | POST | /admin/auth/logout | 根目录/video-admin/认证控制器 |
|
||||
| 119 | 获取当前用户信息 | GET | /admin/auth/info | 根目录/video-admin/认证控制器 |
|
||||
| 120 | 获取管理员列表 | GET | /admin/user/list | 根目录/video-admin/管理员控制器 |
|
||||
| 121 | 获取管理员详情 | GET | /admin/user/{id} | 根目录/video-admin/管理员控制器 |
|
||||
| 122 | 添加管理员 | POST | /admin/user | 根目录/video-admin/管理员控制器 |
|
||||
| 123 | 更新管理员 | PUT | /admin/user | 根目录/video-admin/管理员控制器 |
|
||||
| 124 | 删除管理员 | DELETE | /admin/user/{id} | 根目录/video-admin/管理员控制器 |
|
||||
| 125 | 启用/禁用管理员 | PUT | /admin/user/{id}/status/{status} | 根目录/video-admin/管理员控制器 |
|
||||
| 126 | 重置密码 | PUT | /admin/user/{id}/reset-password | 根目录/video-admin/管理员控制器 |
|
||||
| 127 | 获取用户列表 | GET | /admin/platform/user/list | 根目录/video-admin/用户管理控制器 |
|
||||
| 128 | 获取用户详情 | GET | /admin/platform/user/{userId} | 根目录/video-admin/用户管理控制器 |
|
||||
| 129 | 禁用/启用用户 | PUT | /admin/platform/user/{userId}/status/{status} | 根目录/video-admin/用户管理控制器 |
|
||||
| 130 | 重置用户密码 | PUT | /admin/platform/user/{userId}/reset-password | 根目录/video-admin/用户管理控制器 |
|
||||
| 131 | 获取视频列表 | GET | /admin/platform/content/video/list | 根目录/video-admin/内容管理控制器 |
|
||||
| 132 | 获取视频详情 | GET | /admin/platform/content/video/{videoId} | 根目录/video-admin/内容管理控制器 |
|
||||
| 133 | 审核视频 | POST | /admin/platform/content/video/review/{videoId} | 根目录/video-admin/内容管理控制器 |
|
||||
| 134 | 下架视频 | PUT | /admin/platform/content/video/disable/{videoId} | 根目录/video-admin/内容管理控制器 |
|
||||
| 135 | 获取分类列表 | GET | /admin/platform/content/category/list | 根目录/video-admin/内容管理控制器 |
|
||||
| 136 | 添加分类 | POST | /admin/platform/content/category | 根目录/video-admin/内容管理控制器 |
|
||||
| 137 | 更新分类 | PUT | /admin/platform/content/category | 根目录/video-admin/内容管理控制器 |
|
||||
| 138 | 删除分类 | DELETE | /admin/platform/content/category/{categoryId} | 根目录/video-admin/内容管理控制器 |
|
||||
接口以 `backend/*/src/main/java/**/controller/*Controller.java` 中的 Spring MVC 注解为唯一权威来源。此前的逐条静态清单与代码已发生偏差,现改为维护当前 Controller 路由索引,避免遗漏新增接口或保留已删除接口。
|
||||
|
||||
所有客户端业务请求默认经 `video-gateway:9000` 访问;以下为网关后的路径前缀。
|
||||
|
||||
| 服务 | Controller | 路由前缀 |
|
||||
| --- | --- | --- |
|
||||
| 认证 | `AuthController` / `AdminAuthController` | `/auth` / `/auth/admin` |
|
||||
| 用户 | `UserProfileController` / `UserFollowController` / `UserMessageController` / `UserNotificationController` / `UserSettingController` / `AdminUserController` | `/user/profile`、`/user/follow`、`/user/message`、`/user/notification`、`/user/setting`、`/user/profile/admin` |
|
||||
| 内容 | `VideoController` / `CategoryController` / `TagController` / `FavoriteController` / `DanmakuController` / `VideoStatController` | `/content/video`、`/content/category`、`/content/tag`、`/content/favorite`、`/content/danmaku`、`/content/stat` |
|
||||
| 内容管理 | `AdminVideoController` / `AdminCategoryController` | `/content/video/admin` / `/content/category/admin` |
|
||||
| 评论 | `CommentController` / `ReplyController` / `AdminCommentController` | `/comment` / `/comment/reply` / `/comment/admin` |
|
||||
| 推荐 | `RecommendController` | `/recommend` |
|
||||
| 管理端 | `AuthController` / `AdminUserController` / `AdminRoleController` / `UserManageController` / `ContentManageController` / `CommentManageController` / `DashboardController` | `/admin/auth`、`/admin/user`、`/admin/role`、`/admin/platform/user`、`/admin/platform/content`、`/admin/platform/comment`、`/admin/dashboard` |
|
||||
|
||||
## 主要公开路由
|
||||
|
||||
网关白名单由 `video-gateway.yaml` 和 `GATEWAY_IGNORE_URLS` 配置控制,当前包含登录/注册/验证码/令牌刷新、公开视频与分类/标签/弹幕/统计、公开用户主页与搜索、公开评论回复以及推荐接口等。白名单属于安全配置,变更时必须同步审查网关过滤器和 Nacos 配置。
|
||||
|
||||
## 维护方式
|
||||
|
||||
新增或修改接口时,应同时更新 Controller 注释、DTO 校验和前端 `src/api` 调用;再检查网关公开路由是否需要调整。接口鉴权、参数和响应字段请直接查阅对应 Controller、DTO/VO 与 `Result`,不要依赖旧版本的 curl 示例。
|
||||
|
||||
+17
-444
@@ -1,458 +1,31 @@
|
||||
# HA-OVP 前端项目文档
|
||||
# HAOVP 前端架构(当前版本)
|
||||
|
||||
## 项目概述
|
||||
前端包含两个独立的 Vue 3 + TypeScript + Vite 应用:
|
||||
|
||||
HA-OVP(高可用在线视频平台)前端系统包含两个独立的 Vue 3 项目:
|
||||
- `frontend/video-frontend-web`:用户端,端口 3000
|
||||
- `frontend/video-frontend-admin`:管理端,端口 3100
|
||||
|
||||
- **video-platform-web**: 用户端前台,面向普通用户
|
||||
- **video-platform-admin**: 管理端后台,面向管理员
|
||||
## 依赖
|
||||
|
||||
## 技术栈
|
||||
两端共用 Vue Router 4、Pinia、Axios、Day.js、NProgress。用户端使用 Vant 4、Artplayer 5.1.7 和 `artplayer-plugin-danmuku` 5.1.0;管理端使用 Element Plus 2.6、ECharts 5.5 和 SortableJS。项目脚本使用 npm、pnpm 均可,具体以各目录 `package.json` 为准。
|
||||
|
||||
### 共同技术
|
||||
## 目录职责
|
||||
|
||||
| 类别 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| 框架 | Vue 3 | ^3.4 |
|
||||
| 语言 | TypeScript | ^5.0 |
|
||||
| 构建工具 | Vite | ^5.0 |
|
||||
| 状态管理 | Pinia | ^2.1 |
|
||||
| 路由 | Vue Router | ^4.2 |
|
||||
| HTTP客户端 | Axios | ^1.6 |
|
||||
| 样式 | SCSS | - |
|
||||
| 日期处理 | Day.js | ^1.11 |
|
||||
| 进度条 | NProgress | ^0.2 |
|
||||
两端均采用 `api`(接口封装)、`components`、`router`、`stores`、`types`、`utils`、`views` 分层。用户端额外包含视频、评论、弹幕和布局组件;管理端包含 dashboard、用户、视频审核、内容分类/标签、评论和系统管理页面。
|
||||
|
||||
### 用户端前台 (video-platform-web)
|
||||
## 请求与认证
|
||||
|
||||
| 类别 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| UI组件库 | Vant 4 | ^4.8 |
|
||||
| 视频播放器 | DPlayer | - |
|
||||
开发服务器将 `/api` 去前缀后代理到网关。代理地址由 `VITE_PROXY_TARGET` 控制,默认值是 `http://192.168.1.101:9000`。用户端和管理端分别使用独立的 Axios 封装、Token 存储和路由守卫;生产环境应通过 Nginx/OpenResty 将 `/api` 转发到网关,而不是直连业务服务。
|
||||
|
||||
### 管理端后台 (video-platform-admin)
|
||||
|
||||
| 类别 | 技术 | 版本 |
|
||||
|------|------|------|
|
||||
| UI组件库 | Element Plus | ^2.5 |
|
||||
| 图标 | @element-plus/icons-vue | ^2.3 |
|
||||
| 图表 | ECharts | ^5.5 |
|
||||
|
||||
## 目录结构
|
||||
|
||||
### 用户端前台
|
||||
|
||||
```
|
||||
video-platform-web/
|
||||
├── public/ # 静态资源
|
||||
├── src/
|
||||
│ ├── api/ # API 接口封装
|
||||
│ │ ├── auth.ts # 认证相关
|
||||
│ │ ├── user.ts # 用户相关
|
||||
│ │ ├── video.ts # 视频相关
|
||||
│ │ ├── comment.ts # 评论相关
|
||||
│ │ ├── category.ts # 分类相关
|
||||
│ │ ├── danmaku.ts # 弹幕相关
|
||||
│ │ ├── favorite.ts # 收藏相关
|
||||
│ │ ├── recommend.ts # 推荐相关
|
||||
│ │ └── index.ts # 导出
|
||||
│ ├── assets/ # 资源文件
|
||||
│ ├── components/ # 公共组件
|
||||
│ │ ├── layout/ # 布局组件
|
||||
│ │ ├── video/ # 视频组件
|
||||
│ │ ├── comment/ # 评论组件
|
||||
│ │ └── danmaku/ # 弹幕组件
|
||||
│ ├── composables/ # 组合式函数
|
||||
│ ├── directives/ # 自定义指令
|
||||
│ ├── router/ # 路由配置
|
||||
│ ├── stores/ # Pinia 状态管理
|
||||
│ │ ├── user.ts # 用户状态
|
||||
│ │ ├── video.ts # 视频状态
|
||||
│ │ ├── favorite.ts # 收藏状态
|
||||
│ │ ├── message.ts # 消息状态
|
||||
│ │ ├── app.ts # 应用状态
|
||||
│ │ └── index.ts # 导出
|
||||
│ ├── styles/ # 全局样式
|
||||
│ ├── types/ # TypeScript 类型定义
|
||||
│ ├── utils/ # 工具函数
|
||||
│ ├── views/ # 页面组件
|
||||
│ │ ├── home/ # 首页
|
||||
│ │ ├── login/ # 登录注册
|
||||
│ │ ├── video/ # 视频相关
|
||||
│ │ ├── user/ # 用户相关
|
||||
│ │ ├── upload/ # 上传
|
||||
│ │ ├── message/ # 消息
|
||||
│ │ ├── favorite/ # 收藏
|
||||
│ │ ├── search/ # 搜索
|
||||
│ │ ├── layout/ # 布局
|
||||
│ │ └── error/ # 错误页
|
||||
│ ├── App.vue # 根组件
|
||||
│ └── main.ts # 入口文件
|
||||
├── package.json
|
||||
├── vite.config.ts
|
||||
└── tsconfig.json
|
||||
```
|
||||
|
||||
### 管理端后台
|
||||
|
||||
```
|
||||
video-platform-admin/
|
||||
├── public/ # 静态资源
|
||||
├── src/
|
||||
│ ├── api/ # API 接口封装
|
||||
│ │ ├── auth.ts # 管理员认证
|
||||
│ │ ├── user.ts # 用户管理
|
||||
│ │ ├── video.ts # 视频管理
|
||||
│ │ ├── category.ts # 分类管理
|
||||
│ │ ├── comment.ts # 评论管理
|
||||
│ │ ├── admin.ts # 管理员管理
|
||||
│ │ ├── statistics.ts # 统计数据
|
||||
│ │ └── index.ts # 导出
|
||||
│ ├── assets/ # 资源文件
|
||||
│ ├── components/ # 公共组件
|
||||
│ │ ├── Breadcrumb.vue # 面包屑
|
||||
│ │ └── TagsView.vue # 标签页导航
|
||||
│ ├── composables/ # 组合式函数
|
||||
│ ├── directives/ # 自定义指令
|
||||
│ ├── router/ # 路由配置
|
||||
│ ├── stores/ # Pinia 状态管理
|
||||
│ │ ├── user.ts # 管理员状态
|
||||
│ │ ├── app.ts # 应用状态
|
||||
│ │ ├── tagsView.ts # 标签页状态
|
||||
│ │ └── index.ts # 导出
|
||||
│ ├── styles/ # 全局样式
|
||||
│ │ ├── index.scss # 主样式
|
||||
│ │ └── variables.scss # 变量定义
|
||||
│ ├── types/ # TypeScript 类型定义
|
||||
│ ├── utils/ # 工具函数
|
||||
│ │ ├── request.ts # HTTP 请求封装
|
||||
│ │ └── format.ts # 格式化工具
|
||||
│ ├── views/ # 页面组件
|
||||
│ │ ├── dashboard/ # 仪表盘
|
||||
│ │ ├── login/ # 登录
|
||||
│ │ ├── user/ # 用户管理
|
||||
│ │ ├── video/ # 视频管理
|
||||
│ │ ├── content/ # 内容管理
|
||||
│ │ ├── system/ # 系统管理
|
||||
│ │ ├── layout/ # 布局
|
||||
│ │ └── error/ # 错误页
|
||||
│ ├── App.vue # 根组件
|
||||
│ └── main.ts # 入口文件
|
||||
├── package.json
|
||||
├── vite.config.ts
|
||||
└── tsconfig.json
|
||||
```
|
||||
|
||||
## 功能模块
|
||||
|
||||
### 用户端前台功能
|
||||
|
||||
#### 认证模块
|
||||
- 用户名/邮箱/手机号登录
|
||||
- 用户注册
|
||||
- 验证码验证
|
||||
- JWT Token 自动刷新
|
||||
- 登出功能
|
||||
|
||||
#### 首页模块
|
||||
- 视频推荐流
|
||||
- 热门视频榜单
|
||||
- 分类导航
|
||||
- 搜索功能
|
||||
|
||||
#### 视频模块
|
||||
- 视频播放(支持倍速、全屏、画中画)
|
||||
- 弹幕系统(发送、显示、样式设置)
|
||||
- 视频点赞/投币/收藏/分享
|
||||
- 相关视频推荐
|
||||
- 视频上传(拖拽上传、进度显示)
|
||||
- 我的视频管理
|
||||
|
||||
#### 评论模块
|
||||
- 评论列表(分页、排序)
|
||||
- 发表评论
|
||||
- 回复评论
|
||||
- 评论点赞
|
||||
|
||||
#### 用户模块
|
||||
- 个人中心
|
||||
- 个人主页
|
||||
- 编辑资料
|
||||
- 账号设置
|
||||
|
||||
#### 社交模块
|
||||
- 关注用户
|
||||
- 粉丝/关注列表
|
||||
- 私信功能
|
||||
- 消息通知
|
||||
|
||||
### 管理端后台功能
|
||||
|
||||
#### 认证模块
|
||||
- 管理员登录
|
||||
- 验证码验证
|
||||
- 登出功能
|
||||
|
||||
#### 仪表盘
|
||||
- 平台数据概览
|
||||
- 数据趋势图表
|
||||
- 待审核内容提醒
|
||||
|
||||
#### 用户管理
|
||||
- 用户列表(分页、搜索、筛选)
|
||||
- 用户详情
|
||||
- 禁用/启用用户
|
||||
- 重置密码
|
||||
|
||||
#### 视频管理
|
||||
- 视频列表
|
||||
- 视频审核
|
||||
- 视频下架
|
||||
|
||||
#### 内容管理
|
||||
- 分类管理
|
||||
- 标签管理
|
||||
- 评论管理
|
||||
|
||||
#### 系统管理
|
||||
- 管理员管理
|
||||
|
||||
## API 接口
|
||||
|
||||
### 请求配置
|
||||
|
||||
所有 API 请求通过统一的 `request` 工具进行封装:
|
||||
|
||||
```typescript
|
||||
// 基础配置
|
||||
baseURL: '/api' // 用户端
|
||||
baseURL: '/api/admin' // 管理端
|
||||
timeout: 30000
|
||||
|
||||
// 请求拦截器
|
||||
- 自动添加 Authorization Header
|
||||
- 显示加载进度
|
||||
|
||||
// 响应拦截器
|
||||
- 统一错误处理
|
||||
- Token 过期自动跳转登录
|
||||
```
|
||||
|
||||
### 用户端主要接口
|
||||
|
||||
| 模块 | 接口 | 说明 |
|
||||
|------|------|------|
|
||||
| 认证 | POST /auth/login | 登录 |
|
||||
| 认证 | POST /auth/register | 注册 |
|
||||
| 认证 | GET /auth/captcha | 获取验证码 |
|
||||
| 用户 | GET /user/profile/current | 获取当前用户资料 |
|
||||
| 用户 | PUT /user/profile | 更新用户资料 |
|
||||
| 用户 | POST /user/follow/{id} | 关注用户 |
|
||||
| 视频 | GET /content/video/public/list | 获取视频列表 |
|
||||
| 视频 | GET /content/video/public/{id} | 获取视频详情 |
|
||||
| 视频 | POST /content/video/upload | 上传视频 |
|
||||
| 评论 | GET /comment/public/list | 获取评论列表 |
|
||||
| 评论 | POST /comment | 发表评论 |
|
||||
| 弹幕 | GET /content/danmaku/all/{videoId} | 获取弹幕 |
|
||||
| 弹幕 | POST /content/danmaku | 发送弹幕 |
|
||||
| 推荐 | GET /recommend/home | 首页推荐 |
|
||||
|
||||
### 管理端主要接口
|
||||
|
||||
| 模块 | 接口 | 说明 |
|
||||
|------|------|------|
|
||||
| 认证 | POST /admin/auth/login | 管理员登录 |
|
||||
| 用户 | GET /admin/platform/user/list | 用户列表 |
|
||||
| 用户 | PUT /admin/platform/user/{id}/status/{status} | 更新用户状态 |
|
||||
| 视频 | GET /admin/platform/content/video/list | 视频列表 |
|
||||
| 视频 | POST /admin/platform/content/video/review/{id} | 审核视频 |
|
||||
| 分类 | GET /admin/platform/content/category/list | 分类列表 |
|
||||
| 评论 | GET /comment/admin/list | 评论列表 |
|
||||
| 统计 | GET /statistics/dashboard | 仪表盘数据 |
|
||||
|
||||
## 开发指南
|
||||
|
||||
### 环境要求
|
||||
|
||||
- Node.js >= 18.0
|
||||
- pnpm >= 8.0 (推荐) 或 npm >= 9.0
|
||||
|
||||
### 安装依赖
|
||||
## 启动和构建
|
||||
|
||||
```bash
|
||||
# 用户端
|
||||
cd video-platform-web
|
||||
pnpm install
|
||||
cd frontend/video-frontend-web && npm install && npm run dev
|
||||
cd frontend/video-frontend-admin && npm install && npm run dev
|
||||
|
||||
# 管理端
|
||||
cd video-platform-admin
|
||||
pnpm install
|
||||
# 在各自目录执行
|
||||
npm run build
|
||||
npm run preview
|
||||
```
|
||||
|
||||
### 开发运行
|
||||
|
||||
```bash
|
||||
# 用户端 (端口 3000)
|
||||
cd video-platform-web
|
||||
pnpm dev
|
||||
|
||||
# 管理端 (端口 3100)
|
||||
cd video-platform-admin
|
||||
pnpm dev
|
||||
```
|
||||
|
||||
### 构建部署
|
||||
|
||||
```bash
|
||||
# 构建
|
||||
pnpm build
|
||||
|
||||
# 预览
|
||||
pnpm preview
|
||||
```
|
||||
|
||||
### 代理配置
|
||||
|
||||
在 `vite.config.ts` 中配置后端代理:
|
||||
|
||||
```typescript
|
||||
server: {
|
||||
port: 3000, // 或 3100
|
||||
proxy: {
|
||||
'/api': {
|
||||
target: 'http://localhost:9000', // 后端网关地址
|
||||
changeOrigin: true,
|
||||
rewrite: (path) => path.replace(/^\/api/, '')
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 代码规范
|
||||
|
||||
### 命名规范
|
||||
|
||||
- 文件夹:kebab-case(如 `video-player`)
|
||||
- Vue组件:PascalCase(如 `VideoPlayer.vue`)
|
||||
- TypeScript文件:camelCase(如 `videoService.ts`)
|
||||
- 常量:UPPER_SNAKE_CASE
|
||||
- CSS类名:kebab-case
|
||||
|
||||
### 组件规范
|
||||
|
||||
```vue
|
||||
<template>
|
||||
<!-- 模板内容 -->
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
// 1. 导入
|
||||
import { ref, computed, onMounted } from 'vue'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
// 2. Props 和 Emits
|
||||
const props = defineProps<{...}>()
|
||||
const emit = defineEmits<{...}>()
|
||||
|
||||
// 3. 响应式状态
|
||||
const loading = ref(false)
|
||||
|
||||
// 4. 计算属性
|
||||
const computed = computed(() => {})
|
||||
|
||||
// 5. 方法
|
||||
const handleClick = () => {}
|
||||
|
||||
// 6. 生命周期
|
||||
onMounted(() => {})
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
// 样式
|
||||
</style>
|
||||
```
|
||||
|
||||
### Git 提交规范
|
||||
|
||||
- `feat`: 新功能
|
||||
- `fix`: 修复bug
|
||||
- `docs`: 文档更新
|
||||
- `style`: 代码格式
|
||||
- `refactor`: 重构
|
||||
- `test`: 测试
|
||||
- `chore`: 构建/工具
|
||||
|
||||
## 部署说明
|
||||
|
||||
### Nginx 配置示例
|
||||
|
||||
```nginx
|
||||
# 用户端
|
||||
server {
|
||||
listen 80;
|
||||
server_name www.example.com;
|
||||
|
||||
root /var/www/video-platform-web;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass http://localhost:9000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
||||
|
||||
# 管理端
|
||||
server {
|
||||
listen 80;
|
||||
server_name admin.example.com;
|
||||
|
||||
root /var/www/video-platform-admin;
|
||||
index index.html;
|
||||
|
||||
location / {
|
||||
try_files $uri $uri/ /index.html;
|
||||
}
|
||||
|
||||
location /api {
|
||||
proxy_pass http://localhost:9000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 环境变量
|
||||
|
||||
创建 `.env.production` 文件:
|
||||
|
||||
```env
|
||||
VITE_API_BASE_URL=https://api.example.com
|
||||
VITE_APP_TITLE=HAOVP
|
||||
```
|
||||
|
||||
## 常见问题
|
||||
|
||||
### 1. 跨域问题
|
||||
|
||||
确保后端配置了 CORS,或在 Vite 代理中正确配置。
|
||||
|
||||
### 2. Token 过期
|
||||
|
||||
前端会自动检测 401 响应并跳转登录页。
|
||||
|
||||
### 3. 图片/视频上传失败
|
||||
|
||||
检查文件大小限制和 MinIO 配置。
|
||||
|
||||
## 更新日志
|
||||
|
||||
### v1.0.0 (2024-03)
|
||||
|
||||
- 初始版本发布
|
||||
- 用户端完整功能
|
||||
- 管理端完整功能
|
||||
用户端播放器是 Artplayer,不再使用早期文档中的 DPlayer。管理端仪表盘接口由 `src/api/statistics.ts` 聚合用户、视频、评论和趋势数据,接口路径以当前 `src/api` 文件为准。
|
||||
|
||||
+23
-113
@@ -1,129 +1,39 @@
|
||||
# Nacos 配置中心方案
|
||||
# Nacos 配置中心
|
||||
|
||||
## 一、配置架构
|
||||
所有后端服务通过 `src/main/resources/application.yml` 导入以下配置:
|
||||
|
||||
### 1.1 配置文件结构
|
||||
|
||||
```
|
||||
application.yml (本地,极简)
|
||||
├── Nacos: common.yaml (公共配置)
|
||||
├── Nacos: common-redis-${profile}.yaml (按环境的Redis配置)
|
||||
└── Nacos: ${spring.application.name}.yaml (服务专属配置)
|
||||
```text
|
||||
common.yaml
|
||||
common-redis-${spring.profiles.active}.yaml
|
||||
${spring.application.name}.yaml
|
||||
```
|
||||
|
||||
### 1.2 Data ID 设计
|
||||
其中 `${spring.application.name}` 为 `video-gateway`、`video-auth`、`video-user`、`video-content`、`video-comment`、`video-recommend` 或 `video-admin`。
|
||||
|
||||
| Data ID | 说明 |
|
||||
|---------|------|
|
||||
| common.yaml | 公共配置(MySQL连接池、MyBatis、Feign等) |
|
||||
| common-redis-dev.yaml | 开发环境Redis单机配置 |
|
||||
| common-redis-ha.yaml | 生产环境Redis Sentinel配置 |
|
||||
| video-gateway.yaml | Gateway服务专属配置 |
|
||||
| video-auth.yaml | Auth服务专属配置 |
|
||||
| video-user.yaml | User服务专属配置 |
|
||||
| video-content.yaml | Content服务专属配置 |
|
||||
| video-comment.yaml | Comment服务专属配置 |
|
||||
| video-recommend.yaml | Recommend服务专属配置 |
|
||||
| video-admin.yaml | Admin服务专属配置 |
|
||||
## 环境切换
|
||||
|
||||
## 二、使用方式
|
||||
- `SPRING_PROFILES_ACTIVE=dev`:连接开发环境 Redis 单机配置
|
||||
- `SPRING_PROFILES_ACTIVE=ha`:连接 Redis Sentinel 配置;节点列表通过 `REDIS_SENTINEL_NODES` 提供
|
||||
|
||||
### 2.1 初始化 Nacos 配置
|
||||
配置优先级为:环境变量 > Nacos > 本地 `application.yml`。导入使用 `refreshEnabled=true`,发布 Nacos 配置后服务可动态刷新支持刷新的配置项。
|
||||
|
||||
**方式一:执行 SQL 脚本**
|
||||
## 初始化
|
||||
|
||||
Docker Compose 会挂载 `backend/sql/nacos-schema.sql` 和 `backend/sql/nacos-config-init.sql`。已有 MySQL 数据卷不会重复执行初始化脚本;需要补配置时,应在确认备份后通过 Nacos 控制台或 SQL 文件导入。
|
||||
|
||||
```bash
|
||||
# 连接 Nacos 数据库
|
||||
mysql -u root -p nacos_config < sql/nacos-config-init.sql
|
||||
docker exec -i mysql mysql -uroot -p"$MYSQL_ROOT_PASSWORD" nacos_config < backend/sql/nacos-config-init.sql
|
||||
```
|
||||
|
||||
**方式二:通过 Nacos 控制台手动创建**
|
||||
命令中的密码必须来自当前部署环境变量,文档不提供默认生产密码。
|
||||
|
||||
1. 登录 Nacos 控制台:http://localhost:8848/nacos(默认账号:nacos/nacos)
|
||||
2. 进入「配置管理」->「配置列表」
|
||||
3. 点击「+」创建配置,Data ID 和内容参考 `sql/nacos-config-init.sql`
|
||||
## 认证与地址
|
||||
|
||||
### 2.2 环境切换
|
||||
Nacos 2.3.2 在 Compose 中启用认证。业务服务通过 `NACOS_HOST`、`NACOS_PORT`、`NACOS_USERNAME`、`NACOS_PASSWORD` 连接;跨主机部署还需设置 `NACOS_NAMESPACE`、`NACOS_GROUP` 和服务注册 IP 变量。不要把 Nacos、MySQL、Redis 管理端口直接暴露到公网。
|
||||
|
||||
通过 `SPRING_PROFILES_ACTIVE` 环境变量切换环境:
|
||||
## 排查顺序
|
||||
|
||||
**开发环境:**
|
||||
```yaml
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=dev
|
||||
```
|
||||
会加载 `common-redis-dev.yaml`,使用单机 Redis。
|
||||
|
||||
**生产/高可用环境:**
|
||||
```yaml
|
||||
environment:
|
||||
- SPRING_PROFILES_ACTIVE=ha
|
||||
- REDIS_SENTINEL_NODES=192.168.1.101:26379,192.168.1.102:26379,192.168.1.103:26379
|
||||
```
|
||||
会加载 `common-redis-ha.yaml`,使用 Sentinel 哨兵模式。
|
||||
|
||||
### 2.3 配置热更新
|
||||
|
||||
修改 Nacos 中的配置后,服务会自动感知并更新(`refreshEnabled=true`),无需重启!
|
||||
|
||||
## 三、配置优先级
|
||||
|
||||
```
|
||||
环境变量 > Nacos 配置 > 本地 application.yml
|
||||
```
|
||||
|
||||
## 四、本地开发
|
||||
|
||||
本地开发时,启动 Nacos 后:
|
||||
|
||||
1. 确保 Nacos 中已有配置
|
||||
2. 启动服务,默认使用 `dev` profile
|
||||
3. 自动连接开发环境的 Redis
|
||||
|
||||
## 五、生产部署
|
||||
|
||||
```bash
|
||||
# 1. 执行 SQL 初始化配置
|
||||
mysql -u root -p nacos_config < sql/nacos-config-init.sql
|
||||
|
||||
# 2. 构建镜像
|
||||
mvn clean package -DskipTests
|
||||
docker-compose -f docker-compose-node-01.yml build
|
||||
|
||||
# 3. 启动服务
|
||||
docker-compose -f docker-compose-node-01.yml up -d
|
||||
```
|
||||
|
||||
## 六、常见问题
|
||||
|
||||
### Q1: 配置没有生效?
|
||||
|
||||
检查以下几点:
|
||||
1. Nacos 是否正常运行
|
||||
2. 服务启动日志是否显示连接 Nacos 成功
|
||||
3. 配置的 Data ID 是否正确
|
||||
4. `spring.config.import` 是否正确配置
|
||||
|
||||
### Q2: 如何查看当前使用的配置?
|
||||
|
||||
```bash
|
||||
# 查看服务日志
|
||||
docker logs -f video-auth | grep -i nacos
|
||||
```
|
||||
|
||||
### Q3: 如何动态修改配置?
|
||||
|
||||
1. 登录 Nacos 控制台
|
||||
2. 找到对应配置
|
||||
3. 编辑并发布
|
||||
4. 服务自动感知更新
|
||||
|
||||
## 七、核心优势
|
||||
|
||||
| 优势 | 说明 |
|
||||
|------|------|
|
||||
| 配置集中管理 | 所有配置在 Nacos 统一管理 |
|
||||
| 环境隔离 | 通过 profile 区分环境 |
|
||||
| 热更新 | 修改配置无需重启 |
|
||||
| 无需重构镜像 | 改配置只需在 Nacos 操作 |
|
||||
| 代码精简 | 本地只留 Nacos 连接配置 |
|
||||
1. `docker compose ps` 确认 MySQL 和 Nacos 健康。
|
||||
2. 查看服务日志中是否出现 Nacos 认证和配置导入成功。
|
||||
3. 在 Nacos 控制台核对 Data ID、Group、Namespace。
|
||||
4. 检查 `common-redis-dev.yaml` 或 `common-redis-ha.yaml` 是否与 `SPRING_PROFILES_ACTIVE` 一致。
|
||||
|
||||
@@ -1,269 +1,23 @@
|
||||
# video-auth模块目录架构、功能及接口文档
|
||||
# video-auth 模块
|
||||
|
||||
## 一、目录架构
|
||||
认证服务端口为 `9001`。当前实现使用 Spring Security、JWT 和 Redis 管理用户认证状态;POM 同时引入 OAuth2 相关依赖,但当前前端认证流程以项目的登录、Access Token 和 Refresh Token 接口为准。
|
||||
|
||||
```
|
||||
video-auth/
|
||||
├── src/
|
||||
│ ├── main/
|
||||
│ │ ├── java/
|
||||
│ │ │ └── com/nuaa/video/auth/
|
||||
│ │ │ ├── config/ # 配置类
|
||||
| | | │ ├── RedisConfig.java # Redis配置
|
||||
│ │ │ │ └── SecurityConfig.java # 安全配置
|
||||
│ │ │ ├── controller/ # 控制器
|
||||
│ │ │ │ └── AuthController.java # 认证控制器
|
||||
│ │ │ ├── dto/ # 数据传输对象
|
||||
│ │ │ │ ├── LoginDTO.java # 登录请求DTO
|
||||
│ │ │ │ ├── RegisterDTO.java # 注册请求DTO
|
||||
│ │ │ │ └── TokenInfoDTO.java # 令牌信息DTO
|
||||
│ │ │ ├── entity/ # 实体类
|
||||
│ │ │ │ ├── AuthUser.java # 用户实体
|
||||
│ │ │ │ ├── AuthRole.java # 角色实体
|
||||
│ │ │ │ ├── AuthPermission.java # 权限实体
|
||||
│ │ │ │ ├── AuthUserRole.java # 用户角色关联实体
|
||||
│ │ │ │ └── AuthRolePermission.java # 角色权限关联实体
|
||||
│ │ │ ├── filter/ # 过滤器
|
||||
│ │ │ │ └── JwtAuthenticationFilter.java # JWT认证过滤器
|
||||
│ │ │ ├── mapper/ # MyBatis映射接口
|
||||
│ │ │ │ ├── AuthUserMapper.java # 用户Mapper
|
||||
│ │ │ │ ├── AuthRoleMapper.java # 角色Mapper
|
||||
│ │ │ │ ├── AuthPermissionMapper.java # 权限Mapper
|
||||
│ │ │ │ ├── AuthUserRoleMapper.java # 用户角色Mapper
|
||||
│ │ │ │ └── AuthRolePermissionMapper.java # 角色权限Mapper
|
||||
│ │ │ ├── service/ # 服务层
|
||||
│ │ │ │ ├── AuthUserService.java # 用户服务接口
|
||||
│ │ │ │ ├── CaptchaService.java # 验证码服务接口
|
||||
│ │ │ │ └── impl/ # 实现类
|
||||
│ │ │ │ ├── AuthUserServiceImpl.java
|
||||
│ │ │ │ └── CaptchaServiceImpl.java
|
||||
│ │ │ ├── utils/ # 工具类
|
||||
│ │ │ │ ├── RedisUtils.java # Redis工具类
|
||||
│ │ │ │ └── JwtUtils.java # JWT工具类
|
||||
│ │ │ └── AuthApplication.java # 启动类
|
||||
│ │ └── resources/
|
||||
│ │ ├── mapper/ # MyBatis XML映射文件
|
||||
│ │ │ └── AuthUserMapper.xml
|
||||
│ │ ├── application.yml # 配置文件
|
||||
│ │ ├── application-dev.yml # 开发环境配置
|
||||
└── pom.xml
|
||||
```
|
||||
## 当前功能
|
||||
|
||||
## 二、功能概述
|
||||
- 用户注册、登录、验证码、退出登录、获取当前用户与用户名查询
|
||||
- Access Token 与 Refresh Token 签发/刷新,Redis 保存并清理令牌索引
|
||||
- 管理用途的登录统计、账户锁定/解锁与密码重置
|
||||
- 通过 Feign 与用户服务协作完成注册后的资料初始化等流程
|
||||
|
||||
### 1. 核心功能
|
||||
## 路由前缀
|
||||
|
||||
- **用户认证**:登录、注册、令牌刷新、登出
|
||||
- **安全管理**:JWT生成与验证、密码加密
|
||||
- **角色权限**:用户角色和权限的管理
|
||||
- **验证码服务**:生成和验证图形验证码
|
||||
| Controller | 前缀 | 用途 |
|
||||
| --- | --- | --- |
|
||||
| `AuthController` | `/auth` | 用户认证与令牌操作 |
|
||||
| `AdminAuthController` | `/auth/admin` | 认证侧管理操作 |
|
||||
|
||||
### 2. 业务流程
|
||||
完整请求方法和参数以两个 Controller 的 Spring MVC 注解及对应 DTO 为准。所有业务请求应经由网关 `9000` 访问,不要在前端直连 `9001`。
|
||||
|
||||
1. **用户注册**:用户提交注册信息 → 验证码验证 → 创建用户 → 分配默认角色
|
||||
2. **用户登录**:用户提交登录信息 → 验证用户凭证 → 生成JWT令牌 → 缓存用户认证信息
|
||||
3. **认证鉴权**:请求携带JWT令牌 → JWT过滤器验证令牌 → 提取用户信息 → 设置安全上下文 → 授权访问
|
||||
## 配置
|
||||
|
||||
## 三、接口文档
|
||||
|
||||
### 1. 用户登录
|
||||
|
||||
- **URI**: `/auth/login`
|
||||
- **方法**: POST
|
||||
- **描述**: 用户登录并获取令牌
|
||||
- **请求Body**:
|
||||
```json
|
||||
{
|
||||
"username": "admin",
|
||||
"password": "admin123",
|
||||
"captcha": "1a2b",
|
||||
"captchaKey": "abcd1234"
|
||||
}
|
||||
```
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"accessToken": "eyJhbGciOiJIUzI1NiJ9...",
|
||||
"refreshToken": "nQs6NGPzAJbfw5ddsSVGY2iqAomOmGW9",
|
||||
"tokenType": "Bearer",
|
||||
"expiresIn": 86400,
|
||||
"userId": 1,
|
||||
"username": "admin"
|
||||
}
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `400`: 参数错误(如验证码错误)
|
||||
- `401`: 用户名或密码错误
|
||||
- `403`: 账号已被禁用
|
||||
|
||||
### 2. 用户注册
|
||||
|
||||
- **URI**: `/auth/register`
|
||||
- **方法**: POST
|
||||
- **描述**: 注册新用户
|
||||
- **请求Body**:
|
||||
```json
|
||||
{
|
||||
"username": "newuser",
|
||||
"password": "password123",
|
||||
"confirmPassword": "password123",
|
||||
"email": "user@example.com",
|
||||
"phone": "13800138000",
|
||||
"captcha": "1a2b",
|
||||
"captchaKey": "abcd1234"
|
||||
}
|
||||
```
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": "注册成功"
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `400`: 参数错误(如密码不匹配、验证码错误)
|
||||
- `1002`: 用户名已存在
|
||||
|
||||
### 3. 获取验证码
|
||||
|
||||
- **URI**: `/auth/captcha`
|
||||
- **方法**: GET
|
||||
- **描述**: 生成图形验证码
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"captchaKey": "abcd1234",
|
||||
"captchaImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEU..."
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 刷新令牌
|
||||
|
||||
- **URI**: `/auth/refresh`
|
||||
- **方法**: POST
|
||||
- **描述**: 使用刷新令牌获取新的访问令牌
|
||||
- **请求参数**:
|
||||
- `refreshToken`: 刷新令牌字符串
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"accessToken": "eyJhbGciOiJIUzI1NiJ9...",
|
||||
"refreshToken": "new_refresh_token",
|
||||
"tokenType": "Bearer",
|
||||
"expiresIn": 86400,
|
||||
"userId": 1,
|
||||
"username": "admin"
|
||||
}
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `401`: 刷新令牌无效或已过期
|
||||
|
||||
### 5. 用户登出
|
||||
|
||||
- **URI**: `/auth/logout`
|
||||
- **方法**: POST
|
||||
- **描述**: 用户登出,清除令牌
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
### 6. 获取当前用户信息
|
||||
|
||||
- **URI**: `/auth/current`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前登录用户的详细信息
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"username": "admin",
|
||||
"email": "admin@example.com",
|
||||
"phone": "13800138000",
|
||||
"status": 1,
|
||||
"lastLoginTime": "2024-03-30T12:30:45",
|
||||
"lastLoginIp": "192.168.1.1",
|
||||
"roles": ["USER_ADMIN"]
|
||||
}
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `401`: 未授权
|
||||
- `404`: 用户不存在
|
||||
|
||||
## 四、数据库设计
|
||||
|
||||
认证模块涉及的主要数据库表:
|
||||
|
||||
### 1. auth_user (用户表)
|
||||
- `id`: 用户ID (主键)
|
||||
- `username`: 用户名
|
||||
- `password`: 加密密码
|
||||
- `salt`: 加密盐值
|
||||
- `email`: 邮箱
|
||||
- `phone`: 手机号
|
||||
- `status`: 状态(0:禁用,1:正常)
|
||||
- `last_login_time`: 最后登录时间
|
||||
- `last_login_ip`: 最后登录IP
|
||||
|
||||
### 2. auth_role (角色表)
|
||||
- `id`: 角色ID (主键)
|
||||
- `name`: 角色名称
|
||||
- `code`: 角色编码
|
||||
- `description`: 角色描述
|
||||
|
||||
### 3. auth_permission (权限表)
|
||||
- `id`: 权限ID (主键)
|
||||
- `name`: 权限名称
|
||||
- `code`: 权限编码
|
||||
- `description`: 权限描述
|
||||
|
||||
### 4. auth_user_role (用户角色关联表)
|
||||
- `id`: 主键
|
||||
- `user_id`: 用户ID (外键)
|
||||
- `role_id`: 角色ID (外键)
|
||||
|
||||
### 5. auth_role_permission (角色权限关联表)
|
||||
- `id`: 主键
|
||||
- `role_id`: 角色ID (外键)
|
||||
- `permission_id`: 权限ID (外键)
|
||||
|
||||
## 五、认证流程说明
|
||||
|
||||
1. **JWT认证流程**:
|
||||
- 用户登录成功后,服务端生成JWT令牌和刷新令牌
|
||||
- 客户端请求时在请求头中携带JWT令牌
|
||||
- 服务端通过JwtAuthenticationFilter验证令牌
|
||||
- 验证通过后,设置SecurityContext并放行请求
|
||||
|
||||
2. **权限校验流程**:
|
||||
- 用户登录时加载其角色和权限
|
||||
- 将权限信息缓存到Redis中
|
||||
- 请求鉴权时从SecurityContext获取用户信息
|
||||
- 根据用户角色和权限决定是否允许访问
|
||||
|
||||
video-auth模块提供了完整的用户认证、授权和安全管理功能,为整个视频平台提供统一的身份验证服务。
|
||||
服务从 Nacos 加载公共、Redis 和 `video-auth.yaml` 配置。JWT 密钥、过期时间、Nacos 认证和数据库/Redis 凭据均从环境变量或 Nacos 注入,文档不保留任何真实或默认生产值。
|
||||
|
||||
+13
-30
@@ -1,34 +1,17 @@
|
||||
# video-common模块实现步骤和代码
|
||||
# video-common 模块
|
||||
|
||||
基于Spring Boot 3.2.4、Spring Cloud 2023.0.1和Spring Cloud Alibaba 2023.0.1.0技术栈,完整实现video-common模块。
|
||||
`video-common` 是后端共享库,不独立启动,也不提供 HTTP 接口。当前源代码位于 `backend/video-common/src/main/java/com/nuaa/video/common`。
|
||||
|
||||
## 目录结构设计
|
||||
## 当前职责
|
||||
|
||||
首先,创建以下目录结构:
|
||||
- `config`:Feign、MinIO、MyBatis-Plus、Redis、Web MVC 配置及自动填充处理器
|
||||
- `constants`:通用常量与安全常量
|
||||
- `exception`:`BusinessException` 和全局异常处理
|
||||
- `model`:统一返回体 `Result`、分页请求 `PageRequestDTO`、基础实体 `BaseEntity`、状态码枚举
|
||||
- `utils`:JWT、Redis、MinIO、分页、日期、字符串工具
|
||||
|
||||
```
|
||||
video-common/
|
||||
├── src/
|
||||
│ ├── main/
|
||||
│ │ ├── java/
|
||||
│ │ │ └── com/
|
||||
│ │ │ └── nuaa/
|
||||
│ │ │ └── video/
|
||||
│ │ │ └── common/
|
||||
│ │ │ ├── annotation/ # 自定义注解
|
||||
│ │ │ ├── config/ # 配置类
|
||||
│ │ │ ├── constants/ # 常量定义
|
||||
│ │ │ ├── exception/ # 异常处理
|
||||
│ │ │ ├── model/ # 通用数据模型
|
||||
│ │ │ │ ├── dto/ # 数据传输对象
|
||||
│ │ │ │ ├── entity/ # 实体类
|
||||
│ │ │ │ ├── enums/ # 枚举类
|
||||
│ │ │ │ └── vo/ # 视图对象
|
||||
│ │ │ ├── utils/ # 工具类
|
||||
│ │ │ └── feign/ # Feign接口
|
||||
│ │ └── resources/
|
||||
│ │ └── META-INF/
|
||||
│ │ └── spring.factories # 自动配置
|
||||
│ └── test/
|
||||
└── pom.xml
|
||||
```
|
||||
## 主要依赖
|
||||
|
||||
Spring Web、Validation、OpenFeign、Sentinel、MyBatis-Plus、MySQL Driver、Redis、MinIO、JJWT、Hutool 和 Lombok。自动配置入口仍为 `src/main/resources/META-INF/spring.factories`。
|
||||
|
||||
业务服务需依赖本模块,但不应在业务模块中复制统一响应、异常、JWT 或对象存储实现。
|
||||
|
||||
@@ -1,230 +1,22 @@
|
||||
# video-content模块目录架构、功能及接口文档
|
||||
# video-content 模块
|
||||
|
||||
## 一、目录架构
|
||||
内容服务端口为 `9003`,负责视频内容域,并依赖 MinIO、RocketMQ、Redis、MySQL、FFmpeg Java wrapper 与 Nacos。
|
||||
|
||||
```
|
||||
video-content/
|
||||
├── src/
|
||||
│ ├── main/
|
||||
│ │ ├── java/
|
||||
│ │ │ └── com/nuaa/video/content/
|
||||
│ │ │ ├── config/ # 配置类
|
||||
│ │ │ │ ├── SecurityConfig.java # 安全配置
|
||||
│ │ │ │ ├── MinioConfig.java # MinIO配置
|
||||
│ │ │ │ └── FFmpegConfig.java # FFmpeg配置
|
||||
│ │ │ ├── controller/ # 控制器
|
||||
│ │ │ │ ├── VideoController.java # 视频控制器
|
||||
│ │ │ │ ├── CategoryController.java # 分类控制器
|
||||
│ │ │ │ ├── TagController.java # 标签控制器
|
||||
│ │ │ │ ├── DanmakuController.java # 弹幕控制器
|
||||
│ │ │ │ ├── FavoriteController.java # 收藏夹控制器
|
||||
│ │ │ │ └── VideoStatController.java # 视频统计控制器
|
||||
│ │ │ ├── entity/ # 实体类
|
||||
│ │ │ │ ├── ContentVideo.java # 视频信息实体
|
||||
│ │ │ │ ├── ContentCategory.java # 视频分类实体
|
||||
│ │ │ │ ├── ContentTag.java # 视频标签实体
|
||||
│ │ │ │ ├── ContentVideoTag.java # 视频标签关联实体
|
||||
│ │ │ │ ├── ContentDanmaku.java # 弹幕实体
|
||||
│ │ │ │ ├── ContentVideoLike.java # 视频点赞实体
|
||||
│ │ │ │ ├── ContentVideoCoin.java # 视频投币实体
|
||||
│ │ │ │ ├── ContentUserFavorite.java # 用户收藏夹实体
|
||||
│ │ │ │ ├── ContentVideoFavorite.java # 视频收藏实体
|
||||
│ │ │ │ ├── ContentVideoStatDaily.java # 视频每日统计实体
|
||||
│ │ │ │ ├── ContentVideoReview.java # 视频审核记录实体
|
||||
│ │ │ │ └── ContentVideoPlayRecord.java # 视频播放记录实体
|
||||
│ │ │ ├── mapper/ # Mapper接口
|
||||
│ │ │ │ ├── ContentVideoMapper.java
|
||||
│ │ │ │ ├── ContentCategoryMapper.java
|
||||
│ │ │ │ ├── ContentTagMapper.java
|
||||
│ │ │ │ ├── ContentVideoTagMapper.java
|
||||
│ │ │ │ ├── ContentDanmakuMapper.java
|
||||
│ │ │ │ ├── ContentVideoLikeMapper.java
|
||||
│ │ │ │ ├── ContentVideoCoinMapper.java
|
||||
│ │ │ │ ├── ContentUserFavoriteMapper.java
|
||||
│ │ │ │ ├── ContentVideoFavoriteMapper.java
|
||||
│ │ │ │ ├── ContentVideoStatDailyMapper.java
|
||||
│ │ │ │ ├── ContentVideoReviewMapper.java
|
||||
│ │ │ │ └── ContentVideoPlayRecordMapper.java
|
||||
│ │ │ ├── dto/ # DTO对象
|
||||
│ │ │ │ ├── VideoUploadDTO.java # 视频上传DTO
|
||||
│ │ │ │ ├── VideoUpdateDTO.java # 视频更新DTO
|
||||
│ │ │ │ ├── VideoQueryDTO.java # 视频查询DTO
|
||||
│ │ │ │ ├── FavoriteDTO.java # 收藏DTO
|
||||
│ │ │ │ ├── DanmakuDTO.java # 弹幕DTO
|
||||
│ │ │ │ └── PlayRecordDTO.java # 播放记录DTO
|
||||
│ │ │ ├── vo/ # VO对象
|
||||
│ │ │ │ ├── VideoInfoVO.java # 视频详情VO
|
||||
│ │ │ │ ├── VideoListVO.java # 视频列表VO
|
||||
│ │ │ │ ├── CategoryVO.java # 分类VO
|
||||
│ │ │ │ ├── TagVO.java # 标签VO
|
||||
│ │ │ │ ├── DanmakuVO.java # 弹幕VO
|
||||
│ │ │ │ ├── FavoriteVO.java # 收藏夹VO
|
||||
│ │ │ │ └── UploadResultVO.java # 上传结果VO
|
||||
│ │ │ ├── service/ # 服务层
|
||||
│ │ │ │ ├── VideoService.java # 视频服务接口
|
||||
│ │ │ │ ├── CategoryService.java # 分类服务接口
|
||||
│ │ │ │ ├── TagService.java # 标签服务接口
|
||||
│ │ │ │ ├── DanmakuService.java # 弹幕服务接口
|
||||
│ │ │ │ ├── FavoriteService.java # 收藏夹服务接口
|
||||
│ │ │ │ ├── VideoStatService.java # 视频统计服务接口
|
||||
│ │ │ │ └── impl/ # 实现类
|
||||
│ │ │ │ ├── VideoServiceImpl.java
|
||||
│ │ │ │ ├── CategoryServiceImpl.java
|
||||
│ │ │ │ ├── TagServiceImpl.java
|
||||
│ │ │ │ ├── DanmakuServiceImpl.java
|
||||
│ │ │ │ ├── FavoriteServiceImpl.java
|
||||
│ │ │ │ └── VideoStatServiceImpl.java
|
||||
│ │ │ ├── utils/ # 工具类
|
||||
│ │ │ │ └── VideoProcessor.java # 视频处理工具类
|
||||
│ │ │ ├── feign/ # Feign客户端
|
||||
│ │ │ │ ├── UserFeignClient.java # 用户服务客户端
|
||||
│ │ │ │ └── UserFeignClientFallbackFactory.java # 降级工厂
|
||||
│ │ │ ├── mq/ # 消息队列
|
||||
│ │ │ │ ├── producer/ # 生产者
|
||||
│ │ │ │ │ └── VideoMessageProducer.java
|
||||
│ │ │ │ └── consumer/ # 消费者
|
||||
│ │ │ │ └── VideoMessageConsumer.java
|
||||
│ │ │ ├── filter/ # 过滤器
|
||||
│ │ │ │ └── JwtAuthenticationFilter.java # JWT认证过滤器
|
||||
│ │ │ ├── task/ # 定时任务
|
||||
│ │ │ │ └── VideoStatsSyncTask.java # 视频统计同步任务
|
||||
│ │ │ ├── enums/ # 枚举类
|
||||
│ │ │ │ ├── VideoStatusEnum.java # 视频状态枚举
|
||||
│ │ │ │ └── DanmakuPositionEnum.java # 弹幕位置枚举
|
||||
│ │ │ └── ContentApplication.java # 启动类
|
||||
│ │ └── resources/
|
||||
│ │ ├── mapper/ # MyBatis XML映射文件
|
||||
│ │ │ ├── ContentVideoMapper.xml
|
||||
│ │ │ ├── ContentTagMapper.xml
|
||||
│ │ │ ├── ContentVideoTagMapper.xml
|
||||
│ │ │ ├── ContentDanmakuMapper.xml
|
||||
│ │ │ ├── ContentVideoLikeMapper.xml
|
||||
│ │ │ ├── ContentVideoCoinMapper.xml
|
||||
│ │ │ ├── ContentUserFavoriteMapper.xml
|
||||
│ │ │ ├── ContentVideoFavoriteMapper.xml
|
||||
│ │ │ ├── ContentVideoStatDailyMapper.xml
|
||||
│ │ │ ├── ContentVideoReviewMapper.xml
|
||||
│ │ │ └── ContentVideoPlayRecordMapper.xml
|
||||
│ │ ├── application.yml # 主配置文件
|
||||
│ │ └── application-dev.yml # 开发环境配置
|
||||
└── pom.xml # 项目依赖配置
|
||||
```
|
||||
## 当前功能与 Controller
|
||||
|
||||
## 二、核心功能概述
|
||||
| Controller | 前缀 | 功能 |
|
||||
| --- | --- | --- |
|
||||
| `VideoController` | `/content/video` | 上传、发布、详情/列表、编辑删除、点赞、投币、收藏、分享、播放、历史、用户视频与审核 |
|
||||
| `CategoryController` | `/content/category` | 分类树和分类维护 |
|
||||
| `TagController` | `/content/tag` | 标签分页与维护、视频标签查询 |
|
||||
| `FavoriteController` | `/content/favorite` | 收藏夹及收藏夹视频 |
|
||||
| `DanmakuController` | `/content/danmaku` | 弹幕发送、全量和时间段查询 |
|
||||
| `VideoStatController` | `/content/stat` | 每日、播放趋势和互动统计 |
|
||||
| `AdminVideoController` | `/content/video/admin` | 管理端视频查询、审核、下架、统计 |
|
||||
| `AdminCategoryController` | `/content/category/admin` | 管理端分类维护 |
|
||||
|
||||
### 1. 视频管理
|
||||
- 视频上传与处理:上传视频文件,自动提取封面,处理视频元数据
|
||||
- 视频CRUD:创建、更新、删除、查询视频
|
||||
- 视频搜索与过滤:按分类、标签、关键词搜索视频
|
||||
## 注意事项
|
||||
|
||||
### 2. 分类与标签管理
|
||||
- 分类树管理:支持多级分类结构
|
||||
- 标签管理:创建、更新、删除标签
|
||||
- 视频关联:将视频关联到分类和标签
|
||||
|
||||
### 3. 用户互动
|
||||
- 点赞功能:用户可点赞/取消点赞视频
|
||||
- 投币功能:用户可给视频投币
|
||||
- 收藏功能:用户可将视频收藏到不同收藏夹
|
||||
- 分享功能:记录视频分享行为
|
||||
|
||||
### 4. 弹幕系统
|
||||
- 发送弹幕:用户可在视频不同时间点发送弹幕
|
||||
- 查询弹幕:获取视频指定时间段或全部弹幕
|
||||
|
||||
### 5. 数据统计
|
||||
- 浏览数统计:记录视频播放次数和播放时长
|
||||
- 互动数据统计:包括点赞、投币、收藏、评论、分享等统计
|
||||
- 每日数据统计:记录视频每日增长数据
|
||||
|
||||
### 6. 视频审核
|
||||
- 自动审核:通过消息队列的审核流程
|
||||
- 人工审核:支持管理员手动审核视频
|
||||
|
||||
### 7. 收藏夹管理
|
||||
- 收藏夹CRUD:创建、更新、删除收藏夹
|
||||
- 收藏视频:将视频收藏到指定收藏夹
|
||||
- 浏览收藏:查看收藏夹中的视频
|
||||
|
||||
## 三、主要接口说明
|
||||
|
||||
### 1. 视频相关接口
|
||||
|
||||
| 接口路径 | 方法 | 功能描述 | 权限要求 |
|
||||
| ----------------------------------- | ------ | ---------------- | ---------- |
|
||||
| `/content/video/upload` | POST | 上传视频文件 | 登录用户 |
|
||||
| `/content/video` | POST | 创建视频记录 | 登录用户 |
|
||||
| `/content/video/{id}` | GET | 获取视频详情 | 公开 |
|
||||
| `/content/video/list` | GET | 分页查询视频列表 | 公开 |
|
||||
| `/content/video` | PUT | 更新视频信息 | 视频所有者 |
|
||||
| `/content/video/{id}` | DELETE | 删除视频 | 视频所有者 |
|
||||
| `/content/video/like/{videoId}` | POST | 点赞视频 | 登录用户 |
|
||||
| `/content/video/like/{videoId}` | DELETE | 取消点赞 | 登录用户 |
|
||||
| `/content/video/coin/{videoId}` | POST | 投币 | 登录用户 |
|
||||
| `/content/video/favorite` | POST | 收藏视频 | 登录用户 |
|
||||
| `/content/video/favorite/{videoId}` | DELETE | 取消收藏 | 登录用户 |
|
||||
| `/content/video/share/{videoId}` | POST | 分享视频 | 登录用户 |
|
||||
| `/content/video/play` | POST | 记录播放 | 登录用户 |
|
||||
| `/content/video/user/{userId}` | GET | 获取用户视频列表 | 公开 |
|
||||
| `/content/video/review/{videoId}` | POST | 审核视频 | 管理员 |
|
||||
|
||||
### 2. 分类与标签接口
|
||||
|
||||
| 接口路径 | 方法 | 功能描述 | 权限要求 |
|
||||
| ------------------------------ | ------ | ------------ | -------- |
|
||||
| `/content/category/tree` | GET | 获取分类树 | 公开 |
|
||||
| `/content/category/list` | GET | 获取分类列表 | 公开 |
|
||||
| `/content/category` | POST | 添加分类 | 管理员 |
|
||||
| `/content/category` | PUT | 更新分类 | 管理员 |
|
||||
| `/content/category/{id}` | DELETE | 删除分类 | 管理员 |
|
||||
| `/content/tag/list` | GET | 获取标签列表 | 公开 |
|
||||
| `/content/tag/page` | GET | 分页获取标签 | 公开 |
|
||||
| `/content/tag` | POST | 添加标签 | 管理员 |
|
||||
| `/content/tag` | PUT | 更新标签 | 管理员 |
|
||||
| `/content/tag/{id}` | DELETE | 删除标签 | 管理员 |
|
||||
| `/content/tag/video/{videoId}` | GET | 获取视频标签 | 公开 |
|
||||
|
||||
### 3. 弹幕接口
|
||||
|
||||
| 接口路径 | 方法 | 功能描述 | 权限要求 |
|
||||
| -------------------------------- | ---- | ------------------ | -------- |
|
||||
| `/content/danmaku` | POST | 发送弹幕 | 登录用户 |
|
||||
| `/content/danmaku/time` | GET | 获取指定时间段弹幕 | 公开 |
|
||||
| `/content/danmaku/all/{videoId}` | GET | 获取视频所有弹幕 | 公开 |
|
||||
|
||||
### 4. 收藏夹接口
|
||||
|
||||
| 接口路径 | 方法 | 功能描述 | 权限要求 |
|
||||
| --------------------------------------- | ------ | ------------------ | ---------------- |
|
||||
| `/content/favorite/list` | GET | 获取用户收藏夹列表 | 登录用户 |
|
||||
| `/content/favorite` | POST | 创建收藏夹 | 登录用户 |
|
||||
| `/content/favorite` | PUT | 更新收藏夹 | 收藏夹所有者 |
|
||||
| `/content/favorite/{id}` | DELETE | 删除收藏夹 | 收藏夹所有者 |
|
||||
| `/content/favorite/{favoriteId}/videos` | GET | 获取收藏夹视频 | 根据收藏夹可见性 |
|
||||
|
||||
### 5. 统计接口
|
||||
|
||||
| 接口路径 | 方法 | 功能描述 | 权限要求 |
|
||||
| ------------------------------------- | ---- | ---------------- | ----------------- |
|
||||
| `/content/stat/daily/{videoId}` | GET | 获取视频每日统计 | 视频所有者/管理员 |
|
||||
| `/content/stat/play/trend/{videoId}` | GET | 获取视频播放趋势 | 视频所有者/管理员 |
|
||||
| `/content/stat/interaction/{videoId}` | GET | 获取视频互动统计 | 视频所有者/管理员 |
|
||||
|
||||
## 四、与其他模块的关联
|
||||
|
||||
1. **与User模块的关联**
|
||||
- 通过`UserFeignClient`调用用户服务获取用户信息
|
||||
- 更新用户统计数据(视频数、获赞数、收藏数等)
|
||||
- 用户操作视频内容(播放、点赞、收藏等)
|
||||
|
||||
2. **与Comment模块的潜在关联**
|
||||
- 视频评论数的统计关联
|
||||
- 评论系统会引用视频信息
|
||||
|
||||
3. **与Gateway模块的关联**
|
||||
- 路由与权限控制
|
||||
- API请求分发
|
||||
|
||||
4. **与Auth模块的关联**
|
||||
- 用户认证与鉴权
|
||||
- JWT令牌解析和使用
|
||||
- 媒体文件保存到 MinIO,访问路径由网关/前端 Nginx 的媒体代理规则处理。
|
||||
- RocketMQ 和 FFmpeg 是当前内容服务的 Maven 依赖;具体异步消息主题、上传限制与转码行为应以 `video-content.yaml`、`application-prod.yml` 及实现类为准。
|
||||
- 当前接口清单见 `HAOVP接口列表.md`;以 Controller 注解为最终准则。
|
||||
|
||||
+19
-32
@@ -1,38 +1,25 @@
|
||||
# video-gateway模块实现步骤和代码
|
||||
# video-gateway 模块
|
||||
|
||||
API网关模块(video-gateway)实现,这是微服务架构中的入口点,负责请求路由、限流、鉴权等功能。
|
||||
网关服务端口为 `9000`,是所有前端请求的统一入口。路由、公开路径与部分运行参数在 Nacos 的 `video-gateway.yaml` 中维护。
|
||||
|
||||
## 目录结构设计
|
||||
## 当前代码结构
|
||||
|
||||
为video-gateway模块创建以下目录结构:
|
||||
|
||||
```
|
||||
video-gateway/
|
||||
├── src/
|
||||
│ ├── main/
|
||||
│ │ ├── java/
|
||||
│ │ │ └── com/
|
||||
│ │ │ └── nuaa/
|
||||
│ │ │ └── video/
|
||||
│ │ │ └── gateway/
|
||||
│ │ │ ├── config/ # 配置类
|
||||
│ │ │ ├── filter/ # 过滤器
|
||||
│ │ │ ├── handler/ # 处理器
|
||||
│ │ │ └── GatewayApplication.java # 启动类
|
||||
│ │ └── resources/
|
||||
│ │ ├── application.yml # 主配置文件
|
||||
│ │ └── application-dev.yml # 开发环境配置
|
||||
└── pom.xml
|
||||
```text
|
||||
config/
|
||||
CorsConfig.java # CORS
|
||||
DynamicRouteConfig.java # Nacos 动态路由
|
||||
GatewayFallbackConfig.java # Sentinel / 网关降级响应
|
||||
LoadBalancerConfig.java # 负载均衡配置
|
||||
filter/
|
||||
AuthGlobalFilter.java # JWT 与白名单校验
|
||||
RequestLogFilter.java # 请求日志
|
||||
handler/
|
||||
GlobalExceptionHandler.java # WebFlux 异常响应
|
||||
```
|
||||
|
||||
gateway模块具备以下功能:
|
||||
## 行为说明
|
||||
|
||||
1. 基于Spring Cloud Gateway的路由功能
|
||||
2. JWT认证鉴权
|
||||
3. 基于Sentinel的流量控制和服务熔断
|
||||
4. CORS跨域支持
|
||||
5. 请求日志记录
|
||||
6. 全局异常处理
|
||||
7. 动态路由配置
|
||||
|
||||
这个网关将作为整个微服务架构的入口点,为各个微服务提供统一的API访问层。
|
||||
- 通过 Nacos 服务发现将请求路由到认证、用户、内容、评论、推荐和管理服务。
|
||||
- `AuthGlobalFilter` 对非白名单路由校验 Bearer JWT;白名单以 `GATEWAY_IGNORE_URLS` / Nacos 配置为准。
|
||||
- 使用 Spring Cloud Gateway、Sentinel Gateway、Redis Reactive 和 Actuator;内存上传阈值由 `GATEWAY_MAX_IN_MEMORY_SIZE` 与 `GATEWAY_MULTIPART_MAX_IN_MEMORY_SIZE` 配置。
|
||||
- 网关不是业务接口的最终实现位置;接口权威定义在各业务服务 Controller。
|
||||
|
||||
@@ -1,751 +1,20 @@
|
||||
# video-user模块目录架构、功能及接口文档
|
||||
# video-user 模块
|
||||
|
||||
## 一、目录架构
|
||||
用户服务端口为 `9002`,负责平台用户域,不负责登录凭据签发。
|
||||
|
||||
```
|
||||
video-user/
|
||||
├── src/
|
||||
│ ├── main/
|
||||
│ │ ├── java/
|
||||
│ │ │ └── com/nuaa/video/user/
|
||||
│ │ │ ├── config/ # 配置类
|
||||
│ │ │ │ ├── FeignConfig.java # Feign配置类
|
||||
│ │ │ │ ├── MinioConfig.java # Minio配置类
|
||||
│ │ │ │ └── SecurityConfig.java # 安全配置类
|
||||
│ │ │ ├── controller/ # 控制器
|
||||
│ │ │ │ ├── UserProfileController.java # 用户资料控制器
|
||||
│ │ │ │ ├── UserFollowController.java # 用户关注控制器
|
||||
│ │ │ │ ├── UserMessageController.java # 用户私信控制器
|
||||
│ │ │ │ ├── UserNotificationController.java # 用户通知控制器
|
||||
│ │ │ │ └── UserSettingController.java # 用户设置控制器
|
||||
│ │ │ ├── dto/ # 数据传输对象
|
||||
│ │ │ │ ├── UserProfileDTO.java # 用户资料DTO
|
||||
│ │ │ │ ├── UserMessageDTO.java # 用户私信DTO
|
||||
│ │ │ │ └── UserSettingDTO.java # 用户设置DTO
|
||||
│ │ │ ├── entity/ # 实体类
|
||||
│ │ │ │ ├── UserInfo.java # 用户信息实体
|
||||
│ │ │ │ ├── UserFollow.java # 用户关注实体
|
||||
│ │ │ │ ├── UserStatDaily.java # 用户每日统计实体
|
||||
│ │ │ │ ├── UserMessage.java # 用户私信实体
|
||||
│ │ │ │ ├── UserNotification.java # 用户通知实体
|
||||
│ │ │ │ └── UserSetting.java # 用户设置实体
|
||||
│ │ │ ├── feign/ # Feign客户端
|
||||
│ │ │ │ └── AuthFeignClient.java # 认证服务Feign客户端
|
||||
│ │ │ ├── filter/ # 过滤器
|
||||
│ │ │ │ └── JwtAuthenticationFilter.java # JWT认证过滤器
|
||||
│ │ │ ├── mapper/ # MyBatis映射接口
|
||||
│ │ │ │ ├── UserInfoMapper.java # 用户信息Mapper
|
||||
│ │ │ │ ├── UserFollowMapper.java # 用户关注Mapper
|
||||
│ │ │ │ ├── UserStatDailyMapper.java # 用户每日统计Mapper
|
||||
│ │ │ │ ├── UserMessageMapper.java # 用户私信Mapper
|
||||
│ │ │ │ ├── UserNotificationMapper.java # 用户通知Mapper
|
||||
│ │ │ │ └── UserSettingMapper.java # 用户设置Mapper
|
||||
│ │ │ ├── service/ # 服务层
|
||||
│ │ │ │ ├── UserInfoService.java # 用户信息服务接口
|
||||
│ │ │ │ ├── UserFollowService.java # 用户关注服务接口
|
||||
│ │ │ │ ├── UserMessageService.java # 用户私信服务接口
|
||||
│ │ │ │ ├── UserNotificationService.java # 用户通知服务接口
|
||||
│ │ │ │ ├── UserSettingService.java # 用户设置服务接口
|
||||
│ │ │ │ └── impl/ # 实现类
|
||||
│ │ │ │ ├── UserInfoServiceImpl.java
|
||||
│ │ │ │ ├── UserFollowServiceImpl.java
|
||||
│ │ │ │ ├── UserMessageServiceImpl.java
|
||||
│ │ │ │ ├── UserNotificationServiceImpl.java
|
||||
│ │ │ │ └── UserSettingServiceImpl.java
|
||||
│ │ │ ├── vo/ # 视图对象
|
||||
│ │ │ │ ├── UserProfileVO.java # 用户资料VO
|
||||
│ │ │ │ ├── UserMessageVO.java # 用户私信VO
|
||||
│ │ │ │ └── UserNotificationVO.java # 用户通知VO
|
||||
│ │ │ └── UserApplication.java # 启动类
|
||||
│ │ └── resources/
|
||||
│ │ ├── mapper/ # MyBatis XML映射文件
|
||||
│ │ │ ├── UserInfoMapper.xml
|
||||
│ │ │ ├── UserFollowMapper.xml
|
||||
│ │ │ ├── UserMessageMapper.xml
|
||||
│ │ │ └── UserNotificationMapper.xml
|
||||
│ │ ├── application.yml # 主配置文件
|
||||
│ │ └── application-dev.yml # 开发环境配置
|
||||
└── pom.xml
|
||||
```
|
||||
## 当前功能与 Controller
|
||||
|
||||
## 二、功能概述
|
||||
| Controller | 前缀 | 功能 |
|
||||
| --- | --- | --- |
|
||||
| `UserProfileController` | `/user/profile` | 用户资料、头像上传、公开主页、用户搜索、计数维护 |
|
||||
| `UserFollowController` | `/user/follow` | 关注、取消关注、关注/粉丝列表与状态查询 |
|
||||
| `UserMessageController` | `/user/message` | 私信会话、明细、已读和未读数 |
|
||||
| `UserNotificationController` | `/user/notification` | 站内通知与已读状态 |
|
||||
| `UserSettingController` | `/user/setting` | 个人设置 |
|
||||
| `AdminUserController` | `/user/profile/admin` | 管理端用户查询、状态和统计 |
|
||||
|
||||
### 1. 核心功能
|
||||
## 实现要点
|
||||
|
||||
- **用户资料管理**:创建、查询、更新用户资料,上传头像
|
||||
- **用户关系管理**:关注/取消关注用户,查看关注列表和粉丝列表
|
||||
- **私信系统**:发送和接收私信,管理会话和消息状态
|
||||
- **通知系统**:管理用户收到的系统通知和用户互动通知
|
||||
- **用户设置**:管理用户隐私和通知偏好设置
|
||||
- **用户数据统计**:收集和查询用户活动统计信息
|
||||
|
||||
### 2. 业务流程
|
||||
|
||||
1. **用户资料流程**:
|
||||
- 用户注册时,auth服务创建基本认证信息
|
||||
- auth服务通过Feign调用user服务创建用户资料
|
||||
- 用户可随时更新个人资料信息
|
||||
|
||||
2. **用户关系流程**:
|
||||
- 用户关注他人,增加自己的关注数和对方的粉丝数
|
||||
- 系统为被关注用户创建通知
|
||||
- 用户可查看关注列表和粉丝列表
|
||||
|
||||
3. **私信流程**:
|
||||
- 用户发送私信给其他用户
|
||||
- 接收用户收到未读消息通知
|
||||
- 用户可查看会话列表和详细私信记录
|
||||
|
||||
4. **通知流程**:
|
||||
- 系统根据用户互动(点赞、评论、关注)创建通知
|
||||
- 用户可查看不同类型的通知
|
||||
- 用户可标记通知为已读
|
||||
|
||||
## 三、接口文档
|
||||
|
||||
### 1. 用户资料接口
|
||||
|
||||
#### 1.1 初始化用户资料
|
||||
|
||||
- **URI**: `/user/profile/init`
|
||||
- **方法**: POST
|
||||
- **描述**: 服务内部接口,初始化用户资料(由auth服务在用户注册时调用)
|
||||
- **请求参数**:
|
||||
- `userId`: 用户ID
|
||||
- `username`: 用户名
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `400`: 参数错误
|
||||
- `500`: 服务器内部错误
|
||||
|
||||
#### 1.2 获取当前用户资料
|
||||
|
||||
- **URI**: `/user/profile/current`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前登录用户的资料
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"id": 1,
|
||||
"nickname": "用户昵称",
|
||||
"avatar": "头像URL",
|
||||
"gender": 1,
|
||||
"birthday": "1990-01-01",
|
||||
"signature": "个性签名",
|
||||
"region": "地区",
|
||||
"followerCount": 10,
|
||||
"followingCount": 20,
|
||||
"videoCount": 5,
|
||||
"likeCount": 100,
|
||||
"level": 3,
|
||||
"vipLevel": 0,
|
||||
"vipExpireTime": null,
|
||||
"isFollowed": false,
|
||||
"createTime": "2023-01-01T12:00:00"
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.3 获取指定用户资料
|
||||
|
||||
- **URI**: `/user/profile/public/{userId}`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取指定用户的资料
|
||||
- **路径参数**:
|
||||
- `userId`: 用户ID
|
||||
- **响应**: 与获取当前用户资料相同
|
||||
|
||||
#### 1.4 更新用户资料
|
||||
|
||||
- **URI**: `/user/profile`
|
||||
- **方法**: PUT
|
||||
- **描述**: 更新当前用户资料
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **请求Body**:
|
||||
```json
|
||||
{
|
||||
"nickname": "新昵称",
|
||||
"gender": 1,
|
||||
"birthday": "1990-01-01",
|
||||
"signature": "新的个性签名",
|
||||
"region": "新的地区"
|
||||
}
|
||||
```
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.5 上传头像
|
||||
|
||||
- **URI**: `/user/profile/avatar`
|
||||
- **方法**: POST
|
||||
- **描述**: 上传用户头像
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- `Content-Type`: multipart/form-data
|
||||
- **请求参数**:
|
||||
- `file`: 图片文件
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": "头像URL"
|
||||
}
|
||||
```
|
||||
|
||||
#### 1.6 搜索用户
|
||||
|
||||
- **URI**: `/user/profile/search`
|
||||
- **方法**: GET
|
||||
- **描述**: 按关键词搜索用户
|
||||
- **请求参数**:
|
||||
- `keyword`: 搜索关键词
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认10)
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 1,
|
||||
"nickname": "用户昵称",
|
||||
"avatar": "头像URL",
|
||||
"signature": "个性签名",
|
||||
"followerCount": 10,
|
||||
"followingCount": 20
|
||||
}
|
||||
],
|
||||
"total": 100,
|
||||
"size": 10,
|
||||
"current": 1,
|
||||
"pages": 10
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 用户关注接口
|
||||
|
||||
#### 2.1 关注用户
|
||||
|
||||
- **URI**: `/user/follow/{followId}`
|
||||
- **方法**: POST
|
||||
- **描述**: 关注指定用户
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `followId`: 要关注的用户ID
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
- **错误码**:
|
||||
- `400`: 参数错误(如已关注)
|
||||
- `404`: 用户不存在
|
||||
|
||||
#### 2.2 取消关注
|
||||
|
||||
- **URI**: `/user/follow/{followId}`
|
||||
- **方法**: DELETE
|
||||
- **描述**: 取消关注指定用户
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `followId`: 要取消关注的用户ID
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.3 获取关注列表
|
||||
|
||||
- **URI**: `/user/follow/following/{userId}`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取指定用户的关注列表
|
||||
- **路径参数**:
|
||||
- `userId`: 用户ID
|
||||
- **请求参数**:
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认10)
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 2,
|
||||
"nickname": "被关注用户",
|
||||
"avatar": "头像URL",
|
||||
"signature": "个性签名",
|
||||
"followerCount": 100,
|
||||
"followingCount": 50,
|
||||
"isFollowed": true
|
||||
}
|
||||
],
|
||||
"total": 20,
|
||||
"size": 10,
|
||||
"current": 1,
|
||||
"pages": 2
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 2.4 获取粉丝列表
|
||||
|
||||
- **URI**: `/user/follow/followers/{userId}`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取指定用户的粉丝列表
|
||||
- **路径参数**:
|
||||
- `userId`: 用户ID
|
||||
- **请求参数**:
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认10)
|
||||
- **响应**: 与关注列表格式相同
|
||||
|
||||
#### 2.5 检查是否已关注
|
||||
|
||||
- **URI**: `/user/follow/check/{followId}`
|
||||
- **方法**: GET
|
||||
- **描述**: 检查当前用户是否已关注指定用户
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `followId`: 被检查的用户ID
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": true // 或 false
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 用户私信接口
|
||||
|
||||
#### 3.1 发送私信
|
||||
|
||||
- **URI**: `/user/message`
|
||||
- **方法**: POST
|
||||
- **描述**: 发送私信给指定用户
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **请求Body**:
|
||||
```json
|
||||
{
|
||||
"receiverId": 2,
|
||||
"content": "私信内容"
|
||||
}
|
||||
```
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 获取私信会话列表
|
||||
|
||||
- **URI**: `/user/message/list`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前用户的私信会话列表
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **请求参数**:
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认10)
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 100,
|
||||
"senderId": 2,
|
||||
"senderNickname": "发送者昵称",
|
||||
"senderAvatar": "发送者头像URL",
|
||||
"receiverId": 1,
|
||||
"receiverNickname": "接收者昵称",
|
||||
"receiverAvatar": "接收者头像URL",
|
||||
"content": "最新消息内容",
|
||||
"isRead": 0,
|
||||
"createTime": "2023-05-20T14:30:00"
|
||||
}
|
||||
],
|
||||
"total": 5,
|
||||
"size": 10,
|
||||
"current": 1,
|
||||
"pages": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.3 获取私信详情
|
||||
|
||||
- **URI**: `/user/message/detail/{targetId}`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取与指定用户的私信记录
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `targetId`: 目标用户ID
|
||||
- **请求参数**:
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认20)
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 100,
|
||||
"senderId": 1,
|
||||
"senderNickname": "当前用户",
|
||||
"senderAvatar": "头像URL",
|
||||
"receiverId": 2,
|
||||
"receiverNickname": "目标用户",
|
||||
"receiverAvatar": "头像URL",
|
||||
"content": "你好",
|
||||
"isRead": 1,
|
||||
"createTime": "2023-05-20T14:28:00"
|
||||
},
|
||||
{
|
||||
"id": 101,
|
||||
"senderId": 2,
|
||||
"senderNickname": "目标用户",
|
||||
"senderAvatar": "头像URL",
|
||||
"receiverId": 1,
|
||||
"receiverNickname": "当前用户",
|
||||
"receiverAvatar": "头像URL",
|
||||
"content": "你好,很高兴认识你",
|
||||
"isRead": 1,
|
||||
"createTime": "2023-05-20T14:30:00"
|
||||
}
|
||||
],
|
||||
"total": 2,
|
||||
"size": 20,
|
||||
"current": 1,
|
||||
"pages": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.4 标记私信为已读
|
||||
|
||||
- **URI**: `/user/message/read/{senderId}`
|
||||
- **方法**: PUT
|
||||
- **描述**: 标记来自指定发送者的所有私信为已读
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `senderId`: 发送者用户ID
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.5 获取未读私信数量
|
||||
|
||||
- **URI**: `/user/message/unread/count`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前用户的未读私信数量
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": 5
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 用户通知接口
|
||||
|
||||
#### 4.1 获取通知列表
|
||||
|
||||
- **URI**: `/user/notification/list`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取用户通知列表
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **请求参数**:
|
||||
- `type`: 通知类型(1:点赞,2:评论,3:关注,4:系统通知,可选)
|
||||
- `page`: 页码(默认1)
|
||||
- `size`: 每页数量(默认10)
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"records": [
|
||||
{
|
||||
"id": 1,
|
||||
"type": 3,
|
||||
"content": "用户小明关注了你",
|
||||
"relatedId": 123,
|
||||
"isRead": 0,
|
||||
"createTime": "2023-05-20T10:00:00"
|
||||
}
|
||||
],
|
||||
"total": 50,
|
||||
"size": 10,
|
||||
"current": 1,
|
||||
"pages": 5
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.2 标记所有通知为已读
|
||||
|
||||
- **URI**: `/user/notification/read`
|
||||
- **方法**: PUT
|
||||
- **描述**: 标记当前用户的所有通知为已读
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.3 标记指定通知为已读
|
||||
|
||||
- **URI**: `/user/notification/read/{notificationId}`
|
||||
- **方法**: PUT
|
||||
- **描述**: 标记指定通知为已读
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **路径参数**:
|
||||
- `notificationId`: 通知ID
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.4 获取未读通知数量
|
||||
|
||||
- **URI**: `/user/notification/unread/count`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前用户的未读通知数量
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": 10
|
||||
}
|
||||
```
|
||||
|
||||
### 5. 用户设置接口
|
||||
|
||||
#### 5.1 获取用户设置
|
||||
|
||||
- **URI**: `/user/setting`
|
||||
- **方法**: GET
|
||||
- **描述**: 获取当前用户的设置
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": {
|
||||
"privacyLevel": 1,
|
||||
"commentNotify": 1,
|
||||
"likeNotify": 1,
|
||||
"followNotify": 1,
|
||||
"systemNotify": 1
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.2 更新用户设置
|
||||
|
||||
- **URI**: `/user/setting`
|
||||
- **方法**: PUT
|
||||
- **描述**: 更新当前用户的设置
|
||||
- **请求头**:
|
||||
- `Authorization`: Bearer {accessToken}
|
||||
- **请求Body**:
|
||||
```json
|
||||
{
|
||||
"privacyLevel": 2,
|
||||
"commentNotify": 1,
|
||||
"likeNotify": 0,
|
||||
"followNotify": 1,
|
||||
"systemNotify": 1
|
||||
}
|
||||
```
|
||||
- **响应**:
|
||||
```json
|
||||
{
|
||||
"code": 200,
|
||||
"message": "操作成功",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
|
||||
## 四、数据库表结构
|
||||
|
||||
### 1. user_info (用户信息表)
|
||||
- `id`: bigint - 用户ID (主键)
|
||||
- `nickname`: varchar(64) - 昵称
|
||||
- `avatar`: varchar(256) - 头像URL
|
||||
- `gender`: tinyint - 性别(0:未知,1:男,2:女)
|
||||
- `birthday`: date - 生日
|
||||
- `signature`: varchar(256) - 个性签名
|
||||
- `region`: varchar(128) - 地区
|
||||
- `follower_count`: int - 粉丝数
|
||||
- `following_count`: int - 关注数
|
||||
- `video_count`: int - 视频数
|
||||
- `like_count`: int - 获赞数
|
||||
- `coin_count`: int - 硬币数
|
||||
- `favorite_count`: int - 收藏数
|
||||
- `view_count`: bigint - 播放数
|
||||
- `level`: tinyint - 等级
|
||||
- `vip_level`: tinyint - VIP等级
|
||||
- `vip_expire_time`: datetime - VIP到期时间
|
||||
- `created_by`: varchar(64) - 创建人
|
||||
- `updated_by`: varchar(64) - 更新人
|
||||
- `create_time`: datetime - 创建时间
|
||||
- `update_time`: datetime - 更新时间
|
||||
|
||||
### 2. user_follow (用户关注表)
|
||||
- `id`: bigint - 主键ID
|
||||
- `user_id`: bigint - 用户ID
|
||||
- `follow_id`: bigint - 关注用户ID
|
||||
- `create_time`: datetime - 创建时间
|
||||
|
||||
### 3. user_stat_daily (用户每日统计表)
|
||||
- `id`: bigint - 主键ID
|
||||
- `user_id`: bigint - 用户ID
|
||||
- `stat_date`: date - 统计日期
|
||||
- `follower_increment`: int - 新增粉丝数
|
||||
- `following_increment`: int - 新增关注数
|
||||
- `video_increment`: int - 新增视频数
|
||||
- `like_increment`: int - 新增获赞数
|
||||
- `coin_increment`: int - 新增硬币数
|
||||
- `favorite_increment`: int - 新增收藏数
|
||||
- `view_increment`: bigint - 新增播放数
|
||||
- `create_time`: datetime - 创建时间
|
||||
|
||||
### 4. user_message (用户私信表)
|
||||
- `id`: bigint - 主键ID
|
||||
- `sender_id`: bigint - 发送者ID
|
||||
- `receiver_id`: bigint - 接收者ID
|
||||
- `content`: text - 消息内容
|
||||
- `is_read`: tinyint - 是否已读(0:未读,1:已读)
|
||||
- `create_time`: datetime - 创建时间
|
||||
|
||||
### 5. user_notification (用户通知表)
|
||||
- `id`: bigint - 主键ID
|
||||
- `user_id`: bigint - 用户ID
|
||||
- `type`: tinyint - 通知类型(1:点赞,2:评论,3:关注,4:系统通知)
|
||||
- `content`: text - 通知内容
|
||||
- `related_id`: bigint - 相关ID
|
||||
- `is_read`: tinyint - 是否已读(0:未读,1:已读)
|
||||
- `create_time`: datetime - 创建时间
|
||||
|
||||
### 6. user_setting (用户设置表)
|
||||
- `id`: bigint - 主键ID
|
||||
- `user_id`: bigint - 用户ID
|
||||
- `privacy_level`: tinyint - 隐私等级(1:公开,2:仅关注,3:私密)
|
||||
- `comment_notify`: tinyint - 评论通知(0:关闭,1:开启)
|
||||
- `like_notify`: tinyint - 点赞通知(0:关闭,1:开启)
|
||||
- `follow_notify`: tinyint - 关注通知(0:关闭,1:开启)
|
||||
- `system_notify`: tinyint - 系统通知(0:关闭,1:开启)
|
||||
- `created_by`: varchar(64) - 创建人
|
||||
- `updated_by`: varchar(64) - 更新人
|
||||
- `create_time`: datetime - 创建时间
|
||||
- `update_time`: datetime - 更新时间
|
||||
|
||||
## 五、调用示例
|
||||
|
||||
### 1. 获取用户资料
|
||||
|
||||
```bash
|
||||
# 使用cURL
|
||||
curl -X GET http://localhost:9002/user/profile/current \
|
||||
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
|
||||
|
||||
# 使用JavaScript
|
||||
fetch('http://localhost:9002/user/profile/current', {
|
||||
headers: {
|
||||
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9...'
|
||||
}
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => console.log(data));
|
||||
```
|
||||
|
||||
### 2. 关注用户
|
||||
|
||||
```bash
|
||||
# 使用cURL
|
||||
curl -X POST http://localhost:9002/user/follow/2 \
|
||||
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
|
||||
|
||||
# 使用JavaScript
|
||||
fetch('http://localhost:9002/user/follow/2', {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Authorization': 'Bearer eyJhbGciOiJIUzI1NiJ9...'
|
||||
}
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => console.log(data));
|
||||
```
|
||||
|
||||
video-user模块是整个视频平台的核心组成部分,它提供了完整的用户信息管理、社交互动和消息通知功能,为用户提供良好的社交体验。
|
||||
- 使用 MyBatis-Plus、MySQL 与 Redis;头像通过共享 MinIO 工具上传。
|
||||
- 头像请求限制定义在 `application.yml`:默认单文件/请求 10 MB,业务头像大小默认 5 MB,可由环境变量覆盖。
|
||||
- 服务通过 Feign 与认证、内容等服务协作。前端经网关访问,不使用文档中的旧 `localhost:9002` 直连示例。
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+57
-72
@@ -1,90 +1,75 @@
|
||||
## 开发环境步骤
|
||||
# 开发环境搭建
|
||||
|
||||
**安装JDK 17**
|
||||
本文档对应当前仓库结构。后端配置通过 Nacos 导入,开发环境默认使用 `dev` profile;不要再按旧文档分别启动带固定密码的 MySQL、Redis、MinIO 容器。
|
||||
|
||||
## 环境要求
|
||||
|
||||
- JDK 17
|
||||
- Maven 3.9+(或使用 IDE 的 Maven)
|
||||
- Node.js 18+
|
||||
- Docker Engine 与 Docker Compose v2
|
||||
|
||||
## 启动基础设施
|
||||
|
||||
在仓库根目录执行:
|
||||
|
||||
```bash
|
||||
# Ubuntu/Debian
|
||||
sudo apt install openjdk-17-jdk
|
||||
|
||||
# CentOS/RHEL
|
||||
sudo yum install java-17-openjdk-devel
|
||||
cd backend
|
||||
cp .env.example .env
|
||||
docker compose up -d mysql redis redis-sentinel nacos rmqnamesrv rmqbroker minio sentinel
|
||||
```
|
||||
|
||||
**安装Docker和Docker Compose**
|
||||
`docker-compose.yml` 会初始化业务数据库和 Nacos schema;Nacos 配置由 `sql/nacos-config-init.sql` 导入。首次启动后确认 Nacos 健康,再启动业务服务。
|
||||
|
||||
常用基础设施端口:
|
||||
|
||||
| 组件 | 端口 |
|
||||
| --- | --- |
|
||||
| MySQL | 3306 |
|
||||
| Redis / Sentinel | 6379 / 26379 |
|
||||
| Nacos(HTTP/gRPC) | 8848 / 9848 / 9849 |
|
||||
| RocketMQ NameServer / Broker | 9876 / 10911 |
|
||||
| MinIO API / Console | 9100 / 9101 |
|
||||
| Sentinel Dashboard | 8880 |
|
||||
|
||||
## 启动后端
|
||||
|
||||
后端模块端口固定为:网关 `9000`、认证 `9001`、用户 `9002`、内容 `9003`、评论 `9004`、推荐 `9005`、管理 `9006`。推荐使用 Docker Compose 一次启动:
|
||||
|
||||
```bash
|
||||
# 安装Docker
|
||||
curl -fsSL https://get.docker.com | sh
|
||||
sudo systemctl enable --now docker
|
||||
|
||||
# 安装Docker Compose
|
||||
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
|
||||
sudo chmod +x /usr/local/bin/docker-compose
|
||||
cd backend
|
||||
docker compose up -d --build video-gateway video-auth video-user video-content video-comment video-recommend video-admin
|
||||
```
|
||||
|
||||
**安装MySQL 8.0**
|
||||
本地 IDE 启动时,先启动 Nacos 及依赖,并将 `SPRING_PROFILES_ACTIVE=dev`;各模块的 `application.yml` 会从 Nacos 加载 `common.yaml`、`common-redis-dev.yaml` 和对应服务配置。
|
||||
|
||||
## 启动前端
|
||||
|
||||
```bash
|
||||
docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=video_auth -v /data/mysql:/var/lib/mysql mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
||||
cd frontend/video-frontend-web
|
||||
npm install
|
||||
npm run dev
|
||||
|
||||
cd ../video-frontend-admin
|
||||
npm install
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**安装Redis 7.0**
|
||||
用户端默认端口 `3000`,管理端默认端口 `3100`。Vite 将 `/api` 代理到 `VITE_PROXY_TARGET`,未设置时为 `http://192.168.1.101:9000`;本地开发可在对应前端目录的 `.env.local` 设置为 `http://127.0.0.1:9000`。
|
||||
|
||||
## 构建与测试
|
||||
|
||||
```bash
|
||||
docker run -d --name redis7 -p 6379:6379 redis:7.0-alpine
|
||||
cd backend
|
||||
mvn test
|
||||
mvn package -DskipTests
|
||||
|
||||
cd ../frontend/video-frontend-web
|
||||
npm run build
|
||||
cd ../video-frontend-admin
|
||||
npm run build
|
||||
```
|
||||
|
||||
**RocketMQ 5.1.4**
|
||||
|
||||
```bash
|
||||
# 先安装NameServer
|
||||
docker run -d --name rmqnamesrv -p 9876:9876 apache/rocketmq:5.1.4 sh mqnamesrv
|
||||
|
||||
# 再安装Broker
|
||||
docker run -d --name rmqbroker --link rmqnamesrv:namesr -p 10909:10909 -p 10911:10911 -e "NAMESRV_ADDR=namesrv:9876" -e "JAVA_OPTS=-Duser.home=/opt" apache/rocketmq:5.1.4 sh mqbroker -c /home/rocketmq/rocketmq-5.1.4/conf/broker.conf
|
||||
```
|
||||
|
||||
**minio**
|
||||
|
||||
```bash
|
||||
docker run -d --name minio -p 9002:9000 -p 9001:9001 -v /data/minio:/data -e "MINIO_ROOT_USER=minioadmin" -e "MINIO_ROOT_PASSWORD=minioadmin" quay.io/minio/minio server /data --console-address ":9001"
|
||||
```
|
||||
|
||||
**安装Nacos 2.3.2**
|
||||
|
||||
```bash
|
||||
docker run -d --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone -e JVM_XMS=512m -e JVM_XMX=512m nacos/nacos-server:v2.3.2
|
||||
```
|
||||
|
||||
**Sentinel Dashboard 1.8.6**
|
||||
|
||||
#### **使用官方发布的 JAR 包自行构建镜像**
|
||||
|
||||
1. **创建 `Dockerfile`**
|
||||
|
||||
```bash
|
||||
FROM eclipse-temurin:8-jre
|
||||
|
||||
# 下载 Sentinel 1.8.6 官方 JAR
|
||||
RUN wget -O /sentinel-dashboard.jar \
|
||||
https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar
|
||||
|
||||
# 设置时区(可选)
|
||||
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
|
||||
|
||||
EXPOSE 8080
|
||||
CMD ["java", "-Dserver.port=8080", "-Dcsp.sentinel.dashboard.server=localhost:8080", "-jar", "/sentinel-dashboard.jar"]
|
||||
```
|
||||
|
||||
2. **构建镜像**
|
||||
|
||||
```bash
|
||||
docker build -t sentinel-dashboard:1.8.6 .
|
||||
```
|
||||
|
||||
3. **运行容器**
|
||||
|
||||
```bash
|
||||
docker run -d --name sentinel -p 8080:8080 sentinel-dashboard:1.8.6
|
||||
```
|
||||
## 配置安全
|
||||
|
||||
`.env`、Nacos 密码、JWT secret、MinIO 密钥和初始化管理员密码只应通过环境变量提供。文档中的地址均为示例,不要提交真实凭据。
|
||||
|
||||
Reference in New Issue
Block a user