Explorar el Código

feat(system): 添加文件分类和文件信息相关功能

- 新增文件分类(FileCategory)和文件信息(FileInfo)的实体类、BO、VO、Mapper、Service、Controller- 实现文件分类和文件信息的增删改查、导出、树形结构查询等功能
- 优化文件下载逻辑,支持直接下载和OSS服务下载
- 添加调试日志,方便问题排查
zhou hace 2 semanas
padre
commit
39375b4380
Se han modificado 37 ficheros con 3905 adiciones y 2 borrados
  1. 4 2
      ruoyi-admin/src/main/resources/application-dev.yml
  2. 132 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/FileCategoryController.java
  3. 171 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/FileInfoController.java
  4. 205 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavBottomIconController.java
  5. 138 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavBottomMainController.java
  6. 156 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavServiceToolbarController.java
  7. 78 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/FileCategory.java
  8. 148 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/FileInfo.java
  9. 124 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavBottomIcon.java
  10. 76 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavBottomMain.java
  11. 84 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavServiceToolbar.java
  12. 71 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/FileCategoryBo.java
  13. 141 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/FileInfoBo.java
  14. 117 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavBottomIconBo.java
  15. 77 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavBottomMainBo.java
  16. 77 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavServiceToolbarBo.java
  17. 93 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/FileCategoryVo.java
  18. 177 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/FileInfoVo.java
  19. 155 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavBottomIconVo.java
  20. 137 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavBottomMainVo.java
  21. 99 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavServiceToolbarVo.java
  22. 15 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/FileCategoryMapper.java
  23. 15 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/FileInfoMapper.java
  24. 43 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavBottomIconMapper.java
  25. 26 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavBottomMainMapper.java
  26. 15 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavServiceToolbarMapper.java
  27. 58 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IFileCategoryService.java
  28. 73 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IFileInfoService.java
  29. 99 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavBottomIconService.java
  30. 83 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavBottomMainService.java
  31. 59 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavServiceToolbarService.java
  32. 149 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/FileCategoryServiceImpl.java
  33. 271 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/FileInfoServiceImpl.java
  34. 194 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavBottomIconServiceImpl.java
  35. 161 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavBottomMainServiceImpl.java
  36. 142 0
      ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavServiceToolbarServiceImpl.java
  37. 42 0
      ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/VsNavBottomMainMapper.xml

+ 4 - 2
ruoyi-admin/src/main/resources/application-dev.yml

@@ -49,9 +49,11 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://192.168.1.146:3306/game_event?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+#          url: jdbc:mysql://192.168.1.146:3306/game_event?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+          url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
           username: root
-          password: P@ssw0rd
+#          password: P@ssw0rd
+          password: 123456
 #        # 从库数据源
 #        slave:
 #          lazy: true

+ 132 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/FileCategoryController.java

@@ -0,0 +1,132 @@
+package org.dromara.system.controller;
+
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.FileCategoryVo;
+import org.dromara.system.domain.bo.FileCategoryBo;
+import org.dromara.system.service.IFileCategoryService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 文件分类
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/file/category")
+public class FileCategoryController extends BaseController {
+
+    private final IFileCategoryService fileCategoryService;
+
+    /**
+     * 查询文件分类列表
+     */
+    @SaCheckPermission("file:category:list")
+    @GetMapping("/list")
+    public TableDataInfo<FileCategoryVo> list(FileCategoryBo bo, PageQuery pageQuery) {
+        return fileCategoryService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 查询文件分类列表
+     */
+    @SaCheckPermission("file:category:list")
+    @GetMapping("/listAll")
+    public R<List<FileCategoryVo>> listAll(FileCategoryBo bo) {
+        List<FileCategoryVo> list = fileCategoryService.queryList(bo);
+        return R.ok(list);
+    }
+
+    /**
+     * 查询文件分类树结构
+     */
+    @SaCheckPermission("file:category:list")
+    @GetMapping("/tree")
+    public R<List<FileCategoryVo>> tree() {
+        List<FileCategoryVo> tree = fileCategoryService.queryCategoryTree();
+        return R.ok(tree);
+    }
+
+    /**
+     * 根据类型查询分类列表
+     */
+    @SaCheckPermission("file:category:list")
+    @GetMapping("/type/{type}")
+    public R<List<FileCategoryVo>> listByType(@PathVariable Integer type) {
+        List<FileCategoryVo> list = fileCategoryService.queryByType(type);
+        return R.ok(list);
+    }
+
+    /**
+     * 导出文件分类列表
+     */
+    @SaCheckPermission("file:category:export")
+    @Log(title = "文件分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(FileCategoryBo bo, HttpServletResponse response) {
+        List<FileCategoryVo> list = fileCategoryService.queryList(bo);
+        ExcelUtil.exportExcel(list, "文件分类", FileCategoryVo.class, response);
+    }
+
+    /**
+     * 获取文件分类详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("file:category:query")
+    @GetMapping("/{id}")
+    public R<FileCategoryVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(fileCategoryService.queryById(id));
+    }
+
+    /**
+     * 新增文件分类
+     */
+    @SaCheckPermission("file:category:add")
+    @Log(title = "文件分类", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody FileCategoryBo bo) {
+        return toAjax(fileCategoryService.insertByBo(bo));
+    }
+
+    /**
+     * 修改文件分类
+     */
+    @SaCheckPermission("file:category:edit")
+    @Log(title = "文件分类", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody FileCategoryBo bo) {
+        return toAjax(fileCategoryService.updateByBo(bo));
+    }
+
+    /**
+     * 删除文件分类
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("file:category:remove")
+    @Log(title = "文件分类", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(fileCategoryService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 171 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/FileInfoController.java

@@ -0,0 +1,171 @@
+package org.dromara.system.controller;
+
+import java.io.IOException;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.FileInfoVo;
+import org.dromara.system.domain.bo.FileInfoBo;
+import org.dromara.system.service.IFileInfoService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 文件信息
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/file/info")
+public class FileInfoController extends BaseController {
+
+    private final IFileInfoService fileInfoService;
+
+    /**
+     * 查询文件信息列表
+     */
+    @SaCheckPermission("file:info:list")
+    @GetMapping("/list")
+    public TableDataInfo<FileInfoVo> list(FileInfoBo bo, PageQuery pageQuery) {
+        // 添加调试日志
+        System.out.println("FileInfoController.list - bo.getCategoryType(): " + bo.getCategoryType());
+        System.out.println("FileInfoController.list - bo.getCategoryId(): " + bo.getCategoryId());
+        return fileInfoService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 查询文件信息列表
+     */
+    @SaCheckPermission("file:info:list")
+    @GetMapping("/listAll")
+    public R<List<FileInfoVo>> listAll(FileInfoBo bo) {
+        List<FileInfoVo> list = fileInfoService.queryList(bo);
+        return R.ok(list);
+    }
+
+    /**
+     * 根据分类ID查询文件列表
+     */
+    @SaCheckPermission("file:info:list")
+    @GetMapping("/category/{categoryId}")
+    public R<List<FileInfoVo>> listByCategoryId(@PathVariable Long categoryId) {
+        List<FileInfoVo> list = fileInfoService.queryByCategoryId(categoryId);
+        return R.ok(list);
+    }
+
+    /**
+     * 根据文件类型查询文件列表
+     */
+    @SaCheckPermission("file:info:list")
+    @GetMapping("/type/{type}")
+    public R<List<FileInfoVo>> listByType(@PathVariable String type) {
+        List<FileInfoVo> list = fileInfoService.queryByType(type);
+        return R.ok(list);
+    }
+
+    /**
+     * 导出文件信息列表
+     */
+    @SaCheckPermission("file:info:export")
+    @Log(title = "文件信息", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(FileInfoBo bo, HttpServletResponse response) {
+        List<FileInfoVo> list = fileInfoService.queryList(bo);
+        ExcelUtil.exportExcel(list, "文件信息", FileInfoVo.class, response);
+    }
+
+    /**
+     * 获取文件信息详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("file:info:query")
+    @GetMapping("/{id}")
+    public R<FileInfoVo> getInfo(@NotNull(message = "主键不能为空")
+                                 @PathVariable Long id) {
+        return R.ok(fileInfoService.queryById(id));
+    }
+
+    /**
+     * 新增文件信息
+     */
+    @SaCheckPermission("file:info:add")
+    @Log(title = "文件信息", businessType = BusinessType.INSERT)
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody FileInfoBo bo) {
+        return toAjax(fileInfoService.insertByBo(bo));
+    }
+
+    /**
+     * 修改文件信息
+     */
+    @SaCheckPermission("file:info:edit")
+    @Log(title = "文件信息", businessType = BusinessType.UPDATE)
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody FileInfoBo bo) {
+        return toAjax(fileInfoService.updateByBo(bo));
+    }
+
+    /**
+     * 删除文件信息
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("file:info:remove")
+    @Log(title = "文件信息", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(fileInfoService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 更新文件下载次数
+     */
+    @SaCheckPermission("file:info:update")
+    @Log(title = "文件信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/download/{id}")
+    public R<Void> updateDownloadCount(@NotNull(message = "主键不能为空")
+                                       @PathVariable Long id) {
+        return toAjax(fileInfoService.updateDownloadCount(id));
+    }
+
+    /**
+     * 更新文件查看次数
+     */
+    @SaCheckPermission("file:info:update")
+    @Log(title = "文件信息", businessType = BusinessType.UPDATE)
+    @PutMapping("/view/{id}")
+    public R<Void> updateViewCount(@NotNull(message = "主键不能为空")
+                                   @PathVariable Long id) {
+        return toAjax(fileInfoService.updateViewCount(id));
+    }
+
+    /**
+     * 下载文件
+     *
+     * @param id 文件ID
+     */
+    @SaCheckPermission("file:info:download")
+    @GetMapping("/download/{id}")
+    public void downloadFile(@NotNull(message = "文件ID不能为空")
+                            @PathVariable Long id,
+                            HttpServletResponse response) throws IOException {
+        fileInfoService.downloadFile(id, response);
+    }
+}

+ 205 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavBottomIconController.java

@@ -0,0 +1,205 @@
+package org.dromara.system.controller;
+
+import java.io.IOException;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.VsNavBottomIconVo;
+import org.dromara.system.domain.bo.VsNavBottomIconBo;
+import org.dromara.system.service.IVsNavBottomIconService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 底部图标导航表管理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/scenic/navBottomIcon")
+public class VsNavBottomIconController extends BaseController {
+
+    private final IVsNavBottomIconService vsNavBottomIconService;
+
+    /**
+     * 查询底部图标导航表列表
+     */
+    @SaCheckPermission("scenic:navBottomIcon:list")
+    @GetMapping("/list")
+    public TableDataInfo<VsNavBottomIconVo> list(VsNavBottomIconBo bo, PageQuery pageQuery) {
+        return vsNavBottomIconService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出底部图标导航表列表
+     */
+    @SaCheckPermission("scenic:navBottomIcon:export")
+    @Log(title = "底部图标导航表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(VsNavBottomIconBo bo, HttpServletResponse response) {
+        try {
+            List<VsNavBottomIconVo> list = vsNavBottomIconService.queryList(bo);
+            ExcelUtil.exportExcel(list, "底部图标导航表", VsNavBottomIconVo.class, response);
+        } catch (Exception e) {
+            // 如果导出过程中出现异常,重置Content-Type并返回错误信息
+            response.reset();
+            response.setContentType("application/json;charset=UTF-8");
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            try {
+                response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:" + e.getMessage() + "\"}");
+            } catch (IOException ex) {
+                // 忽略写入错误
+            }
+        }
+    }
+
+    /**
+     * 获取底部图标导航表详细信息
+     *
+     * @param iconId 主键
+     */
+    @SaCheckPermission("scenic:navBottomIcon:query")
+    @GetMapping("/{iconId}")
+    public R<VsNavBottomIconVo> getInfo(@NotNull(message = "主键不能为空")
+                                        @PathVariable Long iconId) {
+        return R.ok(vsNavBottomIconService.queryById(iconId));
+    }
+
+    /**
+     * 新增底部图标导航表
+     */
+    @SaCheckPermission("scenic:navBottomIcon:add")
+    @Log(title = "底部图标导航表", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody VsNavBottomIconBo bo) {
+        return toAjax(vsNavBottomIconService.insertByBo(bo));
+    }
+
+    /**
+     * 修改底部图标导航表
+     */
+    @SaCheckPermission("scenic:navBottomIcon:edit")
+    @Log(title = "底部图标导航表", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody VsNavBottomIconBo bo) {
+        return toAjax(vsNavBottomIconService.updateByBo(bo));
+    }
+
+    /**
+     * 删除底部图标导航表
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("scenic:navBottomIcon:remove")
+    @Log(title = "底部图标导航表", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(vsNavBottomIconService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 获取启用的底部图标导航列表
+     */
+    @GetMapping("/enabled")
+    public R<List<VsNavBottomIconVo>> getEnabledIconList() {
+        return R.ok(vsNavBottomIconService.getEnabledIconList());
+    }
+
+    /**
+     * 根据业务类型获取图标导航列表
+     */
+    @GetMapping("/byBizType/{bizType}")
+    public R<List<VsNavBottomIconVo>> getIconListByBizType(@PathVariable Integer bizType) {
+        return R.ok(vsNavBottomIconService.getIconListByBizType(bizType));
+    }
+
+    /**
+     * 保存颜色设置
+     */
+    @PostMapping("/colorSettings")
+    public R<Void> saveColorSettings(@RequestBody ColorSettingsRequest request) {
+        return toAjax(vsNavBottomIconService.saveColorSettings(request.getSelectedTextColor(), request.getUnselectedTextColor()));
+    }
+
+    /**
+     * 获取颜色设置
+     */
+    @GetMapping("/colorSettings")
+    public R<java.util.Map<String, String>> getColorSettings() {
+        return R.ok(vsNavBottomIconService.getColorSettings());
+    }
+
+    /**
+     * 颜色设置请求对象
+     */
+    public static class ColorSettingsRequest {
+        private String selectedTextColor;
+        private String unselectedTextColor;
+
+        public String getSelectedTextColor() {
+            return selectedTextColor;
+        }
+
+        public void setSelectedTextColor(String selectedTextColor) {
+            this.selectedTextColor = selectedTextColor;
+        }
+
+        public String getUnselectedTextColor() {
+            return unselectedTextColor;
+        }
+
+        public void setUnselectedTextColor(String unselectedTextColor) {
+            this.unselectedTextColor = unselectedTextColor;
+        }
+    }
+
+    /**
+     * 颜色设置响应对象
+     */
+    public static class ColorSettingsResponse {
+        private String selectedTextColor;
+        private String unselectedTextColor;
+
+        public ColorSettingsResponse(String selectedTextColor, String unselectedTextColor) {
+            this.selectedTextColor = selectedTextColor;
+            this.unselectedTextColor = unselectedTextColor;
+        }
+
+        public String getSelectedTextColor() {
+            return selectedTextColor;
+        }
+
+        public void setSelectedTextColor(String selectedTextColor) {
+            this.selectedTextColor = selectedTextColor;
+        }
+
+        public String getUnselectedTextColor() {
+            return unselectedTextColor;
+        }
+
+        public void setUnselectedTextColor(String unselectedTextColor) {
+            this.unselectedTextColor = unselectedTextColor;
+        }
+    }
+}

+ 138 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavBottomMainController.java

@@ -0,0 +1,138 @@
+package org.dromara.system.controller;
+
+import java.io.IOException;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.VsNavBottomMainVo;
+import org.dromara.system.domain.bo.VsNavBottomMainBo;
+import org.dromara.system.service.IVsNavBottomMainService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 底部主导航表管理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/scenic/navBottomMain")
+public class VsNavBottomMainController extends BaseController {
+
+    private final IVsNavBottomMainService vsNavBottomMainService;
+
+    /**
+     * 查询底部主导航表列表
+     */
+    @SaCheckPermission("scenic:navBottomMain:list")
+    @GetMapping("/list")
+    public TableDataInfo<VsNavBottomMainVo> list(VsNavBottomMainBo bo, PageQuery pageQuery) {
+        return vsNavBottomMainService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出底部主导航表列表
+     */
+    @SaCheckPermission("scenic:navBottomMain:export")
+    @Log(title = "底部主导航表", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(VsNavBottomMainBo bo, HttpServletResponse response) {
+        try {
+            List<VsNavBottomMainVo> list = vsNavBottomMainService.queryList(bo);
+            ExcelUtil.exportExcel(list, "底部主导航表", VsNavBottomMainVo.class, response);
+        } catch (Exception e) {
+            // 如果导出过程中出现异常,重置Content-Type并返回错误信息
+            response.reset();
+            response.setContentType("application/json;charset=UTF-8");
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            try {
+                response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:" + e.getMessage() + "\"}");
+            } catch (IOException ex) {
+                // 忽略写入错误
+            }
+        }
+    }
+
+    /**
+     * 获取底部主导航表详细信息
+     *
+     * @param navId 主键
+     */
+    @SaCheckPermission("scenic:navBottomMain:query")
+    @GetMapping("/{navId}")
+    public R<VsNavBottomMainVo> getInfo(@NotNull(message = "主键不能为空")
+                                        @PathVariable Long navId) {
+        return R.ok(vsNavBottomMainService.queryById(navId));
+    }
+
+    /**
+     * 新增底部主导航表
+     */
+    @SaCheckPermission("scenic:navBottomMain:add")
+    @Log(title = "底部主导航表", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody VsNavBottomMainBo bo) {
+        return toAjax(vsNavBottomMainService.insertByBo(bo));
+    }
+
+    /**
+     * 修改底部主导航表
+     */
+    @SaCheckPermission("scenic:navBottomMain:edit")
+    @Log(title = "底部主导航表", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody VsNavBottomMainBo bo) {
+        return toAjax(vsNavBottomMainService.updateByBo(bo));
+    }
+
+    /**
+     * 删除底部主导航表
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("scenic:navBottomMain:remove")
+    @Log(title = "底部主导航表", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(vsNavBottomMainService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 获取启用的底部主导航列表
+     */
+    @GetMapping("/enabled")
+    public R<List<VsNavBottomMainVo>> getEnabledNavList() {
+        return R.ok(vsNavBottomMainService.getEnabledNavList());
+    }
+
+
+    /**
+     * 根据类型获取导航列表
+     */
+    @GetMapping("/byType/{type}")
+    @SaCheckPermission("scenic:navBottomMain:queryById")
+    public R<List<VsNavBottomMainVo>> getNavListByType(@PathVariable String type) {
+        return R.ok(vsNavBottomMainService.getNavListByType(type));
+    }
+}

+ 156 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/controller/VsNavServiceToolbarController.java

@@ -0,0 +1,156 @@
+package org.dromara.system.controller;
+
+import java.io.IOException;
+import java.util.List;
+
+import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import org.dromara.common.idempotent.annotation.RepeatSubmit;
+import org.dromara.common.log.annotation.Log;
+import org.dromara.common.web.core.BaseController;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.core.domain.R;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.log.enums.BusinessType;
+import org.dromara.common.excel.utils.ExcelUtil;
+import org.dromara.system.domain.vo.VsNavServiceToolbarVo;
+import org.dromara.system.domain.bo.VsNavServiceToolbarBo;
+import org.dromara.system.service.IVsNavServiceToolbarService;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 服务区工具栏管理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/scenic/navServiceToolbar")
+public class VsNavServiceToolbarController extends BaseController {
+
+    private final IVsNavServiceToolbarService vsNavServiceToolbarService;
+
+    /**
+     * 查询服务区工具栏列表
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:list")
+    @GetMapping("/list")
+    public TableDataInfo<VsNavServiceToolbarVo> list(VsNavServiceToolbarBo bo, PageQuery pageQuery) {
+        return vsNavServiceToolbarService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 导出服务区工具栏列表
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:export")
+    @Log(title = "服务区工具栏", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(VsNavServiceToolbarBo bo, HttpServletResponse response) {
+        try {
+            List<VsNavServiceToolbarVo> list = vsNavServiceToolbarService.queryList(bo);
+            ExcelUtil.exportExcel(list, "服务区工具栏", VsNavServiceToolbarVo.class, response);
+        } catch (Exception e) {
+            // 如果导出过程中出现异常,重置Content-Type并返回错误信息
+            response.reset();
+            response.setContentType("application/json;charset=UTF-8");
+            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+            try {
+                response.getWriter().write("{\"code\":500,\"msg\":\"导出失败:" + e.getMessage() + "\"}");
+            } catch (IOException ex) {
+                // 忽略写入错误
+            }
+        }
+    }
+
+    /**
+     * 获取服务区工具栏详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:query")
+    @GetMapping("/{id}")
+    public R<VsNavServiceToolbarVo> getInfo(@NotNull(message = "主键不能为空")
+                                            @PathVariable Long id) {
+        return R.ok(vsNavServiceToolbarService.queryById(id));
+    }
+
+    /**
+     * 新增服务区工具栏
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:add")
+    @Log(title = "服务区工具栏", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody VsNavServiceToolbarBo bo) {
+        return toAjax(vsNavServiceToolbarService.insertByBo(bo));
+    }
+
+    /**
+     * 修改服务区工具栏
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:edit")
+    @Log(title = "服务区工具栏", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody VsNavServiceToolbarBo bo) {
+        return toAjax(vsNavServiceToolbarService.updateByBo(bo));
+    }
+
+    /**
+     * 删除服务区工具栏
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:remove")
+    @Log(title = "服务区工具栏", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(vsNavServiceToolbarService.deleteWithValidByIds(List.of(ids), true));
+    }
+
+    /**
+     * 根据分类ID查询工具栏列表
+     *
+     * @param categoryId 分类ID
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:list")
+    @GetMapping("/byCategory/{categoryId}")
+    public R<List<VsNavServiceToolbarVo>> getToolbarListByCategory(@NotNull(message = "分类ID不能为空")
+                                                                   @PathVariable Integer categoryId) {
+        return R.ok(vsNavServiceToolbarService.queryByCategoryIdOrderBySort(categoryId));
+    }
+
+    /**
+     * 获取所有分类的工具栏列表
+     */
+    @SaCheckPermission("scenic:navServiceToolbar:list")
+    @GetMapping("/allCategories")
+    public R<List<VsNavServiceToolbarVo>> getAllCategoriesToolbar() {
+        // 查询所有分类的工具栏,按分类ID和排序号排序
+        VsNavServiceToolbarBo bo = new VsNavServiceToolbarBo();
+        bo.setStatus(0); // 只查询正常状态
+        bo.setShowFlag(0); // 只查询显示状态
+        List<VsNavServiceToolbarVo> list = vsNavServiceToolbarService.queryList(bo);
+
+        // 按分类ID和排序号排序
+        list.sort((a, b) -> {
+            int categoryCompare = Integer.compare(a.getCategoryId(), b.getCategoryId());
+            if (categoryCompare != 0) {
+                return categoryCompare;
+            }
+            return Integer.compare(a.getSortNum(), b.getSortNum());
+        });
+
+        return R.ok(list);
+    }
+}

+ 78 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/FileCategory.java

@@ -0,0 +1,78 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.github.linpeilie.annotations.AutoMapper;
+
+import java.io.Serial;
+
+/**
+ * 文件分类对象 file_category
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("common_file_category")
+@AutoMapper(target = org.dromara.system.domain.vo.FileCategoryVo.class)
+public class FileCategory extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分类ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 分类编码
+     */
+    private String code;
+
+    /**
+     * 父分类ID(0表示顶级分类)
+     */
+    private Long parentId;
+
+    /**
+     * 分类类型(1图片 2视频 3音频 4文档 5其他)
+     */
+    private Integer type;
+
+    /**
+     * 排序号
+     */
+    private Integer sort;
+
+    /**
+     * 分类图标
+     */
+    private String icon;
+
+    /**
+     * 分类描述
+     */
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private Long delFlag;
+
+}

+ 148 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/FileInfo.java

@@ -0,0 +1,148 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.github.linpeilie.annotations.AutoMapper;
+
+import java.io.Serial;
+
+/**
+ * 文件信息对象 file_info
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("common_file_info")
+@AutoMapper(target = org.dromara.system.domain.vo.FileInfoVo.class)
+public class FileInfo extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 文件ID
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 文件名称
+     */
+    private String name;
+
+    /**
+     * 原始文件名
+     */
+    private String originalName;
+
+    /**
+     * 文件路径(OSS路径)
+     */
+    private String path;
+
+    /**
+     * 文件访问URL
+     */
+    private String url;
+
+    /**
+     * 文件大小(字节)
+     */
+    private Long size;
+
+    /**
+     * 文件类型(MIME类型)
+     */
+    private String type;
+
+    /**
+     * 文件扩展名
+     */
+    private String extension;
+
+    /**
+     * 文件分类ID
+     */
+    private Long categoryId;
+
+    /**
+     * 文件主分类
+     */
+    private Long categoryType;
+
+    /**
+     * 文件分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 文件哈希值(MD5)
+     */
+    private String hash;
+
+    /**
+     * 图片/视频宽度
+     */
+    private Integer width;
+
+    /**
+     * 图片/视频高度
+     */
+    private Integer height;
+
+    /**
+     * 视频/音频时长(秒)
+     */
+    private Integer duration;
+
+    /**
+     * OSS存储桶名称
+     */
+    private String ossBucket;
+
+    /**
+     * OSS对象键
+     */
+    private String ossKey;
+
+    /**
+     * OSS文件唯一标识符
+     */
+    private String ossId;
+
+    /**
+     * 上传状态(0上传中 1上传完成 2上传失败)
+     */
+    private Integer uploadStatus;
+
+    /**
+     * 下载次数
+     */
+    private Integer downloadCount;
+
+    /**
+     * 查看次数
+     */
+    private Integer viewCount;
+
+    /**
+     * 是否公开(0私有 1公开)
+     */
+    private Integer isPublic;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    @TableLogic
+    private Long delFlag;
+
+}

+ 124 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavBottomIcon.java

@@ -0,0 +1,124 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.github.linpeilie.annotations.AutoMapper;
+
+import java.io.Serial;
+
+/**
+ * 底部图标导航表 vs_nav_bottom_icon
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("common_vs_nav_bottom_icon")
+@AutoMapper(target = org.dromara.system.domain.vo.VsNavBottomIconVo.class)
+public class VsNavBottomIcon extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 图标导航ID
+     */
+    @TableId(value = "icon_id", type = IdType.AUTO)
+    private Long iconId;
+
+    /**
+     * 未选中文字
+     */
+    private String textUnselected;
+
+    /**
+     * 选中文字颜色
+     */
+    @TableField("text_selected_color")
+    private String textSelectedColor;
+
+    /**
+     * 未选中文字颜色
+     */
+    @TableField("text_unselected_color")
+    private String textUnselectedColor;
+
+    /**
+     * 未选中图标
+     */
+    private String iconUnselected;
+
+    /**
+     * 选中图标
+     */
+    private String iconSelected;
+
+    /**
+     * 跳转类型
+     */
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 排序号
+     */
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 图片
+     */
+    private String pic;
+
+    /**
+     * 图标跳转类型
+     */
+    private String jumpTypeIcon;
+
+    /**
+     * 打开方式
+     */
+    private String openType;
+
+    /**
+     * 应用ID
+     */
+    @TableField("appId")
+    private String appId;
+
+    /**
+     * 二维码URL
+     */
+    private String qrCodeUrl;
+
+    /**
+     * 页面ID
+     */
+    private Integer pageId;
+
+    /**
+     * 业务类型
+     */
+    private Integer bizType;
+
+    /**
+     * 显示标志
+     */
+    private Integer showFlag;
+}

+ 76 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavBottomMain.java

@@ -0,0 +1,76 @@
+package org.dromara.system.domain;
+
+import org.dromara.common.tenant.core.TenantEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.github.linpeilie.annotations.AutoMapper;
+
+import java.io.Serial;
+
+/**
+ * 底部主导航表 vs_nav_bottom_main
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("common_vs_nav_bottom_main")
+@AutoMapper(target = org.dromara.system.domain.vo.VsNavBottomMainVo.class)
+public class VsNavBottomMain extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 导航ID
+     */
+    @TableId(value = "nav_id", type = IdType.AUTO)
+    private Long navId;
+
+    /**
+     * 导航名称
+     */
+    private String name;
+
+    /**
+     * 类型 (1弹窗,2全屏广告,3轮播图,4金刚区)
+     */
+    private String type;
+
+    /**
+     * 导航图标
+     */
+    private String pic;
+
+    /**
+     * 跳转类型(1跳转链接 2不跳转 3小程序内链 4小程序外链 5H5外链 6公众号文章  7电话拨号)
+     */
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 小程序AppID(当 jump_type = 4 小程序外链 时使用)
+     */
+    private String appId;
+
+    /**
+     * 排序号
+     */
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 显示标志
+     */
+    private Integer showFlag;
+}

+ 84 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/VsNavServiceToolbar.java

@@ -0,0 +1,84 @@
+package org.dromara.system.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.dromara.common.tenant.core.TenantEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import org.dromara.system.domain.vo.VsNavServiceToolbarVo;
+
+import java.io.Serial;
+
+/**
+ * 服务区工具栏对象 vs_nav_service_toolbar
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("common_vs_nav_service_toolbar")
+@AutoMapper(target = VsNavServiceToolbarVo.class)
+public class VsNavServiceToolbar extends TenantEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 工具栏名称
+     */
+    private String name;
+
+    /**
+     * 类型标识
+     */
+    private String type;
+
+    /**
+     * 图标图片URL
+     */
+    private String pic;
+
+    /**
+     * 跳转类型(1内部页面,2外部链接,3小程序)
+     */
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 分类ID(1行前必备,2游玩工具,3出行保障,4公共服务)
+     */
+    private Integer categoryId;
+
+    /**
+     * 排序号
+     */
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常,1停用)
+     */
+    private Integer status;
+
+    /**
+     * 显示标志(0显示,1隐藏)
+     */
+    private Integer showFlag;
+
+    /**
+     * 删除标志(0代表存在,1代表删除)
+     */
+    @TableLogic
+    private Integer delFlag;
+
+}

+ 71 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/FileCategoryBo.java

@@ -0,0 +1,71 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.FileCategory;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 文件分类业务对象 file_category
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FileCategory.class, reverseConvertGenerate = false)
+public class FileCategoryBo extends BaseEntity {
+
+    /**
+     * 分类ID
+     */
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    @NotBlank(message = "分类名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 分类编码
+     */
+    @NotBlank(message = "分类编码不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String code;
+
+    /**
+     * 父分类ID(0表示顶级分类)
+     */
+    private Long parentId;
+
+    /**
+     * 分类类型(1图片 2视频 3音频 4文档 5其他)
+     */
+    @NotNull(message = "分类类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer type;
+
+    /**
+     * 排序号
+     */
+    private Integer sort;
+
+    /**
+     * 分类图标
+     */
+    private String icon;
+
+    /**
+     * 分类描述
+     */
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+}

+ 141 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/FileInfoBo.java

@@ -0,0 +1,141 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.FileInfo;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 文件信息业务对象 file_info
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = FileInfo.class, reverseConvertGenerate = false)
+public class FileInfoBo extends BaseEntity {
+
+    /**
+     * 文件ID
+     */
+    private Long id;
+
+    /**
+     * 文件名称
+     */
+    @NotBlank(message = "文件名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 原始文件名
+     */
+    @NotBlank(message = "原始文件名不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String originalName;
+
+    /**
+     * 文件路径(OSS路径)
+     */
+    @NotBlank(message = "文件路径不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String path;
+
+    /**
+     * 文件访问URL
+     */
+    private String url;
+
+    /**
+     * 文件大小(字节)
+     */
+    private Long size;
+
+    /**
+     * 文件类型(MIME类型)
+     */
+    private String type;
+
+    /**
+     * 文件扩展名
+     */
+    private String extension;
+
+    /**
+     * 文件分类ID
+     */
+    private Long categoryId;
+
+    /**
+     * 文件主分类
+     */
+    private Long categoryType;
+
+    /**
+     * 文件分类名称
+     */
+    private String categoryName;
+
+    /**
+     * 文件哈希值(MD5)
+     */
+    private String hash;
+
+    /**
+     * 图片/视频宽度
+     */
+    private Integer width;
+
+    /**
+     * 图片/视频高度
+     */
+    private Integer height;
+
+    /**
+     * 视频/音频时长(秒)
+     */
+    private Integer duration;
+
+    /**
+     * OSS存储桶名称
+     */
+    private String ossBucket;
+
+    /**
+     * OSS对象键
+     */
+    private String ossKey;
+
+    /**
+     * OSS文件唯一标识符
+     */
+    private String ossId;
+
+    /**
+     * 上传状态(0上传中 1上传完成 2上传失败)
+     */
+    private Integer uploadStatus;
+
+    /**
+     * 下载次数
+     */
+    private Integer downloadCount;
+
+    /**
+     * 查看次数
+     */
+    private Integer viewCount;
+
+    /**
+     * 是否公开(0私有 1公开)
+     */
+    private Integer isPublic;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+}

+ 117 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavBottomIconBo.java

@@ -0,0 +1,117 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.VsNavBottomIcon;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 底部图标导航表业务对象 vs_nav_bottom_icon
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = VsNavBottomIcon.class, reverseConvertGenerate = false)
+public class VsNavBottomIconBo extends BaseEntity {
+
+    /**
+     * 图标导航ID
+     */
+    @NotNull(message = "图标导航ID不能为空", groups = { EditGroup.class })
+    private Long iconId;
+
+    /**
+     * 未选中文字
+     */
+    private String textUnselected;
+
+    /**
+     * 选中文字颜色
+     */
+    private String textSelectedColor;
+
+    /**
+     * 未选中文字颜色
+     */
+    private String textUnselectedColor;
+
+    /**
+     * 未选中图标
+     */
+    private String iconUnselected;
+
+    /**
+     * 选中图标
+     */
+    private String iconSelected;
+
+    /**
+     * 跳转类型
+     */
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 排序号
+     */
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 名称
+     */
+    private String name;
+
+    /**
+     * 图片
+     */
+    private String pic;
+
+    /**
+     * 图标跳转类型
+     */
+    private String jumpTypeIcon;
+
+    /**
+     * 打开方式
+     */
+    private String openType;
+
+    /**
+     * 应用ID
+     */
+    private String appId;
+
+    /**
+     * 二维码URL
+     */
+    private String qrCodeUrl;
+
+    /**
+     * 页面ID
+     */
+    private Integer pageId;
+
+    /**
+     * 业务类型
+     */
+    private Integer bizType;
+
+    /**
+     * 显示标志
+     */
+    private Integer showFlag;
+}

+ 77 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavBottomMainBo.java

@@ -0,0 +1,77 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.VsNavBottomMain;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 底部主导航表业务对象 vs_nav_bottom_main
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = VsNavBottomMain.class, reverseConvertGenerate = false)
+public class VsNavBottomMainBo extends BaseEntity {
+
+    /**
+     * 导航ID
+     */
+    @NotNull(message = "导航ID不能为空", groups = { EditGroup.class })
+    private Long navId;
+
+    /**
+     * 导航名称
+     */
+    @NotBlank(message = "导航名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 类型 (1弹窗,2全屏广告,3轮播图,4金刚区)
+     */
+    private String type;
+
+    /**
+     * 导航图标
+     */
+    @NotBlank(message = "导航图标不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String pic;
+
+    /**
+     * 跳转类型(1跳转链接 2不跳转 3小程序内链 4小程序外链 5H5外链 6公众号文章  7电话拨号)
+     */
+    @NotNull(message = "跳转类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 小程序AppID
+     */
+    private String appId;
+
+    /**
+     * 排序号
+     */
+    @NotNull(message = "排序号不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    private Integer status;
+
+    /**
+     * 显示标志
+     */
+    private Integer showFlag;
+}

+ 77 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/bo/VsNavServiceToolbarBo.java

@@ -0,0 +1,77 @@
+package org.dromara.system.domain.bo;
+
+import org.dromara.system.domain.VsNavServiceToolbar;
+import org.dromara.common.core.validate.AddGroup;
+import org.dromara.common.core.validate.EditGroup;
+import org.dromara.common.mybatis.core.domain.BaseEntity;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import jakarta.validation.constraints.*;
+
+/**
+ * 服务区工具栏业务对象 vs_nav_service_toolbar
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = VsNavServiceToolbar.class, reverseConvertGenerate = false)
+public class VsNavServiceToolbarBo extends BaseEntity {
+
+    /**
+     * 主键ID
+     */
+    @NotNull(message = "主键ID不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 工具栏名称
+     */
+    @NotBlank(message = "工具栏名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String name;
+
+    /**
+     * 类型标识
+     */
+    @NotBlank(message = "类型标识不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String type;
+
+    /**
+     * 图标图片URL
+     */
+    private String pic;
+
+    /**
+     * 跳转类型(1内部页面,2外部链接,3小程序)
+     */
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    private String jumpPath;
+
+    /**
+     * 分类ID(1行前必备,2游玩工具,3出行保障,4公共服务)
+     */
+    @NotNull(message = "分类ID不能为空", groups = { AddGroup.class, EditGroup.class })
+    private Integer categoryId;
+
+    /**
+     * 排序号
+     */
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常,1停用)
+     */
+    private Integer status;
+
+    /**
+     * 显示标志(0显示,1隐藏)
+     */
+    private Integer showFlag;
+
+}

+ 93 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/FileCategoryVo.java

@@ -0,0 +1,93 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.FileCategory;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 文件分类视图对象 file_category
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = FileCategory.class)
+public class FileCategoryVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 分类ID
+     */
+    @ExcelProperty(value = "分类ID")
+    private Long id;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String name;
+
+    /**
+     * 分类编码
+     */
+    @ExcelProperty(value = "分类编码")
+    private String code;
+
+    /**
+     * 父分类ID(0表示顶级分类)
+     */
+    @ExcelProperty(value = "父分类ID")
+    private Long parentId;
+
+    /**
+     * 分类类型(1图片 2视频 3音频 4文档 5其他)
+     */
+    @ExcelProperty(value = "分类类型")
+    private Integer type;
+
+    /**
+     * 排序号
+     */
+    @ExcelProperty(value = "排序号")
+    private Integer sort;
+
+    /**
+     * 分类图标
+     */
+    @ExcelProperty(value = "分类图标")
+    private String icon;
+
+    /**
+     * 分类描述
+     */
+    @ExcelProperty(value = "分类描述")
+    private String description;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 子分类列表
+     */
+    private List<FileCategoryVo> children;
+
+}

+ 177 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/FileInfoVo.java

@@ -0,0 +1,177 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.FileInfo;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 文件信息视图对象 file_info
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = FileInfo.class)
+public class FileInfoVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 文件ID
+     */
+    @ExcelProperty(value = "文件ID")
+    private Long id;
+
+    /**
+     * 文件名称
+     */
+    @ExcelProperty(value = "文件名称")
+    private String name;
+
+    /**
+     * 原始文件名
+     */
+    @ExcelProperty(value = "原始文件名")
+    private String originalName;
+
+    /**
+     * 文件路径(OSS路径)
+     */
+    @ExcelProperty(value = "文件路径")
+    private String path;
+
+    /**
+     * 文件访问URL
+     */
+    @ExcelProperty(value = "文件访问URL")
+    private String url;
+
+    /**
+     * 文件大小(字节)
+     */
+    @ExcelProperty(value = "文件大小")
+    private Long size;
+
+    /**
+     * 文件类型(MIME类型)
+     */
+    @ExcelProperty(value = "文件类型")
+    private String type;
+
+    /**
+     * 文件扩展名
+     */
+    @ExcelProperty(value = "文件扩展名")
+    private String extension;
+
+    /**
+     * 文件分类ID
+     */
+    @ExcelProperty(value = "文件分类ID")
+    private Long categoryId;
+
+    /**
+     * 文件主分类
+     */
+    @ExcelProperty(value = "文件主分类")
+    private Long categoryType;
+
+    /**
+     * 文件分类名称
+     */
+    @ExcelProperty(value = "文件主分类名称")
+    private Long categoryTypeName;
+
+    /**
+     * 文件分类名称
+     */
+    @ExcelProperty(value = "文件分类名称")
+    private String categoryName;
+
+    /**
+     * 文件哈希值(MD5)
+     */
+    @ExcelProperty(value = "文件哈希值")
+    private String hash;
+
+    /**
+     * 图片/视频宽度
+     */
+    @ExcelProperty(value = "宽度")
+    private Integer width;
+
+    /**
+     * 图片/视频高度
+     */
+    @ExcelProperty(value = "高度")
+    private Integer height;
+
+    /**
+     * 视频/音频时长(秒)
+     */
+    @ExcelProperty(value = "时长")
+    private Integer duration;
+
+    /**
+     * OSS存储桶名称
+     */
+    @ExcelProperty(value = "OSS存储桶")
+    private String ossBucket;
+
+    /**
+     * OSS对象键
+     */
+    @ExcelProperty(value = "OSS对象键")
+    private String ossKey;
+
+    /**
+     * OSS文件唯一标识符
+     */
+    @ExcelProperty(value = "OSS文件ID")
+    private String ossId;
+
+    /**
+     * 上传状态(0上传中 1上传完成 2上传失败)
+     */
+    @ExcelProperty(value = "上传状态")
+    private Integer uploadStatus;
+
+    /**
+     * 下载次数
+     */
+    @ExcelProperty(value = "下载次数")
+    private Integer downloadCount;
+
+    /**
+     * 查看次数
+     */
+    @ExcelProperty(value = "查看次数")
+    private Integer viewCount;
+
+    /**
+     * 是否公开(0私有 1公开)
+     */
+    @ExcelProperty(value = "是否公开")
+    private Integer isPublic;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+}

+ 155 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavBottomIconVo.java

@@ -0,0 +1,155 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.VsNavBottomIcon;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 底部图标导航表视图对象 vs_nav_bottom_icon
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = VsNavBottomIcon.class)
+public class VsNavBottomIconVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 图标导航ID
+     */
+    @ExcelProperty(value = "图标导航ID")
+    private Long iconId;
+
+    /**
+     * 未选中文字
+     */
+    @ExcelProperty(value = "未选中文字")
+    private String textUnselected;
+
+    /**
+     * 选中文字颜色
+     */
+    @ExcelProperty(value = "选中文字颜色")
+    private String textSelectedColor;
+
+    /**
+     * 未选中文字颜色
+     */
+    @ExcelProperty(value = "未选中文字颜色")
+    private String textUnselectedColor;
+
+    /**
+     * 未选中图标
+     */
+    @ExcelProperty(value = "未选中图标")
+    private String iconUnselected;
+
+    /**
+     * 选中图标
+     */
+    @ExcelProperty(value = "选中图标")
+    private String iconSelected;
+
+    /**
+     * 跳转类型
+     */
+    @ExcelProperty(value = "跳转类型")
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    @ExcelProperty(value = "跳转路径")
+    private String jumpPath;
+
+    /**
+     * 排序号
+     */
+    @ExcelProperty(value = "排序号")
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_normal_disable")
+    private Integer status;
+
+    /**
+     * 名称
+     */
+    @ExcelProperty(value = "名称")
+    private String name;
+
+    /**
+     * 图片
+     */
+    @ExcelProperty(value = "图片")
+    private String pic;
+
+    /**
+     * 图标跳转类型
+     */
+    @ExcelProperty(value = "图标跳转类型")
+    private String jumpTypeIcon;
+
+    /**
+     * 打开方式
+     */
+    @ExcelProperty(value = "打开方式")
+    private String openType;
+
+    /**
+     * 应用ID
+     */
+    @ExcelProperty(value = "应用ID")
+    private String appId;
+
+    /**
+     * 二维码URL
+     */
+    @ExcelProperty(value = "二维码URL")
+    private String qrCodeUrl;
+
+    /**
+     * 页面ID
+     */
+    @ExcelProperty(value = "页面ID")
+    private Integer pageId;
+
+    /**
+     * 业务类型
+     */
+    @ExcelProperty(value = "业务类型")
+    private Integer bizType;
+
+    /**
+     * 显示标志
+     */
+    @ExcelProperty(value = "显示标志")
+    private Integer showFlag;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+}

+ 137 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavBottomMainVo.java

@@ -0,0 +1,137 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.VsNavBottomMain;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import org.dromara.common.excel.annotation.ExcelDictFormat;
+import org.dromara.common.excel.convert.ExcelDictConvert;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 底部主导航表视图对象 vs_nav_bottom_main
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = VsNavBottomMain.class)
+public class VsNavBottomMainVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 导航ID
+     */
+    @ExcelProperty(value = "导航ID")
+    private Long navId;
+
+    /**
+     * 导航名称
+     */
+    @ExcelProperty(value = "导航名称")
+    private String name;
+
+    /**
+     * 类型 (1弹窗,2全屏广告,3轮播图,4金刚区)
+     */
+    @ExcelProperty(value = "类型")
+    private String type;
+
+    /**
+     * 导航图标
+     */
+    @ExcelProperty(value = "导航图标")
+    private String pic;
+
+    /**
+     * 跳转类型(1跳转链接 2不跳转 3小程序内链 4小程序外链 5H5外链 6公众号文章  7电话拨号)
+     */
+    @ExcelProperty(value = "跳转类型")
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    @ExcelProperty(value = "跳转路径")
+    private String jumpPath;
+
+    /**
+     * 小程序AppID
+     */
+    @ExcelProperty(value = "小程序AppID")
+    private String appId;
+
+    /**
+     * 排序号
+     */
+    @ExcelProperty(value = "排序号")
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常 1停用)
+     */
+    @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+    @ExcelDictFormat(dictType = "sys_normal_disable")
+    private Integer status;
+
+    /**
+     * 显示标志
+     */
+    @ExcelProperty(value = "显示标志")
+    private Integer showFlag;
+
+  /**
+   * 删除标志
+   */
+  @ExcelProperty(value = "删除标志")
+  private Integer delFlag;
+
+  /**
+   * 备注
+   */
+  @ExcelProperty(value = "备注")
+  private String remark;
+
+  /**
+   * 创建者
+   */
+  @ExcelProperty(value = "创建者")
+  private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+  /**
+   * 更新者
+   */
+  @ExcelProperty(value = "更新者")
+  private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    @ExcelProperty(value = "更新时间")
+    private Date updateTime;
+
+  /**
+   * 租户编号
+   */
+  @ExcelProperty(value = "租户编号")
+  private String tenantId;
+
+  /**
+   * 创建部门
+   */
+  @ExcelProperty(value = "创建部门")
+  private Long createDept;
+}

+ 99 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/domain/vo/VsNavServiceToolbarVo.java

@@ -0,0 +1,99 @@
+package org.dromara.system.domain.vo;
+
+import org.dromara.system.domain.VsNavServiceToolbar;
+import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
+import cn.idev.excel.annotation.ExcelProperty;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 服务区工具栏视图对象 vs_nav_service_toolbar
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = VsNavServiceToolbar.class)
+public class VsNavServiceToolbarVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键ID
+     */
+    @ExcelProperty(value = "主键ID")
+    private Long id;
+
+    /**
+     * 工具栏名称
+     */
+    @ExcelProperty(value = "工具栏名称")
+    private String name;
+
+    /**
+     * 类型标识
+     */
+    @ExcelProperty(value = "类型标识")
+    private String type;
+
+    /**
+     * 图标图片URL
+     */
+    @ExcelProperty(value = "图标图片URL")
+    private String pic;
+
+    /**
+     * 跳转类型(1内部页面,2外部链接,3小程序)
+     */
+    @ExcelProperty(value = "跳转类型")
+    private Integer jumpType;
+
+    /**
+     * 跳转路径
+     */
+    @ExcelProperty(value = "跳转路径")
+    private String jumpPath;
+
+    /**
+     * 分类ID(1行前必备,2游玩工具,3出行保障,4公共服务)
+     */
+    @ExcelProperty(value = "分类ID")
+    private Integer categoryId;
+
+    /**
+     * 分类名称
+     */
+    @ExcelProperty(value = "分类名称")
+    private String categoryName;
+
+    /**
+     * 排序号
+     */
+    @ExcelProperty(value = "排序号")
+    private Integer sortNum;
+
+    /**
+     * 状态(0正常,1停用)
+     */
+    @ExcelProperty(value = "状态")
+    private Integer status;
+
+    /**
+     * 显示标志(0显示,1隐藏)
+     */
+    @ExcelProperty(value = "显示标志")
+    private Integer showFlag;
+
+    /**
+     * 创建时间
+     */
+    @ExcelProperty(value = "创建时间")
+    private Date createTime;
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/FileCategoryMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.FileCategory;
+import org.dromara.system.domain.vo.FileCategoryVo;
+
+/**
+ * 文件分类Mapper接口
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+public interface FileCategoryMapper extends BaseMapperPlus<FileCategory, FileCategoryVo> {
+
+}

+ 15 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/FileInfoMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.FileInfo;
+import org.dromara.system.domain.vo.FileInfoVo;
+
+/**
+ * 文件信息Mapper接口
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+public interface FileInfoMapper extends BaseMapperPlus<FileInfo, FileInfoVo> {
+
+}

+ 43 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavBottomIconMapper.java

@@ -0,0 +1,43 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.VsNavBottomIcon;
+import org.dromara.system.domain.vo.VsNavBottomIconVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Update;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 底部图标导航表Mapper接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface VsNavBottomIconMapper extends BaseMapperPlus<VsNavBottomIcon, VsNavBottomIconVo> {
+
+    /**
+     * 获取启用的底部图标导航列表
+     */
+    List<VsNavBottomIconVo> getEnabledIconList();
+
+    /**
+     * 根据业务类型获取图标导航列表
+     */
+    List<VsNavBottomIconVo> getIconListByBizType(Integer bizType);
+
+    /**
+     * 更新所有记录的颜色设置
+     */
+    @Update("UPDATE common_vs_nav_bottom_icon SET text_selected_color = #{selectedTextColor}, text_unselected_color = #{unselectedTextColor}")
+    int updateAllColorSettings(@Param("selectedTextColor") String selectedTextColor,
+                              @Param("unselectedTextColor") String unselectedTextColor);
+
+    /**
+     * 获取颜色设置(从第一条记录获取)
+     */
+    @Select("SELECT text_selected_color as selectedTextColor, text_unselected_color as unselectedTextColor FROM common_vs_nav_bottom_icon LIMIT 1")
+    Map<String, String> getColorSettings();
+}

+ 26 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavBottomMainMapper.java

@@ -0,0 +1,26 @@
+package org.dromara.system.mapper;
+
+import org.dromara.system.domain.VsNavBottomMain;
+import org.dromara.system.domain.vo.VsNavBottomMainVo;
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+
+import java.util.List;
+
+/**
+ * 底部主导航表Mapper接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface VsNavBottomMainMapper extends BaseMapperPlus<VsNavBottomMain, VsNavBottomMainVo> {
+
+    /**
+     * 获取启用的底部主导航列表
+     */
+    List<VsNavBottomMainVo> getEnabledNavList();
+
+    /**
+     * 根据类型获取导航列表
+     */
+    List<VsNavBottomMainVo> getNavListByType(String type);
+}

+ 15 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/mapper/VsNavServiceToolbarMapper.java

@@ -0,0 +1,15 @@
+package org.dromara.system.mapper;
+
+import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
+import org.dromara.system.domain.VsNavServiceToolbar;
+import org.dromara.system.domain.vo.VsNavServiceToolbarVo;
+
+/**
+ * 服务区工具栏Mapper接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface VsNavServiceToolbarMapper extends BaseMapperPlus<VsNavServiceToolbar, VsNavServiceToolbarVo> {
+
+}

+ 58 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IFileCategoryService.java

@@ -0,0 +1,58 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.FileCategoryVo;
+import org.dromara.system.domain.bo.FileCategoryBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 文件分类Service接口
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+public interface IFileCategoryService {
+
+    /**
+     * 查询文件分类
+     */
+    FileCategoryVo queryById(Long id);
+
+    /**
+     * 查询文件分类列表
+     */
+    TableDataInfo<FileCategoryVo> queryPageList(FileCategoryBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询文件分类列表
+     */
+    List<FileCategoryVo> queryList(FileCategoryBo bo);
+
+    /**
+     * 新增文件分类
+     */
+    Boolean insertByBo(FileCategoryBo bo);
+
+    /**
+     * 修改文件分类
+     */
+    Boolean updateByBo(FileCategoryBo bo);
+
+    /**
+     * 校验并批量删除文件分类信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 查询分类树结构
+     */
+    List<FileCategoryVo> queryCategoryTree();
+
+    /**
+     * 根据类型查询分类列表
+     */
+    List<FileCategoryVo> queryByType(Integer type);
+}

+ 73 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IFileInfoService.java

@@ -0,0 +1,73 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.FileInfoVo;
+import org.dromara.system.domain.bo.FileInfoBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 文件信息Service接口
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+public interface IFileInfoService {
+
+    /**
+     * 查询文件信息
+     */
+    FileInfoVo queryById(Long id);
+
+    /**
+     * 查询文件信息列表
+     */
+    TableDataInfo<FileInfoVo> queryPageList(FileInfoBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询文件信息列表
+     */
+    List<FileInfoVo> queryList(FileInfoBo bo);
+
+    /**
+     * 新增文件信息
+     */
+    Boolean insertByBo(FileInfoBo bo);
+
+    /**
+     * 修改文件信息
+     */
+    Boolean updateByBo(FileInfoBo bo);
+
+    /**
+     * 校验并批量删除文件信息信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据分类ID查询文件列表
+     */
+    List<FileInfoVo> queryByCategoryId(Long categoryId);
+
+    /**
+     * 根据文件类型查询文件列表
+     */
+    List<FileInfoVo> queryByType(String type);
+
+    /**
+     * 更新文件下载次数
+     */
+    Boolean updateDownloadCount(Long id);
+
+    /**
+     * 更新文件查看次数
+     */
+    Boolean updateViewCount(Long id);
+
+    /**
+     * 下载文件
+     */
+    void downloadFile(Long id, jakarta.servlet.http.HttpServletResponse response) throws java.io.IOException;
+}

+ 99 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavBottomIconService.java

@@ -0,0 +1,99 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.VsNavBottomIconVo;
+import org.dromara.system.domain.bo.VsNavBottomIconBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 底部图标导航表Service接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface IVsNavBottomIconService {
+
+    /**
+     * 查询底部图标导航表
+     *
+     * @param iconId 主键
+     * @return 底部图标导航表
+     */
+    VsNavBottomIconVo queryById(Long iconId);
+
+    /**
+     * 分页查询底部图标导航表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 底部图标导航表分页列表
+     */
+    TableDataInfo<VsNavBottomIconVo> queryPageList(VsNavBottomIconBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的底部图标导航表列表
+     *
+     * @param bo 查询条件
+     * @return 底部图标导航表列表
+     */
+    List<VsNavBottomIconVo> queryList(VsNavBottomIconBo bo);
+
+    /**
+     * 新增底部图标导航表
+     *
+     * @param bo 底部图标导航表
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(VsNavBottomIconBo bo);
+
+    /**
+     * 修改底部图标导航表
+     *
+     * @param bo 底部图标导航表
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(VsNavBottomIconBo bo);
+
+    /**
+     * 校验并批量删除底部图标导航表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 获取启用的底部图标导航列表
+     *
+     * @return 底部图标导航列表
+     */
+    List<VsNavBottomIconVo> getEnabledIconList();
+
+    /**
+     * 根据业务类型获取图标导航列表
+     *
+     * @param bizType 业务类型
+     * @return 底部图标导航列表
+     */
+    List<VsNavBottomIconVo> getIconListByBizType(Integer bizType);
+
+    /**
+     * 保存颜色设置
+     *
+     * @param selectedTextColor 选中文字颜色
+     * @param unselectedTextColor 未选中文字颜色
+     * @return 是否保存成功
+     */
+    Boolean saveColorSettings(String selectedTextColor, String unselectedTextColor);
+
+    /**
+     * 获取颜色设置
+     *
+     * @return 颜色设置响应对象
+     */
+    java.util.Map<String, String> getColorSettings();
+}

+ 83 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavBottomMainService.java

@@ -0,0 +1,83 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.vo.VsNavBottomMainVo;
+import org.dromara.system.domain.bo.VsNavBottomMainBo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 底部主导航表Service接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface IVsNavBottomMainService {
+
+    /**
+     * 查询底部主导航表
+     *
+     * @param navId 主键
+     * @return 底部主导航表
+     */
+    VsNavBottomMainVo queryById(Long navId);
+
+    /**
+     * 分页查询底部主导航表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 底部主导航表分页列表
+     */
+    TableDataInfo<VsNavBottomMainVo> queryPageList(VsNavBottomMainBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询符合条件的底部主导航表列表
+     *
+     * @param bo 查询条件
+     * @return 底部主导航表列表
+     */
+    List<VsNavBottomMainVo> queryList(VsNavBottomMainBo bo);
+
+    /**
+     * 新增底部主导航表
+     *
+     * @param bo 底部主导航表
+     * @return 是否新增成功
+     */
+    Boolean insertByBo(VsNavBottomMainBo bo);
+
+    /**
+     * 修改底部主导航表
+     *
+     * @param bo 底部主导航表
+     * @return 是否修改成功
+     */
+    Boolean updateByBo(VsNavBottomMainBo bo);
+
+    /**
+     * 校验并批量删除底部主导航表信息
+     *
+     * @param ids     待删除的主键集合
+     * @param isValid 是否进行有效性校验
+     * @return 是否删除成功
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 获取启用的底部主导航列表
+     *
+     * @return 底部主导航列表
+     */
+    List<VsNavBottomMainVo> getEnabledNavList();
+
+    /**
+     * 根据类型获取导航列表
+     *
+     * @param type 类型
+     * @return 底部主导航列表
+     */
+    List<VsNavBottomMainVo> getNavListByType(String type);
+}

+ 59 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/IVsNavServiceToolbarService.java

@@ -0,0 +1,59 @@
+package org.dromara.system.service;
+
+import org.dromara.system.domain.bo.VsNavServiceToolbarBo;
+import org.dromara.system.domain.vo.VsNavServiceToolbarVo;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 服务区工具栏Service接口
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+public interface IVsNavServiceToolbarService {
+
+    /**
+     * 查询服务区工具栏
+     */
+    VsNavServiceToolbarVo queryById(Long id);
+
+    /**
+     * 查询服务区工具栏列表
+     */
+    TableDataInfo<VsNavServiceToolbarVo> queryPageList(VsNavServiceToolbarBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询服务区工具栏列表
+     */
+    List<VsNavServiceToolbarVo> queryList(VsNavServiceToolbarBo bo);
+
+    /**
+     * 新增服务区工具栏
+     */
+    Boolean insertByBo(VsNavServiceToolbarBo bo);
+
+    /**
+     * 修改服务区工具栏
+     */
+    Boolean updateByBo(VsNavServiceToolbarBo bo);
+
+    /**
+     * 校验并批量删除服务区工具栏信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 根据分类ID查询工具栏列表
+     */
+    List<VsNavServiceToolbarVo> queryByCategoryId(Integer categoryId);
+
+    /**
+     * 根据分类ID查询工具栏列表(按排序号排序)
+     */
+    List<VsNavServiceToolbarVo> queryByCategoryIdOrderBySort(Integer categoryId);
+
+}

+ 149 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/FileCategoryServiceImpl.java

@@ -0,0 +1,149 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.dromara.system.mapper.FileCategoryMapper;
+import org.dromara.system.service.IFileCategoryService;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.FileCategoryBo;
+import org.dromara.system.domain.vo.FileCategoryVo;
+import org.dromara.system.domain.FileCategory;
+
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 文件分类Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@RequiredArgsConstructor
+@Service
+public class FileCategoryServiceImpl implements IFileCategoryService {
+
+    private final FileCategoryMapper baseMapper;
+
+    /**
+     * 查询文件分类
+     */
+    @Override
+    public FileCategoryVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 查询文件分类列表
+     */
+    @Override
+    public TableDataInfo<FileCategoryVo> queryPageList(FileCategoryBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<FileCategory> lqw = buildQueryWrapper(bo);
+        Page<FileCategoryVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询文件分类列表
+     */
+    @Override
+    public List<FileCategoryVo> queryList(FileCategoryBo bo) {
+        LambdaQueryWrapper<FileCategory> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<FileCategory> buildQueryWrapper(FileCategoryBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<FileCategory> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getName()), FileCategory::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getCode()), FileCategory::getCode, bo.getCode());
+        lqw.eq(bo.getParentId() != null, FileCategory::getParentId, bo.getParentId());
+        lqw.eq(bo.getType() != null, FileCategory::getType, bo.getType());
+        lqw.eq(bo.getStatus() != null, FileCategory::getStatus, bo.getStatus());
+        lqw.orderByAsc(FileCategory::getSort);
+        return lqw;
+    }
+
+    /**
+     * 新增文件分类
+     */
+    @Override
+    public Boolean insertByBo(FileCategoryBo bo) {
+        FileCategory add = MapstructUtils.convert(bo, FileCategory.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改文件分类
+     */
+    @Override
+    public Boolean updateByBo(FileCategoryBo bo) {
+        FileCategory update = MapstructUtils.convert(bo, FileCategory.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(FileCategory entity) {
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除文件分类
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    /**
+     * 查询分类树结构
+     */
+    @Override
+    public List<FileCategoryVo> queryCategoryTree() {
+        LambdaQueryWrapper<FileCategory> lqw = Wrappers.lambdaQuery();
+        lqw.eq(FileCategory::getStatus, 0);
+        lqw.orderByAsc(FileCategory::getSort);
+        List<FileCategoryVo> list = baseMapper.selectVoList(lqw);
+        return buildTree(list, 0L);
+    }
+
+    /**
+     * 根据类型查询分类列表
+     */
+    @Override
+    public List<FileCategoryVo> queryByType(Integer type) {
+        LambdaQueryWrapper<FileCategory> lqw = Wrappers.lambdaQuery();
+        lqw.eq(FileCategory::getType, type);
+        lqw.eq(FileCategory::getStatus, 0);
+        lqw.orderByAsc(FileCategory::getSort);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 构建树形结构
+     */
+    private List<FileCategoryVo> buildTree(List<FileCategoryVo> list, Long parentId) {
+        return list.stream()
+            .filter(item -> parentId.equals(item.getParentId()))
+            .peek(item -> item.setChildren(buildTree(list, item.getId())))
+            .toList();
+    }
+}

+ 271 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/FileInfoServiceImpl.java

@@ -0,0 +1,271 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.FileInfo;
+import org.dromara.system.domain.bo.FileInfoBo;
+import org.dromara.system.domain.vo.FileInfoVo;
+import org.dromara.system.mapper.FileInfoMapper;
+import org.dromara.system.service.IFileInfoService;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件信息Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2024-01-01
+ */
+@RequiredArgsConstructor
+@Service
+public class FileInfoServiceImpl implements IFileInfoService {
+
+    private final FileInfoMapper baseMapper;
+
+    /**
+     * 查询文件信息
+     */
+    @Override
+    public FileInfoVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 查询文件信息列表
+     */
+    @Override
+    public TableDataInfo<FileInfoVo> queryPageList(FileInfoBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<FileInfo> lqw = buildQueryWrapper(bo);
+        // 指定租户ID为000000,以便查询所有数据
+        lqw.apply("tenant_id = '000000'");
+        Page<FileInfoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询文件信息列表
+     */
+    @Override
+    public List<FileInfoVo> queryList(FileInfoBo bo) {
+        LambdaQueryWrapper<FileInfo> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<FileInfo> buildQueryWrapper(FileInfoBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<FileInfo> lqw = Wrappers.lambdaQuery();
+
+        // 添加调试日志
+        System.out.println("buildQueryWrapper - bo.getCategoryType(): " + bo.getCategoryType());
+        System.out.println("buildQueryWrapper - bo.getCategoryId(): " + bo.getCategoryId());
+
+        lqw.like(StringUtils.isNotBlank(bo.getName()), FileInfo::getName, bo.getName());
+        lqw.like(StringUtils.isNotBlank(bo.getOriginalName()), FileInfo::getOriginalName, bo.getOriginalName());
+        lqw.like(StringUtils.isNotBlank(bo.getPath()), FileInfo::getPath, bo.getPath());
+        lqw.eq(bo.getCategoryId() != null, FileInfo::getCategoryId, bo.getCategoryId());
+        lqw.eq(bo.getCategoryType() != null, FileInfo::getCategoryType, bo.getCategoryType());
+        // 支持类型前缀匹配
+        if (StringUtils.isNotBlank(bo.getType())) {
+            if (bo.getType().endsWith("/")) {
+                // 如果是前缀匹配(如 "image/" 或 "video/")
+                lqw.like(FileInfo::getType, bo.getType());
+            } else {
+                // 如果是精确匹配
+                lqw.eq(FileInfo::getType, bo.getType());
+            }
+        }
+        lqw.eq(bo.getUploadStatus() != null, FileInfo::getUploadStatus, bo.getUploadStatus());
+        lqw.eq(bo.getIsPublic() != null, FileInfo::getIsPublic, bo.getIsPublic());
+        lqw.eq(bo.getStatus() != null, FileInfo::getStatus, bo.getStatus());
+        // 确保只查询未删除的记录
+        lqw.eq(FileInfo::getDelFlag, 0);
+        lqw.orderByDesc(FileInfo::getId);
+        return lqw;
+    }
+
+    /**
+     * 新增文件信息
+     */
+    @Override
+    public Boolean insertByBo(FileInfoBo bo) {
+        FileInfo add = MapstructUtils.convert(bo, FileInfo.class);
+        validEntityBeforeSave(add);
+
+        // 设置租户ID - 使用字段直接赋值
+        try {
+            java.lang.reflect.Field tenantIdField = add.getClass().getSuperclass().getDeclaredField("tenantId");
+            tenantIdField.setAccessible(true);
+            tenantIdField.set(add, "000000");
+        } catch (Exception e) {
+            // 忽略设置租户ID的错误
+        }
+
+        // 设置默认值
+        if (add.getDownloadCount() == null) {
+            add.setDownloadCount(0);
+        }
+        if (add.getViewCount() == null) {
+            add.setViewCount(0);
+        }
+        if (add.getUploadStatus() == null) {
+            add.setUploadStatus(1);
+        }
+        if (add.getIsPublic() == null) {
+            add.setIsPublic(1);
+        }
+        if (add.getStatus() == null) {
+            add.setStatus(0);
+        }
+        if (add.getDelFlag() == null) {
+            add.setDelFlag(0L);
+        }
+
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改文件信息
+     */
+    @Override
+    public Boolean updateByBo(FileInfoBo bo) {
+        FileInfo update = MapstructUtils.convert(bo, FileInfo.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(FileInfo entity) {
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除文件信息
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    /**
+     * 根据分类ID查询文件列表
+     */
+    @Override
+    public List<FileInfoVo> queryByCategoryId(Long categoryId) {
+        LambdaQueryWrapper<FileInfo> lqw = Wrappers.lambdaQuery();
+        lqw.eq(FileInfo::getCategoryId, categoryId);
+        lqw.eq(FileInfo::getStatus, 0);
+        lqw.orderByDesc(FileInfo::getId);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 根据文件类型查询文件列表
+     */
+    @Override
+    public List<FileInfoVo> queryByType(String type) {
+        LambdaQueryWrapper<FileInfo> lqw = Wrappers.lambdaQuery();
+        lqw.eq(FileInfo::getType, type);
+        lqw.eq(FileInfo::getStatus, 0);
+        lqw.orderByDesc(FileInfo::getId);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 更新文件下载次数
+     */
+    @Override
+    public Boolean updateDownloadCount(Long id) {
+        FileInfo fileInfo = baseMapper.selectById(id);
+        if (fileInfo != null) {
+            fileInfo.setDownloadCount(fileInfo.getDownloadCount() + 1);
+            return baseMapper.updateById(fileInfo) > 0;
+        }
+        return false;
+    }
+
+    /**
+     * 更新文件查看次数
+     */
+    @Override
+    public Boolean updateViewCount(Long id) {
+        FileInfo fileInfo = baseMapper.selectById(id);
+        if (fileInfo != null) {
+            fileInfo.setViewCount(fileInfo.getViewCount() + 1);
+            return baseMapper.updateById(fileInfo) > 0;
+        }
+        return false;
+    }
+
+    /**
+     * 下载文件
+     */
+    @Override
+    public void downloadFile(Long id, jakarta.servlet.http.HttpServletResponse response) throws java.io.IOException {
+        try {
+            FileInfo fileInfo = baseMapper.selectById(id);
+            if (fileInfo == null) {
+                throw new RuntimeException("文件不存在,ID: " + id);
+            }
+
+            System.out.println("开始下载文件,ID: " + id + ", 名称: " + fileInfo.getName() + ", URL: " + fileInfo.getUrl());
+
+            // 如果文件有URL,直接返回文件内容
+            if (fileInfo.getUrl() != null && !fileInfo.getUrl().isEmpty()) {
+                System.out.println("文件有URL,准备下载: " + fileInfo.getUrl());
+
+                // 设置下载响应头
+                response.setHeader("Content-Disposition", "attachment; filename=\"" + fileInfo.getName() + "\"");
+                response.setContentType(fileInfo.getType() + "; charset=UTF-8");
+                response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
+                response.setHeader("Pragma", "no-cache");
+                response.setHeader("Expires", "0");
+
+                // 简化方案:直接重定向到OSS文件
+                System.out.println("准备重定向到OSS文件: " + fileInfo.getUrl());
+                response.sendRedirect(fileInfo.getUrl());
+                System.out.println("重定向成功");
+                return;
+            }
+
+            // 如果没有URL,尝试从OSS下载
+            if (fileInfo.getOssId() != null && !fileInfo.getOssId().isEmpty()) {
+                System.out.println("文件没有URL,但有ossId: " + fileInfo.getOssId());
+                try {
+                    // 调用系统OSS服务下载
+                    org.dromara.common.core.service.OssService ossService =
+                        org.dromara.common.core.utils.SpringUtils.getBean(org.dromara.common.core.service.OssService.class);
+                    if (ossService != null) {
+                        // 这里需要根据实际情况调整,可能需要先查询sys_oss表获取文件信息
+                        throw new RuntimeException("暂不支持通过ossId下载,请使用文件URL");
+                    }
+                } catch (Exception e) {
+                    throw new RuntimeException("OSS服务不可用: " + e.getMessage());
+                }
+            }
+
+            throw new RuntimeException("无法下载文件,文件URL和OSS信息都不存在");
+        } catch (Exception e) {
+            System.err.println("下载文件时发生错误: " + e.getMessage());
+            e.printStackTrace();
+            throw e;
+        }
+    }
+}

+ 194 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavBottomIconServiceImpl.java

@@ -0,0 +1,194 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.VsNavBottomIconBo;
+import org.dromara.system.domain.vo.VsNavBottomIconVo;
+import org.dromara.system.domain.VsNavBottomIcon;
+import org.dromara.system.mapper.VsNavBottomIconMapper;
+import org.dromara.system.service.IVsNavBottomIconService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.Objects;
+
+/**
+ * 底部图标导航表Service业务层处理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class VsNavBottomIconServiceImpl implements IVsNavBottomIconService {
+
+    private final VsNavBottomIconMapper baseMapper;
+
+    /**
+     * 查询底部图标导航表
+     *
+     * @param iconId 主键
+     * @return 底部图标导航表
+     */
+    @Override
+    public VsNavBottomIconVo queryById(Long iconId) {
+        return baseMapper.selectVoById(iconId);
+    }
+
+    /**
+     * 分页查询底部图标导航表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 底部图标导航表分页列表
+     */
+    @Override
+    public TableDataInfo<VsNavBottomIconVo> queryPageList(VsNavBottomIconBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<VsNavBottomIcon> lqw = buildQueryWrapper(bo);
+        Page<VsNavBottomIconVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的底部图标导航表列表
+     *
+     * @param bo 查询条件
+     * @return 底部图标导航表列表
+     */
+    @Override
+    public List<VsNavBottomIconVo> queryList(VsNavBottomIconBo bo) {
+        LambdaQueryWrapper<VsNavBottomIcon> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<VsNavBottomIcon> buildQueryWrapper(VsNavBottomIconBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<VsNavBottomIcon> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getIconId() != null, VsNavBottomIcon::getIconId, bo.getIconId());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), VsNavBottomIcon::getName, bo.getName());
+        lqw.eq(Objects.nonNull(bo.getJumpType()), VsNavBottomIcon::getJumpType, bo.getJumpType());
+        lqw.eq(Objects.nonNull(bo.getStatus()), VsNavBottomIcon::getStatus, bo.getStatus());
+        lqw.eq(bo.getBizType() != null, VsNavBottomIcon::getBizType, bo.getBizType());
+        lqw.eq(bo.getShowFlag() != null, VsNavBottomIcon::getShowFlag, bo.getShowFlag());
+        lqw.orderByAsc(VsNavBottomIcon::getSortNum);
+        return lqw;
+    }
+
+    /**
+     * 新增底部图标导航表
+     *
+     * @param bo 底部图标导航表
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(VsNavBottomIconBo bo) {
+        VsNavBottomIcon add = MapstructUtils.convert(bo, VsNavBottomIcon.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setIconId(add.getIconId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改底部图标导航表
+     *
+     * @param bo 底部图标导航表
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(VsNavBottomIconBo bo) {
+        VsNavBottomIcon update = MapstructUtils.convert(bo, VsNavBottomIcon.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(VsNavBottomIcon entity) {
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除底部图标导航表
+     *
+     * @param ids     需要删除的主键集合
+     * @param isValid 是否校验,true-删除前校验,false-不校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    /**
+     * 获取启用的底部图标导航列表
+     *
+     * @return 底部图标导航列表
+     */
+    @Override
+    public List<VsNavBottomIconVo> getEnabledIconList() {
+        return baseMapper.getEnabledIconList();
+    }
+
+    /**
+     * 根据业务类型获取图标导航列表
+     *
+     * @param bizType 业务类型
+     * @return 底部图标导航列表
+     */
+    @Override
+    public List<VsNavBottomIconVo> getIconListByBizType(Integer bizType) {
+        return baseMapper.getIconListByBizType(bizType);
+    }
+
+    /**
+     * 保存颜色设置
+     *
+     * @param selectedTextColor 选中文字颜色
+     * @param unselectedTextColor 未选中文字颜色
+     * @return 是否保存成功
+     */
+    @Override
+    public Boolean saveColorSettings(String selectedTextColor, String unselectedTextColor) {
+        log.info("保存颜色设置: selectedTextColor={}, unselectedTextColor={}", selectedTextColor, unselectedTextColor);
+        // 更新所有记录的颜色设置
+        int updateCount = baseMapper.updateAllColorSettings(selectedTextColor, unselectedTextColor);
+        log.info("颜色设置更新完成,影响记录数: {}", updateCount);
+        return updateCount >= 0; // 即使没有记录也返回成功
+    }
+
+    /**
+     * 获取颜色设置
+     *
+     * @return 颜色设置响应对象
+     */
+    @Override
+    public Map<String, String> getColorSettings() {
+        Map<String, String> colorSettings = baseMapper.getColorSettings();
+        if (colorSettings == null || colorSettings.isEmpty()) {
+            // 如果没有数据,返回默认值
+            colorSettings = new java.util.HashMap<>();
+            colorSettings.put("selectedTextColor", "#409EFF");
+            colorSettings.put("unselectedTextColor", "#B2B5BD");
+        }
+        return colorSettings;
+    }
+}

+ 161 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavBottomMainServiceImpl.java

@@ -0,0 +1,161 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.VsNavBottomMainBo;
+import org.dromara.system.domain.vo.VsNavBottomMainVo;
+import org.dromara.system.domain.VsNavBottomMain;
+import org.dromara.system.mapper.VsNavBottomMainMapper;
+import org.dromara.system.service.IVsNavBottomMainService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+import java.util.Objects;
+
+/**
+ * 底部主导航表Service业务层处理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@Slf4j
+@RequiredArgsConstructor
+@Service
+public class VsNavBottomMainServiceImpl implements IVsNavBottomMainService {
+
+    private final VsNavBottomMainMapper baseMapper;
+
+    /**
+     * 查询底部主导航表
+     *
+     * @param navId 主键
+     * @return 底部主导航表
+     */
+    @Override
+    public VsNavBottomMainVo queryById(Long navId) {
+        return baseMapper.selectVoById(navId);
+    }
+
+    /**
+     * 分页查询底部主导航表列表
+     *
+     * @param bo        查询条件
+     * @param pageQuery 分页参数
+     * @return 底部主导航表分页列表
+     */
+    @Override
+    public TableDataInfo<VsNavBottomMainVo> queryPageList(VsNavBottomMainBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<VsNavBottomMain> lqw = buildQueryWrapper(bo);
+        Page<VsNavBottomMainVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询符合条件的底部主导航表列表
+     *
+     * @param bo 查询条件
+     * @return 底部主导航表列表
+     */
+    @Override
+    public List<VsNavBottomMainVo> queryList(VsNavBottomMainBo bo) {
+        LambdaQueryWrapper<VsNavBottomMain> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<VsNavBottomMain> buildQueryWrapper(VsNavBottomMainBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<VsNavBottomMain> lqw = Wrappers.lambdaQuery();
+        lqw.eq(bo.getNavId() != null, VsNavBottomMain::getNavId, bo.getNavId());
+        lqw.like(StringUtils.isNotBlank(bo.getName()), VsNavBottomMain::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), VsNavBottomMain::getType, bo.getType());
+        lqw.eq(Objects.nonNull(bo.getJumpType()), VsNavBottomMain::getJumpType, bo.getJumpType());
+        lqw.eq(Objects.nonNull(bo.getStatus()), VsNavBottomMain::getStatus, bo.getStatus());
+        lqw.eq(bo.getShowFlag() != null, VsNavBottomMain::getShowFlag, bo.getShowFlag());
+        lqw.orderByAsc(VsNavBottomMain::getSortNum);
+        return lqw;
+    }
+
+    /**
+     * 新增底部主导航表
+     *
+     * @param bo 底部主导航表
+     * @return 是否新增成功
+     */
+    @Override
+    public Boolean insertByBo(VsNavBottomMainBo bo) {
+        VsNavBottomMain add = MapstructUtils.convert(bo, VsNavBottomMain.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setNavId(add.getNavId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改底部主导航表
+     *
+     * @param bo 底部主导航表
+     * @return 是否修改成功
+     */
+    @Override
+    public Boolean updateByBo(VsNavBottomMainBo bo) {
+        VsNavBottomMain update = MapstructUtils.convert(bo, VsNavBottomMain.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     *
+     * @param entity 实体类数据
+     */
+    private void validEntityBeforeSave(VsNavBottomMain entity) {
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除底部主导航表
+     *
+     * @param ids     需要删除的主键集合
+     * @param isValid 是否校验,true-删除前校验,false-不校验
+     * @return 是否删除成功
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    /**
+     * 获取启用的底部主导航列表
+     *
+     * @return 底部主导航列表
+     */
+    @Override
+    public List<VsNavBottomMainVo> getEnabledNavList() {
+        return baseMapper.getEnabledNavList();
+    }
+
+    /**
+     * 根据类型获取导航列表
+     *
+     * @param type 类型
+     * @return 底部主导航列表
+     */
+    @Override
+    public List<VsNavBottomMainVo> getNavListByType(String type) {
+        return baseMapper.getNavListByType(type);
+    }
+}

+ 142 - 0
ruoyi-modules/ruoyi-game-event/src/main/java/org/dromara/system/service/impl/VsNavServiceToolbarServiceImpl.java

@@ -0,0 +1,142 @@
+package org.dromara.system.service.impl;
+
+import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.dromara.system.domain.bo.VsNavServiceToolbarBo;
+import org.dromara.system.domain.vo.VsNavServiceToolbarVo;
+import org.dromara.system.domain.VsNavServiceToolbar;
+import org.dromara.system.mapper.VsNavServiceToolbarMapper;
+import org.dromara.system.service.IVsNavServiceToolbarService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 服务区工具栏Service业务层处理
+ *
+ * @author system
+ * @date 2025-01-20
+ */
+@RequiredArgsConstructor
+@Service
+public class VsNavServiceToolbarServiceImpl implements IVsNavServiceToolbarService {
+
+    private final VsNavServiceToolbarMapper baseMapper;
+
+    /**
+     * 查询服务区工具栏
+     */
+    @Override
+    public VsNavServiceToolbarVo queryById(Long id) {
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 查询服务区工具栏列表
+     */
+    @Override
+    public TableDataInfo<VsNavServiceToolbarVo> queryPageList(VsNavServiceToolbarBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<VsNavServiceToolbar> lqw = buildQueryWrapper(bo);
+        Page<VsNavServiceToolbarVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询服务区工具栏列表
+     */
+    @Override
+    public List<VsNavServiceToolbarVo> queryList(VsNavServiceToolbarBo bo) {
+        LambdaQueryWrapper<VsNavServiceToolbar> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<VsNavServiceToolbar> buildQueryWrapper(VsNavServiceToolbarBo bo) {
+        Map<String, Object> params = bo.getParams();
+        LambdaQueryWrapper<VsNavServiceToolbar> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getName()), VsNavServiceToolbar::getName, bo.getName());
+        lqw.eq(StringUtils.isNotBlank(bo.getType()), VsNavServiceToolbar::getType, bo.getType());
+        lqw.eq(StringUtils.isNotBlank(bo.getPic()), VsNavServiceToolbar::getPic, bo.getPic());
+        lqw.eq(bo.getJumpType() != null, VsNavServiceToolbar::getJumpType, bo.getJumpType());
+        lqw.eq(StringUtils.isNotBlank(bo.getJumpPath()), VsNavServiceToolbar::getJumpPath, bo.getJumpPath());
+        lqw.eq(bo.getCategoryId() != null, VsNavServiceToolbar::getCategoryId, bo.getCategoryId());
+        lqw.eq(bo.getSortNum() != null, VsNavServiceToolbar::getSortNum, bo.getSortNum());
+        lqw.eq(bo.getStatus() != null, VsNavServiceToolbar::getStatus, bo.getStatus());
+        lqw.eq(bo.getShowFlag() != null, VsNavServiceToolbar::getShowFlag, bo.getShowFlag());
+        return lqw;
+    }
+
+    /**
+     * 新增服务区工具栏
+     */
+    @Override
+    public Boolean insertByBo(VsNavServiceToolbarBo bo) {
+        VsNavServiceToolbar add = MapstructUtils.convert(bo, VsNavServiceToolbar.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改服务区工具栏
+     */
+    @Override
+    public Boolean updateByBo(VsNavServiceToolbarBo bo) {
+        VsNavServiceToolbar update = MapstructUtils.convert(bo, VsNavServiceToolbar.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(VsNavServiceToolbar entity) {
+        // TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除服务区工具栏
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if (isValid) {
+            // TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+
+    /**
+     * 根据分类ID查询工具栏列表
+     */
+    @Override
+    public List<VsNavServiceToolbarVo> queryByCategoryId(Integer categoryId) {
+        LambdaQueryWrapper<VsNavServiceToolbar> lqw = Wrappers.lambdaQuery();
+        lqw.eq(VsNavServiceToolbar::getCategoryId, categoryId);
+        lqw.eq(VsNavServiceToolbar::getStatus, 0); // 只查询正常状态
+        lqw.eq(VsNavServiceToolbar::getShowFlag, 0); // 只查询显示状态
+        return baseMapper.selectVoList(lqw);
+    }
+
+    /**
+     * 根据分类ID查询工具栏列表(按排序号排序)
+     */
+    @Override
+    public List<VsNavServiceToolbarVo> queryByCategoryIdOrderBySort(Integer categoryId) {
+        LambdaQueryWrapper<VsNavServiceToolbar> lqw = Wrappers.lambdaQuery();
+        lqw.eq(VsNavServiceToolbar::getCategoryId, categoryId);
+        lqw.eq(VsNavServiceToolbar::getStatus, 0); // 只查询正常状态
+        lqw.eq(VsNavServiceToolbar::getShowFlag, 0); // 只查询显示状态
+        lqw.orderByAsc(VsNavServiceToolbar::getSortNum); // 按排序号升序
+        return baseMapper.selectVoList(lqw);
+    }
+}

+ 42 - 0
ruoyi-modules/ruoyi-game-event/src/main/resources/mapper/system/VsNavBottomMainMapper.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.dromara.system.mapper.VsNavBottomMainMapper">
+
+    <resultMap type="org.dromara.system.domain.vo.VsNavBottomMainVo" id="VsNavBottomMainResult">
+        <result property="navId" column="nav_id"/>
+        <result property="name" column="name"/>
+        <result property="type" column="type"/>
+        <result property="pic" column="pic"/>
+        <result property="jumpType" column="jump_type"/>
+        <result property="jumpPath" column="jump_path"/>
+        <result property="appId" column="app_id"/>
+        <result property="sortNum" column="sort_num"/>
+        <result property="status" column="status"/>
+        <result property="showFlag" column="show_flag"/>
+        <result property="delFlag" column="del_flag"/>
+        <result property="createBy" column="create_by"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="remark" column="remark"/>
+        <result property="tenantId" column="tenant_id"/>
+        <result property="createDept" column="create_dept"/>
+    </resultMap>
+
+    <!-- 获取启用的底部主导航列表 -->
+    <select id="getEnabledNavList" resultMap="VsNavBottomMainResult">
+        SELECT * FROM common_vs_nav_bottom_main
+        WHERE status = 0 AND del_flag = 0
+        ORDER BY sort_num ASC
+    </select>
+
+    <!-- 根据类型获取导航列表 -->
+    <select id="getNavListByType" resultMap="VsNavBottomMainResult">
+        SELECT * FROM common_vs_nav_bottom_main
+        WHERE type = #{type} AND del_flag = 0
+        ORDER BY sort_num ASC
+    </select>
+
+</mapper>