Merge pull request #42 from PlayEdu/refactor/env-from-application

refactor: 后台配置改为直接读取环境变量
This commit is contained in:
ten authored and GitHub committed 2026-05-14 12:44:04 +08:00
1 parent 6621ca4232
commit fd662a6106
13 files changed
+62 -282

No files matched your search

-31
View File
@@ -1,31 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu API Project Overview
PlayEdu is an online training solution developed by Baishu Technology. The API is built with Java + Spring Boot 3, using a modular approach.
## Project Structure
- [playedu-api](mdc:playedu-api) - Java backend API project
- [playedu-admin](mdc:playedu-admin) - Admin frontend
- [playedu-pc](mdc:playedu-pc) - PC web interface
- [playedu-h5](mdc:playedu-h5) - Mobile web interface
## API Key Modules
- [playedu-api/PlayeduApiApplication.java](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/PlayeduApiApplication.java) - Main application entry point
- [playedu-api](mdc:playedu-api/playedu-api) - API module containing controllers and API-specific logic
- [playedu-common](mdc:playedu-api/playedu-common) - Common utilities and shared code
- [playedu-resource](mdc:playedu-api/playedu-resource) - Resource management module
- [playedu-course](mdc:playedu-api/playedu-course) - Course-related functionality
- [playedu-system](mdc:playedu-api/playedu-system) - System management functionality
## Backend vs Frontend Controllers
- [Backend Controllers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend) - Admin-facing API endpoints
- [Frontend Controllers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/frontend) - Student-facing API endpoints
## Development and Deployment
- [pom.xml](mdc:playedu-api/pom.xml) - Main Maven configuration file
- [Dockerfile](mdc:playedu-api/Dockerfile) - Docker build configuration
- [compose.yml](mdc:compose.yml) - Docker Compose configuration
-32
View File
@@ -1,32 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu API Structure
The API module follows a standard Spring Boot structure with controllers, services, and supporting components.
## Controller Layout
The API endpoints are divided into backend (admin) and frontend (student) controllers:
### Backend Controllers
- [Backend Controllers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend) - Admin management interfaces
- [AdminUserController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend/AdminUserController.java) - Administrator management
- [CourseController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend/CourseController.java) - Course management
- [DepartmentController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend/DepartmentController.java) - Department management
- [ResourceController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend/ResourceController.java) - Resource management
- [UserController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/backend/UserController.java) - User management
### Frontend Controllers
- [Frontend Controllers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/frontend) - Student-facing endpoints
- [LoginController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/frontend/LoginController.java) - Student login
- [CourseController](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller/frontend/CourseController.java) - Course access
## API Application Components
- [PlayeduApiApplication](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/PlayeduApiApplication.java) - Main application entry point
- [Request DTOs](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/request) - Data transfer objects for API requests
- [Response Format](mdc:playedu-api/playedu-common/src/main/java/xyz/playedu/common/util/JsonResponse.java) - Standard JSON response format
- [Event Handlers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/event) - Event-driven components
- [Scheduled Tasks](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/schedule) - Scheduled/recurring tasks
- [Interceptors](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/interceptor) - HTTP request interceptors
-32
View File
@@ -1,32 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu Configuration Guide
The PlayEdu application uses standard Spring Boot configuration with YAML files.
## Application Configuration
- [application.yml](mdc:playedu-api/playedu-api/src/main/resources/application.yml) - Main application configuration
- [application-dev.yml](mdc:playedu-api/playedu-api/src/main/resources/application-dev.yml) - Development environment overrides
## Key Configuration Properties
- Database connection settings
- Redis cache configuration
- File storage configuration
- Security settings
- Cors configuration
## Build Configuration
- [pom.xml](mdc:playedu-api/pom.xml) - Main project Maven POM file
- [playedu-api/pom.xml](mdc:playedu-api/playedu-api/pom.xml) - API module POM file
- [playedu-common/pom.xml](mdc:playedu-api/playedu-common/pom.xml) - Common module POM file
- [playedu-course/pom.xml](mdc:playedu-api/playedu-course/pom.xml) - Course module POM file
- [playedu-resource/pom.xml](mdc:playedu-api/playedu-resource/pom.xml) - Resource module POM file
- [playedu-system/pom.xml](mdc:playedu-api/playedu-system/pom.xml) - System module POM file
## Docker Configuration
- [Dockerfile](mdc:playedu-api/Dockerfile) - Docker image definition
- [Dockerfile.local](mdc:playedu-api/Dockerfile.local) - Local development Docker configuration
- [compose.yml](mdc:compose.yml) - Docker Compose service definitions
-46
View File
@@ -1,46 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu Module Structure
PlayEdu follows a modular architecture with separate modules for different concerns:
## Module Organization
Each module follows a similar structure with domain models, services, and mappers:
- **playedu-api**: Main API controllers and application entry point
- [Controllers](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/controller) - API endpoints
- [Request DTOs](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/request) - Request data objects
- [Configuration](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/config) - Module-specific configuration
- **playedu-common**: Shared utilities, base classes, and common functionality
- [Constants](mdc:playedu-api/playedu-common/src/main/java/xyz/playedu/common/constant) - System constants
- [Exceptions](mdc:playedu-api/playedu-common/src/main/java/xyz/playedu/common/exception) - Custom exceptions
- [Utilities](mdc:playedu-api/playedu-common/src/main/java/xyz/playedu/common/util) - Common utility classes
- [Base Models](mdc:playedu-api/playedu-common/src/main/java/xyz/playedu/common/bus) - Base model classes
- **playedu-resource**: Resource management (files, media, etc.)
- [Domain Models](mdc:playedu-api/playedu-resource/src/main/java/xyz/playedu/resource/domain) - Entity classes
- [Services](mdc:playedu-api/playedu-resource/src/main/java/xyz/playedu/resource/service) - Business logic
- [Mappers](mdc:playedu-api/playedu-resource/src/main/java/xyz/playedu/resource/mapper) - Database access layer
- **playedu-course**: Course management functionality
- [Domain Models](mdc:playedu-api/playedu-course/src/main/java/xyz/playedu/course/domain) - Course entities
- [Services](mdc:playedu-api/playedu-course/src/main/java/xyz/playedu/course/service) - Course business logic
- [Mappers](mdc:playedu-api/playedu-course/src/main/java/xyz/playedu/course/mapper) - Course data access
- **playedu-system**: System administration functionality
- [Domain Models](mdc:playedu-api/playedu-system/src/main/java/xyz/playedu/system/domain) - System entities
- [Services](mdc:playedu-api/playedu-system/src/main/java/xyz/playedu/system/service) - System business logic
- [Mappers](mdc:playedu-api/playedu-system/src/main/java/xyz/playedu/system/mapper) - System data access
## Domain-Driven Design
The codebase follows a layered architecture with:
- Controllers: Handle API requests and responses
- Services: Implement business logic
- Mappers: Data access layer (using MyBatis)
- Domain models: Entity classes representing business objects
This modular approach allows for separation of concerns and easier maintainability.
-45
View File
@@ -1,45 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu Development Workflow
This guide outlines the workflow for developing and running the PlayEdu API.
## Local Development Setup
1. Clone the repository
2. Use Docker Compose to run the application: `docker-compose up -d`
3. Access points:
- API: `http://localhost:9700`
- Admin backend: `http://localhost:9900` (default credentials: `admin@playedu.xyz / playedu`)
- PC web interface: `http://localhost:9800`
- H5 mobile interface: `http://localhost:9801`
## Main Entry Points
- [PlayeduApiApplication.java](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/PlayeduApiApplication.java) - Main application class
- [application.yml](mdc:playedu-api/playedu-api/src/main/resources/application.yml) - Configuration
## Tech Stack
- Java with Spring Boot 3
- MySQL database
- Redis for caching
- MyBatis for data access
- Docker for containerization
## Development Best Practices
- Follow existing code structure when adding new features
- Add unit tests for new functionality
- Maintain module separation of concerns
- Use existing utility classes from `playedu-common`
## Build Process
To build the application:
1. Use Maven: `mvn clean package`
2. Build Docker image: `docker build -t playedu-api .`
3. Run in development mode: `docker-compose up -d`
## Version Control
- Follow standard Git workflow with feature branches
- Create pull requests for significant changes
- Update CHANGELOG.md for version releases
-33
View File
@@ -1,33 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu Security Model
This guide outlines the security model of the PlayEdu application.
## Authentication
- [BackendAuthInterceptor](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/interceptor/BackendAuthInterceptor.java) - Backend authentication interceptor
- [FrontendAuthInterceptor](mdc:playedu-api/playedu-api/src/main/java/xyz/playedu/api/interceptor/FrontendAuthInterceptor.java) - Frontend authentication interceptor
- JWT-based authentication for both frontend and backend users
## Authorization
- Role-based access control for backend users
- Department-based content access for frontend users
- Course permission enforcement
## Security Configuration
- CORS configuration to prevent cross-site request forgery
- Password encryption using BCrypt
- Input validation and sanitization
## Resource Security
- Private video storage and delivery
- URL-based token authentication for media access
- Anti-leech protection for media files
## Sensitive Data Protection
- PII (Personally Identifiable Information) protection
- Logging sanitization for sensitive data
- Database encryption for critical fields
-40
View File
@@ -1,40 +0,0 @@
---
description:
globs:
alwaysApply: false
---
# PlayEdu Database Structure
This guide outlines the database structure of the PlayEdu application.
## Database Technology
- MySQL database for persistent storage
- Redis for caching and session management
- MyBatis as the ORM framework
## Core Tables
- **admin_users** - Administrator user accounts
- **admin_roles** - Administrator roles for RBAC
- **departments** - Organizational departments
- **users** - Student/learner accounts
- **courses** - Course information
- **resources** - Media and document resources
- **course_chapters** - Course chapter organization
- **course_hour_records** - Learning progress tracking
## Entity Relationships
- Departments have many Users (many-to-many)
- Courses have many Chapters (one-to-many)
- Courses have many Resources (many-to-many)
- Users have progress records for Courses (many-to-many)
## Database Access
- Data access through MyBatis Mappers
- [Example Mapper](mdc:playedu-api/playedu-course/src/main/java/xyz/playedu/course/mapper/CourseMapper.java)
- XML query definitions in resource XML files
- [Example XML](mdc:playedu-api/playedu-course/src/main/resources/mapper/CourseMapper.xml)
## Data Migration
- Managed through SQL scripts
- Version controlled database changes
- Backup procedures for data safety
+28 -1
View File
@@ -1,9 +1,36 @@
################# PlayEdu ###################
# 前端 / API 对外端口
PLAYEDU_API_PORT=9700
PLAYEDU_PC_PORT=9800
PLAYEDU_H5_PORT=9801
PLAYEDU_ADMIN_PORT=9900
# JWT 签名密钥 (生产环境务必修改)
PLAYEDU_JWT_KEY=playeduxyz
# 是否限制同一账号同时登录 (true=同一账号只能在一处登录)
PLAYEDU_SA_TOKEN_IS_CONCURRENT=false
# 时区 (应用与 mysql 共用,默认上海时区)
PLAYEDU_TZ=Asia/Shanghai
# 数据库连接信息
# 容器内默认连 compose 内置的 mysql 服务;如需接外部 MySQL,改 PLAYEDU_DB_HOST/PORT
PLAYEDU_DB_HOST=mysql
PLAYEDU_DB_PORT=3306
# 数据库名 (应用端 DB_NAME 与 mysql 容器 MYSQL_DATABASE 初始化共用此值)
PLAYEDU_DB_NAME=playedu
PLAYEDU_DB_USER=root
# 数据库密码 (应用端 DB_PASS 与 mysql 容器 root 密码共用此值)
PLAYEDU_DB_PASS=playeduxyz
# 数据库连接池 (Hikari)
PLAYEDU_DB_POOL_MIN_IDLE=1
PLAYEDU_DB_POOL_MAX_SIZE=10
PLAYEDU_DB_POOL_CONN_TIMEOUT=30000 # 获取连接超时时间 (ms)
PLAYEDU_DB_POOL_IDLE_TIMEOUT=600000 # 空闲连接超时时间 (ms)
PLAYEDU_DB_POOL_MAX_LIFETIME=1800000 # 连接最大存活时间 (ms)
################# MySQL ###################
MYSQL_PORT=23307
# 宿主机映射端口 (容器内仍为 3306)
MYSQL_PORT=23307
+2 -2
View File
@@ -1,9 +1,9 @@
如果您发现 `PlayEdu` 存在安全漏洞,请联系我:
+ 联系姓名:滕勇志
+ 联系邮箱:`616896861@qq.com`
+ 联系邮箱:`tengyongzhi@playeduos.com`
If you have feedback regarding a security vulnerability in `PlayEdu`, please contact:
+ Contact Name: Yongzhi Teng
+ Contact Email: `616896861@qq.com`
+ Contact Email: `tengyongzhi@playeduos.com`
+3
View File
@@ -1,6 +1,9 @@
## Unreleased
- 修复:后台批量导入学员、章节/课时/附件排序接口缺少权限注解导致的越权问题
- 优化:后台配置项改为由 `application.yml` 直接读取环境变量,移除 Dockerfile 中的命令行参数映射
- 新增:数据库连接池可通过环境变量配置 (`DB_POOL_MIN_IDLE` / `DB_POOL_MAX_SIZE` / `DB_POOL_CONN_TIMEOUT` / `DB_POOL_IDLE_TIMEOUT` / `DB_POOL_MAX_LIFETIME`)
- 新增:`compose.yml` 中 MySQL 密码改为通过 `PLAYEDU_DB_PASS` 环境变量配置,与应用端 `DB_PASS` 共用同一变量
## 2.0
+1 -1
View File
@@ -36,4 +36,4 @@ EXPOSE 9800
EXPOSE 9801
EXPOSE 9900
CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar --spring.profiles.active=prod --spring.datasource.url="jdbc:mysql://${DB_HOST}:${DB_PORT:-3306}/${DB_NAME}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true" --spring.datasource.username=${DB_USER} --spring.datasource.password=${DB_PASS} --sa-token.is-concurrent=${SA_TOKEN_IS_CONCURRENT:-false} --sa-token.jwt-secret-key=${SA_TOKEN_JWT_SECRET_KEY}
CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar
+15 -9
View File
@@ -16,13 +16,19 @@ services:
image: registry.cn-hangzhou.aliyuncs.com/playedu/light:2.0
restart: always
environment:
- DB_HOST=mysql
- DB_PORT=3306
- DB_NAME=playedu
- DB_USER=root
- DB_PASS=playeduxyz
- SA_TOKEN_IS_CONCURRENT=false
- DB_HOST=${PLAYEDU_DB_HOST:-mysql}
- DB_PORT=${PLAYEDU_DB_PORT:-3306}
- DB_NAME=${PLAYEDU_DB_NAME:-playedu}
- DB_USER=${PLAYEDU_DB_USER:-root}
- DB_PASS=${PLAYEDU_DB_PASS:-playeduxyz}
- DB_POOL_MIN_IDLE=${PLAYEDU_DB_POOL_MIN_IDLE:-1}
- DB_POOL_MAX_SIZE=${PLAYEDU_DB_POOL_MAX_SIZE:-10}
- DB_POOL_CONN_TIMEOUT=${PLAYEDU_DB_POOL_CONN_TIMEOUT:-30000}
- DB_POOL_IDLE_TIMEOUT=${PLAYEDU_DB_POOL_IDLE_TIMEOUT:-600000}
- DB_POOL_MAX_LIFETIME=${PLAYEDU_DB_POOL_MAX_LIFETIME:-1800000}
- SA_TOKEN_IS_CONCURRENT=${PLAYEDU_SA_TOKEN_IS_CONCURRENT:-false}
- SA_TOKEN_JWT_SECRET_KEY=${PLAYEDU_JWT_KEY:-playeduxyz}
- TZ=${PLAYEDU_TZ:-Asia/Shanghai}
ports:
- "${PLAYEDU_API_PORT:-9700}:9898"
- "${PLAYEDU_PC_PORT:-9800}:9800"
@@ -38,9 +44,9 @@ services:
build: ./docker/mysql
restart: always
environment:
- MYSQL_DATABASE=playedu
- MYSQL_ROOT_PASSWORD=playeduxyz
- TZ=UTC
- MYSQL_DATABASE=${PLAYEDU_DB_NAME:-playedu}
- MYSQL_ROOT_PASSWORD=${PLAYEDU_DB_PASS:-playeduxyz}
- TZ=${PLAYEDU_TZ:-Asia/Shanghai}
volumes:
- mysql-data:/var/lib/mysql
ports:
@@ -1,8 +1,8 @@
server:
port: 9898
port: ${SERVER_PORT:9898}
spring:
profiles:
active: "dev"
active: ${SPRING_PROFILES_ACTIVE:dev}
aop:
auto: true
proxy-target-class: true
@@ -13,14 +13,17 @@ spring:
max-file-size: 10MB
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: "jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
username: ""
password: ""
url: "jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:playedu}?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true"
username: ${DB_USER:root}
password: ${DB_PASS:}
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 1 # 最小连接数
maximum-pool-size: 10 # 最大连接数
auto-commit: true # 自动提交
minimum-idle: ${DB_POOL_MIN_IDLE:1} # 最小连接数
maximum-pool-size: ${DB_POOL_MAX_SIZE:10} # 最大连接数
connection-timeout: ${DB_POOL_CONN_TIMEOUT:30000} # 获取连接超时时间(ms)
idle-timeout: ${DB_POOL_IDLE_TIMEOUT:600000} # 空闲连接超时时间(ms)
max-lifetime: ${DB_POOL_MAX_LIFETIME:1800000} # 连接最大存活时间(ms)
auto-commit: true # 自动提交
# 线程池配置
task:
execution:
@@ -44,9 +47,9 @@ sa-token:
is-print: false
token-name: "Authorization"
timeout: 1296000 #token有效期[单位:秒,默认15天]
is-concurrent: false #限制同时登录
is-concurrent: ${SA_TOKEN_IS_CONCURRENT:false} #限制同时登录
is-share: false
jwt-secret-key: "playeduxyz"
jwt-secret-key: ${SA_TOKEN_JWT_SECRET_KEY:playeduxyz}
token-prefix: "Bearer"
is-log: false
log-level: "warn"