diff --git a/.idea/.cache/.Apifox_Helper/.toolWindow.db b/.idea/.cache/.Apifox_Helper/.toolWindow.db
index aa3ef4c..df8a67a 100644
Binary files a/.idea/.cache/.Apifox_Helper/.toolWindow.db and b/.idea/.cache/.Apifox_Helper/.toolWindow.db differ
diff --git a/.idea/ApifoxUploaderProjectSetting.xml b/.idea/ApifoxUploaderProjectSetting.xml
index 01b4d2b..bff5671 100644
--- a/.idea/ApifoxUploaderProjectSetting.xml
+++ b/.idea/ApifoxUploaderProjectSetting.xml
@@ -9,9 +9,10 @@
+
-
-
+
+
\ No newline at end of file
diff --git a/build-and-deploy.bat b/build-and-deploy.bat
new file mode 100644
index 0000000..b33d0d8
--- /dev/null
+++ b/build-and-deploy.bat
@@ -0,0 +1,20 @@
+@echo off
+echo 开始构建和部署视频平台项目...
+
+echo 1. 构建项目...
+call mvn clean package -DskipTests
+
+echo 2. 构建Sentinel Dashboard镜像...
+cd sentinel-dashboard
+docker build -t sentinel-dashboard:1.8.6 .
+cd ..
+
+echo 3. 启动Docker Compose...
+docker-compose up -d
+
+echo 部署完成!
+echo 服务访问地址:
+echo - 网关: http://localhost:9000
+echo - Nacos: http://localhost:8848/nacos
+echo - Sentinel: http://localhost:8080
+echo - MinIO: http://localhost:9001
\ No newline at end of file
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..bb9ba60
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,262 @@
+version: '3.8'
+
+services:
+ # 基础设施服务
+ mysql:
+ image: mysql:8.0
+ container_name: mysql
+ restart: always
+ environment:
+ MYSQL_ROOT_PASSWORD: root
+ MYSQL_DATABASE: video_platform
+ ports:
+ - "3306:3306"
+ volumes:
+ - mysql_data:/var/lib/mysql
+ - ./sql:/docker-entrypoint-initdb.d
+ command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
+ networks:
+ - video-network
+
+ redis:
+ image: redis:7.0-alpine
+ container_name: redis
+ restart: always
+ ports:
+ - "6379:6379"
+ volumes:
+ - redis_data:/data
+ command: redis-server --requirepass redis_EsJ8FX
+ networks:
+ - video-network
+
+ nacos:
+ image: nacos/nacos-server:v2.3.2
+ container_name: nacos
+ restart: always
+ environment:
+ - MODE=standalone
+ - JVM_XMS=512m
+ - JVM_XMX=512m
+ ports:
+ - "8848:8848"
+ - "9848:9848"
+ - "9849:9849"
+ networks:
+ - video-network
+
+ rmqnamesrv:
+ image: apache/rocketmq:5.1.4
+ container_name: rmqnamesrv
+ restart: always
+ ports:
+ - "9876:9876"
+ command: sh mqnamesrv
+ networks:
+ - video-network
+
+ rmqbroker:
+ image: apache/rocketmq:5.1.4
+ container_name: rmqbroker
+ restart: always
+ ports:
+ - "10909:10909"
+ - "10911:10911"
+ environment:
+ - NAMESRV_ADDR=rmqnamesrv:9876
+ - JAVA_OPTS=-Duser.home=/opt
+ command: sh mqbroker -c /home/rocketmq/rocketmq-5.1.4/conf/broker.conf
+ depends_on:
+ - rmqnamesrv
+ networks:
+ - video-network
+
+ minio:
+ image: quay.io/minio/minio
+ container_name: minio
+ restart: always
+ ports:
+ - "9002:9000"
+ - "9001:9001"
+ environment:
+ - MINIO_ROOT_USER=minioadmin
+ - MINIO_ROOT_PASSWORD=minioadmin
+ volumes:
+ - minio_data:/data
+ command: server /data --console-address ":9001"
+ networks:
+ - video-network
+
+ sentinel:
+ image: sentinel-dashboard:1.8.6
+ container_name: sentinel
+ restart: always
+ ports:
+ - "8080:8080"
+ networks:
+ - video-network
+
+ # 微服务
+ video-gateway:
+ build:
+ context: ./video-gateway
+ dockerfile: Dockerfile
+ container_name: video-gateway
+ restart: always
+ ports:
+ - "9000:9000"
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - SENTINEL_HOST=sentinel
+ - SENTINEL_PORT=8080
+ depends_on:
+ - nacos
+ - sentinel
+ networks:
+ - video-network
+
+ video-auth:
+ build:
+ context: ./video-auth
+ dockerfile: Dockerfile
+ container_name: video-auth
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ networks:
+ - video-network
+
+ video-user:
+ build:
+ context: ./video-user
+ dockerfile: Dockerfile
+ container_name: video-user
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ networks:
+ - video-network
+
+ video-content:
+ build:
+ context: ./video-content
+ dockerfile: Dockerfile
+ container_name: video-content
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ - ROCKETMQ_HOST=rmqnamesrv
+ - ROCKETMQ_PORT=9876
+ - MINIO_HOST=minio
+ - MINIO_PORT=9000
+ - MINIO_ACCESS_KEY=minioadmin
+ - MINIO_SECRET_KEY=minioadmin
+ - MINIO_BUCKET=video-platform
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ - rmqnamesrv
+ - minio
+ networks:
+ - video-network
+
+ video-admin:
+ build:
+ context: ./video-admin
+ dockerfile: Dockerfile
+ container_name: video-admin
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ networks:
+ - video-network
+
+ video-comment:
+ build:
+ context: ./video-comment
+ dockerfile: Dockerfile
+ container_name: video-comment
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ networks:
+ - video-network
+
+ video-recommend:
+ build:
+ context: ./video-recommend
+ dockerfile: Dockerfile
+ container_name: video-recommend
+ restart: always
+ environment:
+ - SPRING_PROFILES_ACTIVE=prod
+ - NACOS_HOST=nacos
+ - NACOS_PORT=8848
+ - MYSQL_HOST=mysql
+ - MYSQL_PORT=3306
+ - REDIS_HOST=redis
+ - REDIS_PORT=6379
+ depends_on:
+ - nacos
+ - mysql
+ - redis
+ networks:
+ - video-network
+
+networks:
+ video-network:
+ driver: bridge
+
+volumes:
+ mysql_data:
+ redis_data:
+ minio_data:
\ No newline at end of file
diff --git a/sentinel-dashboard/Dockerfile b/sentinel-dashboard/Dockerfile
new file mode 100644
index 0000000..aa19d92
--- /dev/null
+++ b/sentinel-dashboard/Dockerfile
@@ -0,0 +1,16 @@
+FROM eclipse-temurin:8-jre
+
+# 下载 Sentinel 1.8.6 官方 JAR
+RUN apt-get update && \
+ apt-get install -y wget && \
+ wget -O /sentinel-dashboard.jar \
+ https://github.com/alibaba/Sentinel/releases/download/1.8.6/sentinel-dashboard-1.8.6.jar && \
+ apt-get remove -y wget && \
+ apt-get clean && \
+ rm -rf /var/lib/apt/lists/*
+
+# 设置时区
+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"]
\ No newline at end of file
diff --git a/sql/init.sql b/sql/init.sql
index 353337f..fec3365 100644
--- a/sql/init.sql
+++ b/sql/init.sql
@@ -764,13 +764,6 @@ INSERT IGNORE INTO `admin_role_permission` (`role_id`, `permission_id`) VALUES
(3, 1),
(4, 9), (4, 10);
--- 初始化超级管理员账号(密码:admin123)
-INSERT IGNORE INTO `admin_user` (`id`, `username`, `password`, `salt`, `real_name`, `email`, `phone`, `status`) VALUES
- (1, 'admin', '$2a$10$oRZ7x/.dW.6Q9z0QY1JZ5e9ZQ9z0QY1JZ5e9ZQ9z0QY1JZ5e9ZQ', 'abcdefg', '超级管理员', 'admin@nuaa.edu.cn', '13800138000', 1);
-
-INSERT IGNORE INTO `admin_user_role` (`admin_id`, `role_id`) VALUES
- (1, 1);
-
-- 初始化系统配置
INSERT IGNORE INTO `admin_system_config` (`config_key`, `config_value`, `description`) VALUES
('site_name', '高可用在线视频平台', '网站名称'),
diff --git a/video-admin/Dockerfile b/video-admin/Dockerfile
new file mode 100644
index 0000000..01414fc
--- /dev/null
+++ b/video-admin/Dockerfile
@@ -0,0 +1,7 @@
+FROM eclipse-temurin:17-jre
+
+WORKDIR /app
+
+COPY target/video-admin-*.jar app.jar
+
+ENTRYPOINT ["java", "-jar", "app.jar"]
\ No newline at end of file
diff --git a/video-admin/src/main/java/com/nuaa/video/admin/config/PasswordConfig.java b/video-admin/src/main/java/com/nuaa/video/admin/config/PasswordConfig.java
new file mode 100644
index 0000000..e5643fa
--- /dev/null
+++ b/video-admin/src/main/java/com/nuaa/video/admin/config/PasswordConfig.java
@@ -0,0 +1,15 @@
+package com.nuaa.video.admin.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.security.crypto.password.PasswordEncoder;
+
+@Configuration
+public class PasswordConfig {
+
+ @Bean
+ public PasswordEncoder passwordEncoder() {
+ return new BCryptPasswordEncoder();
+ }
+}
\ No newline at end of file
diff --git a/video-admin/src/main/java/com/nuaa/video/admin/config/RedisConfig.java b/video-admin/src/main/java/com/nuaa/video/admin/config/RedisConfig.java
new file mode 100644
index 0000000..d4d71a5
--- /dev/null
+++ b/video-admin/src/main/java/com/nuaa/video/admin/config/RedisConfig.java
@@ -0,0 +1,38 @@
+package com.nuaa.video.admin.config;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+ @Bean
+ public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
+ RedisTemplate template = new RedisTemplate<>();
+ template.setConnectionFactory(factory);
+
+ // 创建配置好的ObjectMapper
+ ObjectMapper mapper = new ObjectMapper();
+ mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+ mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
+
+ // 使用Jackson2JsonRedisSerializer
+ Jackson2JsonRedisSerializer