From fd662a61065b89a4070ad80ea077c8973e0e0e10 Mon Sep 17 00:00:00 2001 From: ten <616896861@qq.com> Date: Thu, 14 May 2026 12:44:04 +0800 Subject: [PATCH] Merge pull request #42 from PlayEdu/refactor/env-from-application MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refactor: 后台配置改为直接读取环境变量 --- .cursor/rules/01-project-overview.mdc | 31 ------------- .cursor/rules/02-api-structure.mdc | 32 ------------- .cursor/rules/03-configuration.mdc | 32 ------------- .cursor/rules/04-module-structure.mdc | 46 ------------------- .cursor/rules/05-development-workflow.mdc | 45 ------------------ .cursor/rules/06-security-model.mdc | 33 ------------- .cursor/rules/07-database-structure.mdc | 40 ---------------- .env.example | 29 +++++++++++- .github/SECURITY.md | 4 +- CHANGELOG.md | 3 ++ Dockerfile | 2 +- compose.yml | 24 ++++++---- .../src/main/resources/application.yml | 23 ++++++---- 13 files changed, 62 insertions(+), 282 deletions(-) delete mode 100644 .cursor/rules/01-project-overview.mdc delete mode 100644 .cursor/rules/02-api-structure.mdc delete mode 100644 .cursor/rules/03-configuration.mdc delete mode 100644 .cursor/rules/04-module-structure.mdc delete mode 100644 .cursor/rules/05-development-workflow.mdc delete mode 100644 .cursor/rules/06-security-model.mdc delete mode 100644 .cursor/rules/07-database-structure.mdc diff --git a/.cursor/rules/01-project-overview.mdc b/.cursor/rules/01-project-overview.mdc deleted file mode 100644 index d13ed731..00000000 --- a/.cursor/rules/01-project-overview.mdc +++ /dev/null @@ -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 diff --git a/.cursor/rules/02-api-structure.mdc b/.cursor/rules/02-api-structure.mdc deleted file mode 100644 index ff5fefad..00000000 --- a/.cursor/rules/02-api-structure.mdc +++ /dev/null @@ -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 diff --git a/.cursor/rules/03-configuration.mdc b/.cursor/rules/03-configuration.mdc deleted file mode 100644 index c787d979..00000000 --- a/.cursor/rules/03-configuration.mdc +++ /dev/null @@ -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 diff --git a/.cursor/rules/04-module-structure.mdc b/.cursor/rules/04-module-structure.mdc deleted file mode 100644 index 6bebbf60..00000000 --- a/.cursor/rules/04-module-structure.mdc +++ /dev/null @@ -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. diff --git a/.cursor/rules/05-development-workflow.mdc b/.cursor/rules/05-development-workflow.mdc deleted file mode 100644 index 9b3138e8..00000000 --- a/.cursor/rules/05-development-workflow.mdc +++ /dev/null @@ -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 diff --git a/.cursor/rules/06-security-model.mdc b/.cursor/rules/06-security-model.mdc deleted file mode 100644 index 95d1af99..00000000 --- a/.cursor/rules/06-security-model.mdc +++ /dev/null @@ -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 diff --git a/.cursor/rules/07-database-structure.mdc b/.cursor/rules/07-database-structure.mdc deleted file mode 100644 index 58f30cab..00000000 --- a/.cursor/rules/07-database-structure.mdc +++ /dev/null @@ -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 diff --git a/.env.example b/.env.example index 899d7e9e..ccba2e9e 100644 --- a/.env.example +++ b/.env.example @@ -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 \ No newline at end of file +# 宿主机映射端口 (容器内仍为 3306) +MYSQL_PORT=23307 diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 5b2e0f5b..acccf567 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -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` \ No newline at end of file ++ Contact Email: `tengyongzhi@playeduos.com` \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index c3d81acf..210a84e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/Dockerfile b/Dockerfile index fef28054..e56f032f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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} \ No newline at end of file +CMD nginx; echo "Waiting for MySQL to start..."; sleep 15; java -jar /app/api/app.jar \ No newline at end of file diff --git a/compose.yml b/compose.yml index 035dd684..2715a0e7 100644 --- a/compose.yml +++ b/compose.yml @@ -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: diff --git a/playedu-api/playedu-api/src/main/resources/application.yml b/playedu-api/playedu-api/src/main/resources/application.yml index 54f2ba6a..44c02130 100644 --- a/playedu-api/playedu-api/src/main/resources/application.yml +++ b/playedu-api/playedu-api/src/main/resources/application.yml @@ -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"