From a4aa749cc61863551bb7d1ef08ff88242a032f6a Mon Sep 17 00:00:00 2001
From: Vicky <10212746+haifeng-jiang@user.noreply.gitee.com>
Date: Wed, 14 Oct 2026 18:02:47 +0800
Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E7=9F=AD?=
=?UTF-8?q?=E5=89=A7=E6=9C=8D=E5=8A=A1=E7=AB=AF=EF=BC=88=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E5=90=8E=E5=8F=B0=20API=20+=20=E5=AE=A2=E6=88=B7=E7=AB=AF=20AP?=
=?UTF-8?q?I=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Spring Boot 3.2 / MyBatis-Plus / PostgreSQL,7 个 Maven 模块;含认证鉴权、内容与媒资管理、操作日志,以及客户端 /app/** 接口。
---
.gitignore | 18 +
README.md | 320 +++++++
data/uploads/.gitkeep | 1 +
docs/architecture-design.md | 878 ++++++++++++++++++
pom.xml | 143 +++
reelshort-admin-api/pom.xml | 50 +
.../com/reelshort/ReelShortApplication.java | 14 +
.../admin/controller/AdminUserController.java | 83 ++
.../admin/controller/AuthController.java | 61 ++
.../admin/controller/BannerController.java | 86 ++
.../admin/controller/ConfigController.java | 38 +
.../admin/controller/DictController.java | 40 +
.../controller/DramaCategoryController.java | 61 ++
.../admin/controller/DramaController.java | 120 +++
.../admin/controller/EpisodeController.java | 68 ++
.../admin/controller/MediaController.java | 58 ++
.../admin/controller/MenuController.java | 57 ++
.../controller/OperationLogController.java | 33 +
.../controller/PermissionController.java | 27 +
.../controller/RoleCategoryController.java | 57 ++
.../admin/controller/RoleController.java | 88 ++
.../src/main/resources/application.yml | 53 ++
reelshort-app-api/pom.xml | 36 +
.../com/reelshort/app/AppApiApplication.java | 19 +
.../app/controller/AppCatalogController.java | 38 +
.../app/controller/AppDramaController.java | 31 +
.../app/service/AppCatalogService.java | 211 +++++
.../com/reelshort/app/vo/AppBannerVO.java | 14 +
.../com/reelshort/app/vo/AppCategoryVO.java | 12 +
.../com/reelshort/app/vo/AppDramaCardVO.java | 23 +
.../reelshort/app/vo/AppDramaDetailVO.java | 22 +
.../com/reelshort/app/vo/AppEpisodeVO.java | 23 +
.../java/com/reelshort/app/vo/AppFeedVO.java | 15 +
.../com/reelshort/app/vo/AppPlayTicketVO.java | 20 +
.../com/reelshort/app/vo/AppSectionVO.java | 17 +
.../src/main/resources/application.yml | 43 +
reelshort-common/pom.xml | 16 +
.../reelshort/common/exception/ErrorCode.java | 39 +
.../common/exception/ServiceException.java | 31 +
.../com/reelshort/common/pojo/PageParam.java | 30 +
.../com/reelshort/common/pojo/PageResult.java | 21 +
.../com/reelshort/common/pojo/Result.java | 37 +
reelshort-framework/pom.xml | 68 ++
.../framework/config/MybatisPlusConfig.java | 18 +
.../framework/log/AccessDeniedRecorder.java | 58 ++
.../reelshort/framework/log/OperationLog.java | 21 +
.../framework/log/OperationLogAspect.java | 151 +++
.../framework/log/OperationLogEntry.java | 25 +
.../framework/log/OperationLogSink.java | 9 +
.../security/JwtAuthenticationFilter.java | 51 +
.../framework/security/JwtProperties.java | 17 +
.../framework/security/JwtTokenProvider.java | 67 ++
.../framework/security/LoginUser.java | 13 +
.../framework/security/PermissionChecker.java | 50 +
.../security/PermissionProvider.java | 12 +
.../security/RestAuthEntryPoint.java | 49 +
.../framework/security/SecurityConfig.java | 80 ++
.../framework/security/SecurityUtils.java | 28 +
.../framework/web/GlobalExceptionHandler.java | 84 ++
.../framework/web/SlowRequestLogger.java | 40 +
.../com/reelshort/framework/web/WebUtils.java | 25 +
reelshort-module-content/pom.xml | 27 +
.../content/dal/entity/ContentBanner.java | 36 +
.../reelshort/content/dal/entity/Drama.java | 48 +
.../content/dal/entity/DramaCategory.java | 17 +
.../content/dal/entity/DramaEpisode.java | 38 +
.../content/dal/entity/DramaReviewRecord.java | 23 +
.../dal/mapper/ContentBannerMapper.java | 7 +
.../dal/mapper/DramaCategoryMapper.java | 7 +
.../dal/mapper/DramaEpisodeMapper.java | 7 +
.../content/dal/mapper/DramaMapper.java | 7 +
.../dal/mapper/DramaReviewRecordMapper.java | 7 +
.../content/enums/BannerLinkType.java | 36 +
.../content/enums/BannerPosition.java | 35 +
.../content/enums/ContentStatus.java | 33 +
.../content/service/BannerService.java | 191 ++++
.../content/service/DramaCategoryService.java | 127 +++
.../content/service/DramaService.java | 263 ++++++
.../content/service/EpisodeService.java | 180 ++++
.../reelshort/content/vo/BannerRespVO.java | 26 +
.../reelshort/content/vo/BannerSaveReqVO.java | 22 +
.../content/vo/DramaCategoryRespVO.java | 14 +
.../content/vo/DramaCategorySaveReqVO.java | 14 +
.../reelshort/content/vo/DramaPageReqVO.java | 17 +
.../com/reelshort/content/vo/DramaRespVO.java | 41 +
.../reelshort/content/vo/DramaSaveReqVO.java | 23 +
.../content/vo/DramaStatusReqVO.java | 10 +
.../reelshort/content/vo/EpisodeRespVO.java | 23 +
.../content/vo/EpisodeSaveReqVO.java | 23 +
.../content/vo/EpisodeSortReqVO.java | 13 +
reelshort-module-media/pom.xml | 23 +
.../media/config/MediaProperties.java | 23 +
.../media/config/MediaWebConfig.java | 38 +
.../media/dal/entity/MediaAsset.java | 39 +
.../media/dal/entity/MediaUploadTask.java | 33 +
.../media/dal/mapper/MediaAssetMapper.java | 7 +
.../dal/mapper/MediaUploadTaskMapper.java | 7 +
.../reelshort/media/service/MediaService.java | 169 ++++
.../media/service/MediaStorageService.java | 173 ++++
.../reelshort/media/vo/MediaAssetRespVO.java | 23 +
.../media/vo/UploadCompleteReqVO.java | 14 +
.../reelshort/media/vo/UploadInitReqVO.java | 21 +
.../reelshort/media/vo/UploadInitRespVO.java | 14 +
reelshort-module-system/pom.xml | 23 +
.../system/dal/entity/AdminUser.java | 36 +
.../system/dal/entity/AdminUserRole.java | 25 +
.../com/reelshort/system/dal/entity/Menu.java | 36 +
.../system/dal/entity/OperationLog.java | 31 +
.../system/dal/entity/Permission.java | 19 +
.../com/reelshort/system/dal/entity/Role.java | 32 +
.../system/dal/entity/RoleCategory.java | 28 +
.../reelshort/system/dal/entity/RoleMenu.java | 25 +
.../system/dal/entity/RolePermission.java | 25 +
.../system/dal/entity/SysConfig.java | 17 +
.../system/dal/mapper/AdminUserMapper.java | 7 +
.../dal/mapper/AdminUserRoleMapper.java | 7 +
.../system/dal/mapper/MenuMapper.java | 7 +
.../system/dal/mapper/OperationLogMapper.java | 7 +
.../system/dal/mapper/PermissionMapper.java | 7 +
.../system/dal/mapper/RoleCategoryMapper.java | 7 +
.../system/dal/mapper/RoleMapper.java | 7 +
.../system/dal/mapper/RoleMenuMapper.java | 7 +
.../dal/mapper/RolePermissionMapper.java | 7 +
.../system/dal/mapper/SysConfigMapper.java | 7 +
.../system/service/AdminUserService.java | 197 ++++
.../reelshort/system/service/AuthService.java | 80 ++
.../system/service/ConfigService.java | 49 +
.../reelshort/system/service/MenuService.java | 143 +++
.../system/service/OperationLogService.java | 95 ++
.../system/service/PermissionService.java | 62 ++
.../system/service/RoleCategoryService.java | 90 ++
.../reelshort/system/service/RoleService.java | 236 +++++
.../system/vo/AdminUserPageReqVO.java | 14 +
.../reelshort/system/vo/AdminUserRespVO.java | 27 +
.../system/vo/AdminUserSaveReqVO.java | 24 +
.../com/reelshort/system/vo/ConfigItemVO.java | 13 +
.../com/reelshort/system/vo/LoginReqVO.java | 14 +
.../com/reelshort/system/vo/LoginRespVO.java | 22 +
.../reelshort/system/vo/MenuSaveReqVO.java | 24 +
.../java/com/reelshort/system/vo/MenuVO.java | 40 +
.../system/vo/OperationLogPageReqVO.java | 28 +
.../system/vo/OperationLogRespVO.java | 29 +
.../system/vo/PasswordChangeReqVO.java | 16 +
.../system/vo/PermissionGroupVO.java | 21 +
.../reelshort/system/vo/ProfileRespVO.java | 24 +
.../system/vo/RoleCategoryRespVO.java | 12 +
.../system/vo/RoleCategorySaveReqVO.java | 13 +
.../system/vo/RolePermissionSaveReqVO.java | 13 +
.../com/reelshort/system/vo/RoleRespVO.java | 22 +
.../reelshort/system/vo/RoleSaveReqVO.java | 24 +
sql/data.sql | 191 ++++
sql/schema.sql | 320 +++++++
152 files changed, 8027 insertions(+)
create mode 100644 .gitignore
create mode 100644 README.md
create mode 100644 data/uploads/.gitkeep
create mode 100644 docs/architecture-design.md
create mode 100644 pom.xml
create mode 100644 reelshort-admin-api/pom.xml
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/ReelShortApplication.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/AdminUserController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/AuthController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/BannerController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/ConfigController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/DictController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/DramaCategoryController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/DramaController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/EpisodeController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/MediaController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/MenuController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/OperationLogController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/PermissionController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/RoleCategoryController.java
create mode 100644 reelshort-admin-api/src/main/java/com/reelshort/admin/controller/RoleController.java
create mode 100644 reelshort-admin-api/src/main/resources/application.yml
create mode 100644 reelshort-app-api/pom.xml
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/AppApiApplication.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/controller/AppCatalogController.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/controller/AppDramaController.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/service/AppCatalogService.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppBannerVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppCategoryVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppDramaCardVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppDramaDetailVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppEpisodeVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppFeedVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppPlayTicketVO.java
create mode 100644 reelshort-app-api/src/main/java/com/reelshort/app/vo/AppSectionVO.java
create mode 100644 reelshort-app-api/src/main/resources/application.yml
create mode 100644 reelshort-common/pom.xml
create mode 100644 reelshort-common/src/main/java/com/reelshort/common/exception/ErrorCode.java
create mode 100644 reelshort-common/src/main/java/com/reelshort/common/exception/ServiceException.java
create mode 100644 reelshort-common/src/main/java/com/reelshort/common/pojo/PageParam.java
create mode 100644 reelshort-common/src/main/java/com/reelshort/common/pojo/PageResult.java
create mode 100644 reelshort-common/src/main/java/com/reelshort/common/pojo/Result.java
create mode 100644 reelshort-framework/pom.xml
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/config/MybatisPlusConfig.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/log/AccessDeniedRecorder.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/log/OperationLog.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/log/OperationLogAspect.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/log/OperationLogEntry.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/log/OperationLogSink.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/JwtAuthenticationFilter.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/JwtProperties.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/JwtTokenProvider.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/LoginUser.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/PermissionChecker.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/PermissionProvider.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/RestAuthEntryPoint.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/SecurityConfig.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/security/SecurityUtils.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/web/GlobalExceptionHandler.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/web/SlowRequestLogger.java
create mode 100644 reelshort-framework/src/main/java/com/reelshort/framework/web/WebUtils.java
create mode 100644 reelshort-module-content/pom.xml
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/entity/ContentBanner.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/entity/Drama.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/entity/DramaCategory.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/entity/DramaEpisode.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/entity/DramaReviewRecord.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/mapper/ContentBannerMapper.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/mapper/DramaCategoryMapper.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/mapper/DramaEpisodeMapper.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/mapper/DramaMapper.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/dal/mapper/DramaReviewRecordMapper.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/enums/BannerLinkType.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/enums/BannerPosition.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/enums/ContentStatus.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/service/BannerService.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/service/DramaCategoryService.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/service/DramaService.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/service/EpisodeService.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/BannerRespVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/BannerSaveReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaCategoryRespVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaCategorySaveReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaPageReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaRespVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaSaveReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/DramaStatusReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/EpisodeRespVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/EpisodeSaveReqVO.java
create mode 100644 reelshort-module-content/src/main/java/com/reelshort/content/vo/EpisodeSortReqVO.java
create mode 100644 reelshort-module-media/pom.xml
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/config/MediaProperties.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/config/MediaWebConfig.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/dal/entity/MediaAsset.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/dal/entity/MediaUploadTask.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/dal/mapper/MediaAssetMapper.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/dal/mapper/MediaUploadTaskMapper.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/service/MediaService.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/service/MediaStorageService.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/vo/MediaAssetRespVO.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/vo/UploadCompleteReqVO.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/vo/UploadInitReqVO.java
create mode 100644 reelshort-module-media/src/main/java/com/reelshort/media/vo/UploadInitRespVO.java
create mode 100644 reelshort-module-system/pom.xml
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/AdminUser.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/AdminUserRole.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/Menu.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/OperationLog.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/Permission.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/Role.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/RoleCategory.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/RoleMenu.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/RolePermission.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/entity/SysConfig.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/AdminUserMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/AdminUserRoleMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/MenuMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/OperationLogMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/PermissionMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/RoleCategoryMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/RoleMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/RoleMenuMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/RolePermissionMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/dal/mapper/SysConfigMapper.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/AdminUserService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/AuthService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/ConfigService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/MenuService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/OperationLogService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/PermissionService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/RoleCategoryService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/service/RoleService.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/AdminUserPageReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/AdminUserRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/AdminUserSaveReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/ConfigItemVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/LoginReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/LoginRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/MenuSaveReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/MenuVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/OperationLogPageReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/OperationLogRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/PasswordChangeReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/PermissionGroupVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/ProfileRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/RoleCategoryRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/RoleCategorySaveReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/RolePermissionSaveReqVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/RoleRespVO.java
create mode 100644 reelshort-module-system/src/main/java/com/reelshort/system/vo/RoleSaveReqVO.java
create mode 100644 sql/data.sql
create mode 100644 sql/schema.sql
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..77cf8a9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,18 @@
+# 构建产物
+target/
+
+# IDE / 编辑器
+.idea/
+*.iml
+.vscode/
+
+# 系统文件
+.DS_Store
+
+# 日志
+*.log
+logs/
+
+# 运行期上传的媒资(图片、视频,几百 MB)不入库,只保留目录
+data/uploads/*
+!data/uploads/.gitkeep
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..aca883d
--- /dev/null
+++ b/README.md
@@ -0,0 +1,320 @@
+# ReelShort 短剧服务(后端)
+
+短剧服务的服务端,Spring Boot + PostgreSQL,目前实现管理后台接口(`/admin/**`)。
+完整架构设计与迭代计划见 [docs/architecture-design.md](docs/architecture-design.md)。
+
+| 项 | 版本 |
+| --- | --- |
+| 运行时 | JDK 21(LTS),编译目标 Java 17 |
+| 框架 | Spring Boot 3.2.5、Spring Security 6、MyBatis-Plus 3.5.7 |
+| 数据库 | PostgreSQL 18 |
+| 构建 | Maven 3.10 多模块 |
+
+## 目录结构
+
+```
+java/
+├── reelshort-common/ 统一响应、分页、错误码、业务异常
+├── reelshort-framework/ JWT 鉴权、权限校验、全局异常、MyBatis-Plus、CORS
+├── reelshort-module-system/ 管理员、角色、权限、菜单、角色分类、配置、操作日志
+├── reelshort-module-content/ 短剧、剧集、题材、审核发布
+├── reelshort-admin-api/ 启动模块与 /admin/** 控制器
+├── sql/ schema.sql 建表、data.sql 初始化数据
+└── docs/ 架构设计文档
+```
+
+## 开发环境
+
+本机环境由 Homebrew 统一管理(版本以本机实际安装为准):
+
+| 组件 | 版本 | 说明 |
+| --- | --- | --- |
+| Homebrew | 7.0.9 | 远端指向清华镜像,见文末常见问题 |
+| JDK | OpenJDK 21.0.12.1 | `brew install openjdk@21`,`JAVA_HOME` 已写入 `~/.zshrc` |
+| Maven | 3.10.0 | `brew install maven`,命令为 `/opt/homebrew/bin/mvn` |
+| PostgreSQL | 18.6 | `brew install postgresql@18`,`brew services start postgresql@18` 启动 |
+
+> `postgresql@18` 是 keg-only,命令行工具在 `/opt/homebrew/opt/postgresql@18/bin`,
+> 用之前把它加到 PATH:`export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"`。
+
+```sh
+java -version # openjdk 21.0.12.1
+mvn -v # Maven 3.10.0 / Java 21.0.12.1
+```
+
+说明:
+
+- 工程编译目标为 Java 17(`maven.compiler.release=17`),在 JDK 21 上构建与运行。
+- 父 POM 显式声明了注解处理器(`full` + `annotationProcessorPaths`):
+ JDK 23 起不再默认扫描 classpath 上的处理器,缺这段配置 Lombok 会失效。
+- 旧的 JDK 18 仍留在 `/Library/Java/JavaVirtualMachines/jdk-18.0.2.jdk`,删除需要 sudo,
+ 不影响使用(`java_home` 与 `JAVA_HOME` 都已指向 21)。
+
+## 快速开始
+
+服务有两个入口,可以只启动其中一个:
+
+| 服务 | 模块 | 端口 | 面向 |
+| --- | --- | --- | --- |
+| 管理端 | `reelshort-admin-api` | 8080 | Vue 后台 |
+| 客户端 | `reelshort-app-api` | 8081 | Flutter 客户端 |
+
+### 1. 初始化数据库
+
+```sh
+export PATH="/opt/homebrew/opt/postgresql@18/bin:$PATH"
+cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
+psql -h 127.0.0.1 -U reelshort -d reelshort -f sql/schema.sql
+psql -h 127.0.0.1 -U reelshort -d reelshort -f sql/data.sql
+```
+
+数据库名 `reelshort`,角色 `reelshort`(密码 `reelshort`),两个脚本都可重复执行。
+首次搭建环境时先建角色与库:
+
+```sh
+psql -d postgres -c "CREATE ROLE reelshort LOGIN PASSWORD 'reelshort';"
+psql -d postgres -c "CREATE DATABASE reelshort OWNER reelshort ENCODING 'UTF8';"
+```
+
+连接信息在
+`reelshort-admin-api/src/main/resources/application.yml`,可用环境变量
+`DB_USER` / `DB_PASSWORD` / `JWT_ADMIN_SECRET` 覆盖。
+
+### 关于 PostgreSQL 的两点说明
+
+- 自增列用 `GENERATED BY DEFAULT AS IDENTITY`;`sql/data.sql` 里用了显式 ID,
+ 脚本末尾会把序列 `setval` 到当前最大值,新增数据不会主键冲突。
+- PostgreSQL 没有 `ON UPDATE CURRENT_TIMESTAMP`,`updated_at` 由 `set_updated_at()`
+ 触发器统一维护(见 `sql/schema.sql` 末尾),实体侧仍不参与更新该字段。
+- 轮播图的展示位置列名叫 `slot`(`position` 在 PostgreSQL 里是关键字),
+ 实体用 `@TableField("slot")` 映射,对外接口字段仍是 `position`,前端无需改动。
+
+### 2. 构建
+
+```sh
+cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
+mvn -DskipTests package
+```
+
+### 3. 启动
+
+```sh
+cd /Users/jianghaifeng/Desktop/ReelShort/FruitServer
+java -jar reelshort-admin-api/target/reelshort-admin-api-1.0.0-SNAPSHOT.jar
+java -jar reelshort-app-api/target/reelshort-app-api-1.0.0-SNAPSHOT.jar
+```
+
+启动后:服务地址 `http://localhost:8080`,接口文档 `http://localhost:8080/doc.html`。
+
+## 默认账号
+
+密码均为 `admin123`。
+
+| 账号 | 角色 | 权限范围 |
+| --- | --- | --- |
+| admin | 超级管理员 | 全部 14 项权限 |
+| content.editor01 | 内容运营 | 短剧、剧集的增删改与封面上传 |
+| content.reviewer01 | 审核专员 | 查看内容、审核发布、数据报表 |
+| data.analyst01 | 数据分析师 | 查看短剧列表与数据报表 |
+
+## 接口一览
+
+### 认证 `/admin/auth`
+
+| 方法 | 路径 | 说明 |
+| --- | --- | --- |
+| POST | `/login` | 登录,返回 token 与权限码 |
+| GET | `/menus` | 当前用户菜单路由树(前端动态路由) |
+| GET | `/profile` | 当前登录人信息 |
+| POST | `/logout` | 登出(JWT 无状态,前端清除 token 即可) |
+| POST | `/password` | 修改自己的密码 |
+
+### 后台管理
+
+| 模块 | 接口 |
+| --- | --- |
+| 管理员 | `GET /admin/admin-users/page`、`POST /admin/admin-users`、`PUT\|DELETE /admin/admin-users/{id}`、`PUT /{id}/status`、`PUT /{id}/password` |
+| 角色 | `GET /admin/roles/page`、`GET /admin/roles/list`、`POST /admin/roles`、`PUT\|DELETE /admin/roles/{id}`、`GET\|PUT /admin/roles/{id}/permissions` |
+| 角色分类 | `GET\|POST /admin/role-categories`、`PUT\|DELETE /admin/role-categories/{id}` |
+| 权限点 | `GET /admin/permissions`(按分组返回,供权限配置页使用) |
+| 菜单 | `GET /admin/menus/tree`、`POST /admin/menus`、`PUT\|DELETE /admin/menus/{id}` |
+| 系统配置 | `GET\|PUT /admin/configs` |
+| 操作日志 | `GET /admin/operation-logs/page`(按操作人、模块、动作、结果、时间范围筛选)、`GET /admin/operation-logs/{id}` |
+| 字典 | `GET /admin/dicts/drama-category`、`GET /admin/dicts/content-status` |
+
+### 内容管理
+
+| 模块 | 接口 |
+| --- | --- |
+| 短剧 | `GET /admin/dramas/page`、`GET /admin/dramas/{id}`、`POST /admin/dramas`、`PUT\|DELETE /admin/dramas/{id}` |
+| 审核发布 | `POST /admin/dramas/{id}/submit`、`/approve`、`/reject`、`/publish`、`/offline` |
+| 审核记录 | `GET /admin/dramas/{id}/review-records` |
+| 剧集 | `GET /admin/episodes?dramaId=`、`POST /admin/episodes`、`PUT\|DELETE /admin/episodes/{id}`、`PUT /admin/episodes/sort` |
+| 轮播图 | `GET /admin/banners/page`、`POST /admin/banners`、`PUT\|DELETE /admin/banners/{id}`、`PUT /admin/banners/{id}/status`、`PUT /admin/banners/sort` |
+| 短剧类型 | `GET\|POST /admin/drama-categories`、`PUT\|DELETE /admin/drama-categories/{id}`(权限沿用 `drama:*`) |
+
+### 媒资 `/admin/media`
+
+| 方法 | 路径 | 说明 |
+| --- | --- | --- |
+| POST | `/upload/init` | 建立分片会话,返回 `uploadId`、`chunkSize`、`totalChunks` |
+| POST | `/upload/chunk` | 上传单个分片(multipart:`uploadId`、`index`、`file`) |
+| POST | `/upload/complete` | 合并分片,返回媒资(含可访问的 `url`) |
+| GET | `/{id}` | 查询媒资 |
+
+## 媒资存储(本地)
+
+当前没有对象存储,文件直接落在本机磁盘:
+
+| 项 | 默认值 | 说明 |
+| --- | --- | --- |
+| 存储目录 | `./data/uploads` | 配置项 `reelshort.media.root-dir`,按 `业务类型/年月/uuid.ext` 分目录 |
+| 访问前缀 | `/files/**` | 配置项 `reelshort.media.public-prefix`,映射为静态资源 |
+| 分片大小 | 5MB | `reelshort.media.chunk-size`,单文件上限 2GB |
+| 请求上限 | 20MB | `spring.servlet.multipart`,只需容纳一个分片 |
+
+要点:
+
+- `/files/**` 在 `SecurityConfig` 里是公开路径,因为 `
` / `