From 77c1155b38aeed78957eabbcb358bc1d3c89e86f Mon Sep 17 00:00:00 2001 From: MichaelWin Date: Mon, 22 Dec 2025 18:35:58 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=96=B0=E5=A2=9E=E3=80=91=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=A8=A1=E5=9D=97=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 9 +- .../common/enums/CommonDeleteFlagEnum.java | 19 ++ .../AppModel/ModelCategoryListRequest.java | 12 + .../AppModel/ModelCategoryPageRequest.java | 12 + .../app/dto/AppModel/ModelCreateRequest.java | 37 +++ .../AppModel/ModelDownloadLogListRequest.java | 12 + .../AppModel/ModelDownloadLogPageRequest.java | 12 + .../dto/AppModel/ModelDownloadRequest.java | 15 ++ .../AppModel/ModelFavoriteListRequest.java | 14 ++ .../AppModel/ModelFavoritePageRequest.java | 12 + .../dto/AppModel/ModelFavoriteRequest.java | 15 ++ .../app/dto/AppModel/ModelIdRequest.java | 15 ++ .../app/dto/AppModel/ModelLikeRequest.java | 15 ++ .../app/dto/AppModel/ModelListRequest.java | 23 ++ .../app/dto/AppModel/ModelPageRequest.java | 24 ++ .../corewing/app/dto/ModelPageRequest.java | 14 -- .../com/corewing/app/entity/AppModel.java | 11 +- .../corewing/app/entity/AppModelCategory.java | 1 + .../app/entity/AppModelDownloadLog.java | 1 + .../corewing/app/entity/AppModelFavorite.java | 3 +- .../app/handler/CustomMetaObjectHandler.java | 92 +++++++ .../app/handler/MyMetaObjectHandler.java | 35 --- .../app/mapper/AppModelCategoryMapper.java | 19 ++ .../app/mapper/AppModelDownloadLogMapper.java | 9 + .../app/mapper/AppModelFavoriteMapper.java | 9 + .../app/mapper/AppModelFileMapper.java | 9 + .../corewing/app/mapper/AppModelMapper.java | 28 +++ .../modules/app/AppContactMsgController.java | 4 + .../modules/app/AppFeedbackController.java | 11 + .../modules/app/AppFeedbackLogController.java | 4 + .../modules/app/AppFirmwareController.java | 7 + .../app/modules/app/AppModelController.java | 205 ++++++++++++++- .../app/AppParamsCenterController.java | 13 + .../app/AppPrivacyPolicyController.java | 5 + .../app/AppReplaySessionController.java | 6 + .../modules/app/AppTutorialController.java | 7 + .../app/modules/app/AppUserController.java | 15 ++ .../app/modules/app/AppVersionController.java | 4 + .../app/service/AppModelCategoryService.java | 23 ++ .../service/AppModelDownloadLogService.java | 8 + .../app/service/AppModelFavoriteService.java | 7 + .../app/service/AppModelFileService.java | 7 + .../corewing/app/service/AppModelService.java | 39 +++ .../impl/AppModelCategoryServiceImpl.java | 103 ++++++++ .../impl/AppModelDownloadLogServiceImpl.java | 11 + .../impl/AppModelFavoriteServiceImpl.java | 11 + .../service/impl/AppModelFileServiceImpl.java | 11 + .../app/service/impl/AppModelServiceImpl.java | 238 ++++++++++++++++++ .../corewing/app/util/CommonServletUtil.java | 83 ++++++ src/main/resources/application.properties | 47 +++- .../mapper/AppModelCategoryMapper.xml | 31 +++ src/main/resources/mapper/AppModelMapper.xml | 107 ++++++++ src/main/resources/static/favicon.ico | Bin 0 -> 9662 bytes 53 files changed, 1426 insertions(+), 58 deletions(-) create mode 100644 src/main/java/com/corewing/app/common/enums/CommonDeleteFlagEnum.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelCategoryListRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelCategoryPageRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelCreateRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogListRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogPageRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelDownloadRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteListRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelFavoritePageRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelIdRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelLikeRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelListRequest.java create mode 100644 src/main/java/com/corewing/app/dto/AppModel/ModelPageRequest.java delete mode 100644 src/main/java/com/corewing/app/dto/ModelPageRequest.java create mode 100644 src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java delete mode 100644 src/main/java/com/corewing/app/handler/MyMetaObjectHandler.java create mode 100644 src/main/java/com/corewing/app/mapper/AppModelCategoryMapper.java create mode 100644 src/main/java/com/corewing/app/mapper/AppModelDownloadLogMapper.java create mode 100644 src/main/java/com/corewing/app/mapper/AppModelFavoriteMapper.java create mode 100644 src/main/java/com/corewing/app/mapper/AppModelFileMapper.java create mode 100644 src/main/java/com/corewing/app/mapper/AppModelMapper.java create mode 100644 src/main/java/com/corewing/app/service/AppModelCategoryService.java create mode 100644 src/main/java/com/corewing/app/service/AppModelDownloadLogService.java create mode 100644 src/main/java/com/corewing/app/service/AppModelFavoriteService.java create mode 100644 src/main/java/com/corewing/app/service/AppModelFileService.java create mode 100644 src/main/java/com/corewing/app/service/AppModelService.java create mode 100644 src/main/java/com/corewing/app/service/impl/AppModelCategoryServiceImpl.java create mode 100644 src/main/java/com/corewing/app/service/impl/AppModelDownloadLogServiceImpl.java create mode 100644 src/main/java/com/corewing/app/service/impl/AppModelFavoriteServiceImpl.java create mode 100644 src/main/java/com/corewing/app/service/impl/AppModelFileServiceImpl.java create mode 100644 src/main/java/com/corewing/app/service/impl/AppModelServiceImpl.java create mode 100644 src/main/java/com/corewing/app/util/CommonServletUtil.java create mode 100644 src/main/resources/mapper/AppModelCategoryMapper.xml create mode 100644 src/main/resources/mapper/AppModelMapper.xml create mode 100755 src/main/resources/static/favicon.ico diff --git a/build.gradle b/build.gradle index 2079785..7ef5806 100644 --- a/build.gradle +++ b/build.gradle @@ -34,6 +34,8 @@ dependencies { implementation 'com.baomidou:mybatis-plus-generator' // 代码生成器 implementation("com.baomidou:mybatis-plus-jsqlparser") // SQL 解析器 implementation 'cn.dev33:sa-token-spring-boot-starter:1.44.0' // 权限认证 + implementation 'cn.dev33:sa-token-redis-template:1.44.0' // Sa-Token 整合 RedisTemplate + implementation 'org.apache.commons:commons-pool2' // 提供 Redis 连接池 implementation 'com.alibaba:druid-spring-boot-starter:1.2.27' // 数据库连接池 implementation 'org.lionsoul:ip2region:2.7.0' // IP 归属地 implementation 'org.springframework.boot:spring-boot-starter-data-mongodb' // mongodb @@ -43,7 +45,12 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' // Lombok 注解处理 testImplementation 'org.springframework.boot:spring-boot-starter-test' // 测试框架 implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' // thymeleaf模版引擎 - implementation 'com.aliyun.oss:aliyun-sdk-oss:3.18.1' // OSS SDK + implementation 'com.aliyun.oss:aliyun-sdk-oss:3.18.3' // OSS SDK + implementation 'cn.hutool:hutool-all:5.8.40' // hutool工具包 + implementation 'io.springfox:springfox-swagger2:2.10.5' + implementation 'com.github.xiaoymin:knife4j-openapi2-spring-boot-starter:4.4.0' + + } tasks.named('test') { diff --git a/src/main/java/com/corewing/app/common/enums/CommonDeleteFlagEnum.java b/src/main/java/com/corewing/app/common/enums/CommonDeleteFlagEnum.java new file mode 100644 index 0000000..7d5a026 --- /dev/null +++ b/src/main/java/com/corewing/app/common/enums/CommonDeleteFlagEnum.java @@ -0,0 +1,19 @@ +package com.corewing.app.common.enums; + +import lombok.Getter; + +/** + * 通用删除标志枚举 + * + * @author xuyuxiang + * @date 2021/10/11 14:02 + **/ +@Getter +public enum CommonDeleteFlagEnum { + + /** 未删除 */ + NOT_DELETE, + + /** 已删除 */ + DELETED +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryListRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryListRequest.java new file mode 100644 index 0000000..65fd45b --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryListRequest.java @@ -0,0 +1,12 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelCategoryListRequest { + + @ApiModelProperty(value = "搜索参数(分类名称)") + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryPageRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryPageRequest.java new file mode 100644 index 0000000..a96022a --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelCategoryPageRequest.java @@ -0,0 +1,12 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelCategoryPageRequest { + + @ApiModelProperty(value = "搜索参数(分类名称)") + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelCreateRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelCreateRequest.java new file mode 100644 index 0000000..40bfecb --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelCreateRequest.java @@ -0,0 +1,37 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Data +public class ModelCreateRequest { + + @ApiModelProperty(value = "模型标题", required = true) + @NotBlank(message = "模型标题不能为空") + private String title; + + @ApiModelProperty(value = "模型描述", required = true) + @NotBlank(message = "模型描述不能为空") + private String description; + + @ApiModelProperty(value = "模型分类id", required = true) + @NotBlank(message = "模型分类id不能为空") + private String categoryId; + + @ApiModelProperty(value = "模型封面", required = true) + @NotBlank(message = "模型封面不能为空") + private String coverImage; + + @ApiModelProperty(value = "备注", required = false) + private String remark; + + @ApiModelProperty("模型文件") + @NotNull(message = "模型文件不能为空") + private List files; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogListRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogListRequest.java new file mode 100644 index 0000000..098ab91 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogListRequest.java @@ -0,0 +1,12 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelDownloadLogListRequest { + + @ApiModelProperty(value = "模型标题", required = false) + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogPageRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogPageRequest.java new file mode 100644 index 0000000..d62d3d1 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadLogPageRequest.java @@ -0,0 +1,12 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelDownloadLogPageRequest { + + @ApiModelProperty(value = "模型标题", required = false) + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadRequest.java new file mode 100644 index 0000000..0d339a7 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelDownloadRequest.java @@ -0,0 +1,15 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ModelDownloadRequest { + + @ApiModelProperty(value = "模型id", required = true) + @NotBlank(message = "模型id不能为空") + private String modelId; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteListRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteListRequest.java new file mode 100644 index 0000000..4d51edf --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteListRequest.java @@ -0,0 +1,14 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ModelFavoriteListRequest { + + @ApiModelProperty(value = "模型标题", required = false) + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelFavoritePageRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoritePageRequest.java new file mode 100644 index 0000000..0cd3691 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoritePageRequest.java @@ -0,0 +1,12 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelFavoritePageRequest { + + @ApiModelProperty(value = "模型标题", required = false) + private String searchKey; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteRequest.java new file mode 100644 index 0000000..b4c4f8c --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelFavoriteRequest.java @@ -0,0 +1,15 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ModelFavoriteRequest { + + @ApiModelProperty(value = "模型id", required = true) + @NotBlank(message = "模型id不能为空") + private String modelId; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelIdRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelIdRequest.java new file mode 100644 index 0000000..41ff3b6 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelIdRequest.java @@ -0,0 +1,15 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ModelIdRequest { + + @ApiModelProperty(value = "模型id", required = true) + @NotBlank(message = "模型Id不能为空") + private String modelId; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelLikeRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelLikeRequest.java new file mode 100644 index 0000000..ac93933 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelLikeRequest.java @@ -0,0 +1,15 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class ModelLikeRequest { + + @ApiModelProperty(value = "模型id", required = true) + @NotBlank(message = "模型id不能为空") + private String modelId; + +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelListRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelListRequest.java new file mode 100644 index 0000000..42b95b1 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelListRequest.java @@ -0,0 +1,23 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelListRequest { + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "搜索参数(模型标题)") + private String searchKey; + + @ApiModelProperty(value = "模型状态(1正常 0下架 2审核中)") + private String status; + + @ApiModelProperty(value = "模型公布状态(1公开 0私有)") + private String isPublic; + + @ApiModelProperty(value = "分类id") + private String categoryId; +} diff --git a/src/main/java/com/corewing/app/dto/AppModel/ModelPageRequest.java b/src/main/java/com/corewing/app/dto/AppModel/ModelPageRequest.java new file mode 100644 index 0000000..646bd62 --- /dev/null +++ b/src/main/java/com/corewing/app/dto/AppModel/ModelPageRequest.java @@ -0,0 +1,24 @@ +package com.corewing.app.dto.AppModel; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class ModelPageRequest { + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "搜索参数(模型标题)") + private String searchKey; + + @ApiModelProperty(value = "模型状态(1正常 0下架 2审核中)") + private String status; + + @ApiModelProperty(value = "模型公布状态(1公开 0私有)") + private String isPublic; + + @ApiModelProperty(value = "分类id") + private String categoryId; + +} diff --git a/src/main/java/com/corewing/app/dto/ModelPageRequest.java b/src/main/java/com/corewing/app/dto/ModelPageRequest.java deleted file mode 100644 index eb9b46b..0000000 --- a/src/main/java/com/corewing/app/dto/ModelPageRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.corewing.app.dto; - -import lombok.Data; - -@Data -public class ModelPageRequest { - - private Long userId; - - private String searchKey; - - private String status; - -} diff --git a/src/main/java/com/corewing/app/entity/AppModel.java b/src/main/java/com/corewing/app/entity/AppModel.java index c047628..3181a1b 100644 --- a/src/main/java/com/corewing/app/entity/AppModel.java +++ b/src/main/java/com/corewing/app/entity/AppModel.java @@ -1,5 +1,6 @@ package com.corewing.app.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -7,6 +8,8 @@ import com.corewing.app.common.base.CommonEntity; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.List; + @EqualsAndHashCode(callSuper = true) @Data @TableName("app_model") @@ -40,7 +43,13 @@ public class AppModel extends CommonEntity { private String extJson; @TableField(exist = false) - private AppModelFile modelFile; + private List modelFile; + + /** + * 分类名称 + */ + @TableField(exist = false) + private String categoryTitle; } diff --git a/src/main/java/com/corewing/app/entity/AppModelCategory.java b/src/main/java/com/corewing/app/entity/AppModelCategory.java index 3de9481..380e414 100644 --- a/src/main/java/com/corewing/app/entity/AppModelCategory.java +++ b/src/main/java/com/corewing/app/entity/AppModelCategory.java @@ -1,5 +1,6 @@ package com.corewing.app.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.corewing.app.common.base.CommonEntity; diff --git a/src/main/java/com/corewing/app/entity/AppModelDownloadLog.java b/src/main/java/com/corewing/app/entity/AppModelDownloadLog.java index c8277b2..480e203 100644 --- a/src/main/java/com/corewing/app/entity/AppModelDownloadLog.java +++ b/src/main/java/com/corewing/app/entity/AppModelDownloadLog.java @@ -1,5 +1,6 @@ package com.corewing.app.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.corewing.app.common.base.CommonEntity; diff --git a/src/main/java/com/corewing/app/entity/AppModelFavorite.java b/src/main/java/com/corewing/app/entity/AppModelFavorite.java index b08734b..b537828 100644 --- a/src/main/java/com/corewing/app/entity/AppModelFavorite.java +++ b/src/main/java/com/corewing/app/entity/AppModelFavorite.java @@ -1,5 +1,6 @@ package com.corewing.app.entity; +import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.corewing.app.common.base.CommonEntity; @@ -14,7 +15,7 @@ public class AppModelFavorite extends CommonEntity { @TableId private Long id; - private String userId; + private Long userId; private String modelId; diff --git a/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java b/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java new file mode 100644 index 0000000..3925b2a --- /dev/null +++ b/src/main/java/com/corewing/app/handler/CustomMetaObjectHandler.java @@ -0,0 +1,92 @@ +package com.corewing.app.handler; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.util.EnumUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.corewing.app.common.enums.CommonDeleteFlagEnum; +import org.apache.ibatis.reflection.MetaObject; +import org.apache.ibatis.reflection.ReflectionException; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + * MyBatis-Plus 自动填充处理器 + * 用于自动填充创建时间和更新时间 + */ +@Component +public class CustomMetaObjectHandler implements MetaObjectHandler { + + /** 删除标志 */ + private static final String DELETE_FLAG = "deleteFlag"; + + /** 创建人 */ + private static final String CREATE_USER = "createUser"; + + /** 创建时间 */ + private static final String CREATE_TIME = "createTime"; + + /** 更新人 */ + private static final String UPDATE_USER = "updateUser"; + + /** 更新时间 */ + private static final String UPDATE_TIME = "updateTime"; + + @Override + public void insertFill(MetaObject metaObject) { + try { + //为空则设置deleteFlag + Object deleteFlag = metaObject.getValue(DELETE_FLAG); + if (ObjectUtil.isNull(deleteFlag)) { + setFieldValByName(DELETE_FLAG, EnumUtil.toString(CommonDeleteFlagEnum.NOT_DELETE), metaObject); + } + } catch (ReflectionException ignored) { } + try { + //为空则设置createUser + Object createUser = metaObject.getValue(CREATE_USER); + if (ObjectUtil.isNull(createUser)) { + setFieldValByName(CREATE_USER, this.getUserId(), metaObject); + } + } catch (ReflectionException ignored) { } + try { + //为空则设置createTime + Object createTime = metaObject.getValue(CREATE_TIME); + if (ObjectUtil.isNull(createTime)) { + setFieldValByName(CREATE_TIME, DateTime.now(), metaObject); + } + } catch (ReflectionException ignored) { } + } + + @Override + public void updateFill(MetaObject metaObject) { + try { + //设置updateUser + setFieldValByName(UPDATE_USER, this.getUserId(), metaObject); + } catch (ReflectionException ignored) { + } + try { + //设置updateTime + setFieldValByName(UPDATE_TIME, DateTime.now(), metaObject); + } catch (ReflectionException ignored) { + } + } + + /** + * 获取用户id + */ + private String getUserId() { + try { + String loginId = StpUtil.getLoginIdAsString(); + if (ObjectUtil.isNotEmpty(loginId)) { + return loginId; + } else { + return "-1"; + } + } catch (Exception e) { + return "-1"; + } + } +} diff --git a/src/main/java/com/corewing/app/handler/MyMetaObjectHandler.java b/src/main/java/com/corewing/app/handler/MyMetaObjectHandler.java deleted file mode 100644 index ab0bfd7..0000000 --- a/src/main/java/com/corewing/app/handler/MyMetaObjectHandler.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.corewing.app.handler; - -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import org.apache.ibatis.reflection.MetaObject; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; - -/** - * MyBatis-Plus 自动填充处理器 - * 用于自动填充创建时间和更新时间 - */ -@Component -public class MyMetaObjectHandler implements MetaObjectHandler { - - /** - * 插入时的填充策略 - */ - @Override - public void insertFill(MetaObject metaObject) { - // 自动填充创建时间 - this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); - // 自动填充更新时间 - this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); - } - - /** - * 更新时的填充策略 - */ - @Override - public void updateFill(MetaObject metaObject) { - // 自动填充更新时间 - this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); - } -} diff --git a/src/main/java/com/corewing/app/mapper/AppModelCategoryMapper.java b/src/main/java/com/corewing/app/mapper/AppModelCategoryMapper.java new file mode 100644 index 0000000..7252d95 --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AppModelCategoryMapper.java @@ -0,0 +1,19 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.corewing.app.dto.AppModel.ModelCategoryListRequest; +import com.corewing.app.dto.AppModel.ModelCategoryPageRequest; +import com.corewing.app.entity.AppModelCategory; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface AppModelCategoryMapper extends BaseMapper { + Page page(Page page, @Param("modelCategoryPageRequest") ModelCategoryPageRequest modelCategoryPageRequest); + + List list(@Param("modelCategoryListRequest") ModelCategoryListRequest modelCategoryListRequest); + +} diff --git a/src/main/java/com/corewing/app/mapper/AppModelDownloadLogMapper.java b/src/main/java/com/corewing/app/mapper/AppModelDownloadLogMapper.java new file mode 100644 index 0000000..3536448 --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AppModelDownloadLogMapper.java @@ -0,0 +1,9 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.corewing.app.entity.AppModelDownloadLog; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppModelDownloadLogMapper extends BaseMapper { +} diff --git a/src/main/java/com/corewing/app/mapper/AppModelFavoriteMapper.java b/src/main/java/com/corewing/app/mapper/AppModelFavoriteMapper.java new file mode 100644 index 0000000..165a7f4 --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AppModelFavoriteMapper.java @@ -0,0 +1,9 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.corewing.app.entity.AppModelFavorite; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppModelFavoriteMapper extends BaseMapper { +} diff --git a/src/main/java/com/corewing/app/mapper/AppModelFileMapper.java b/src/main/java/com/corewing/app/mapper/AppModelFileMapper.java new file mode 100644 index 0000000..c7fb8d1 --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AppModelFileMapper.java @@ -0,0 +1,9 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.corewing.app.entity.AppModelFile; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppModelFileMapper extends BaseMapper { +} diff --git a/src/main/java/com/corewing/app/mapper/AppModelMapper.java b/src/main/java/com/corewing/app/mapper/AppModelMapper.java new file mode 100644 index 0000000..aa3cb4d --- /dev/null +++ b/src/main/java/com/corewing/app/mapper/AppModelMapper.java @@ -0,0 +1,28 @@ +package com.corewing.app.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.corewing.app.dto.AppModel.*; +import com.corewing.app.entity.AppModel; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface AppModelMapper extends BaseMapper { + + Page page(Page page, @Param("modelPageRequest") ModelPageRequest modelPageRequest); + + List list(@Param("modelPageRequest") ModelListRequest modelListRequest); + + AppModel getModelById(@Param("modelId") String modelId); + + List favoriteList(@Param("userId") Long userId, @Param("modelFavoriteListRequest") ModelFavoriteListRequest modelFavoriteListRequest); + + Page favoritePage(Page page, @Param("userId") Long userId, @Param("modelFavoritePageRequest") ModelFavoritePageRequest modelFavoritePageRequest); + + List downloadLogList(@Param("userId") Long userId, @Param("modelDownloadLogListRequest") ModelDownloadLogListRequest modelDownloadLogListRequest); + + Page downloadLogPage(Page page, @Param("userId") Long userId, @Param("modelDownloadLogPageRequest") ModelDownloadLogPageRequest modelDownloadLogPageRequest); +} diff --git a/src/main/java/com/corewing/app/modules/app/AppContactMsgController.java b/src/main/java/com/corewing/app/modules/app/AppContactMsgController.java index 1575998..5d686ec 100644 --- a/src/main/java/com/corewing/app/modules/app/AppContactMsgController.java +++ b/src/main/java/com/corewing/app/modules/app/AppContactMsgController.java @@ -3,6 +3,8 @@ package com.corewing.app.modules.app; import com.corewing.app.common.Result; import com.corewing.app.entity.ContactMsg; import com.corewing.app.service.ContactMsgService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -10,6 +12,7 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +@Api(tags = "官网反馈消息接口") @RestController @RequestMapping("/contactMsg") public class AppContactMsgController { @@ -17,6 +20,7 @@ public class AppContactMsgController { @Resource private ContactMsgService contactMsgService; + @ApiOperation("消息保存接口") @PostMapping("/save") public Result save(@RequestBody ContactMsg contactMsg) { return Result.isBool(contactMsgService.save(contactMsg)); diff --git a/src/main/java/com/corewing/app/modules/app/AppFeedbackController.java b/src/main/java/com/corewing/app/modules/app/AppFeedbackController.java index 8815db5..52a0a7b 100644 --- a/src/main/java/com/corewing/app/modules/app/AppFeedbackController.java +++ b/src/main/java/com/corewing/app/modules/app/AppFeedbackController.java @@ -11,6 +11,8 @@ import com.corewing.app.util.DingTalkUtil; import com.corewing.app.util.I18nUtil; import com.corewing.app.util.Ip2RegionUtil; import com.corewing.app.util.IpUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -21,6 +23,7 @@ import java.util.List; /** * 问题反馈 Controller */ +@Api(tags = "问题反馈接口") @RestController @RequestMapping("/feedback") public class AppFeedbackController { @@ -38,6 +41,7 @@ public class AppFeedbackController { /** * 创建反馈(支持匿名提交) */ + @ApiOperation("创建反馈") @PostMapping public Result create(@RequestBody FeedbackRequest request, HttpServletRequest httpRequest) { try { @@ -75,6 +79,7 @@ public class AppFeedbackController { /** * 查询当前用户的反馈列表 */ + @ApiOperation("查询当前用户的反馈列表") @GetMapping("/my") public Result> getMyFeedbackList() { try { @@ -90,6 +95,7 @@ public class AppFeedbackController { /** * 根据ID查询反馈详情 */ + @ApiOperation("根据id查询反馈详情") @GetMapping("/{id}") public Result getById(@PathVariable Long id) { try { @@ -112,6 +118,7 @@ public class AppFeedbackController { * @param feedbackType 问题类型(可选) * @param status 状态(可选) */ + @ApiOperation("分页查询反馈列表") @GetMapping("/page") public Result> getPageList( @RequestParam(defaultValue = "1") Long current, @@ -131,6 +138,7 @@ public class AppFeedbackController { /** * 更新反馈状态 */ + @ApiOperation("更新反馈状态") @PutMapping("/{id}/status") public Result updateStatus(@PathVariable Long id, @RequestParam Integer status) { try { @@ -147,6 +155,7 @@ public class AppFeedbackController { /** * 删除反馈 */ + @ApiOperation("删除反馈") @DeleteMapping("/{id}") public Result delete(@PathVariable Long id) { try { @@ -163,6 +172,7 @@ public class AppFeedbackController { /** * 测试钉钉推送 */ + @ApiOperation("测试钉钉推送") @GetMapping("/test-dingtalk") public Result testDingTalk() { try { @@ -184,6 +194,7 @@ public class AppFeedbackController { /** * 发送反馈信息到钉钉 */ + @ApiOperation("发送反馈信息到钉钉") private void sendFeedbackToDingTalk(Feedback feedback, String submitIp, String submitRegion) { try { String title = I18nUtil.getMessage("dingtalk.feedback.title"); diff --git a/src/main/java/com/corewing/app/modules/app/AppFeedbackLogController.java b/src/main/java/com/corewing/app/modules/app/AppFeedbackLogController.java index 0abe930..006d2ff 100644 --- a/src/main/java/com/corewing/app/modules/app/AppFeedbackLogController.java +++ b/src/main/java/com/corewing/app/modules/app/AppFeedbackLogController.java @@ -3,6 +3,8 @@ package com.corewing.app.modules.app; import com.corewing.app.common.Result; import com.corewing.app.entity.FeedbackLog; import com.corewing.app.service.FeedbackLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,6 +15,7 @@ import javax.annotation.Resource; /** * 上传日志接口控制器 */ +@Api(tags = "反馈日志接口") @RestController @RequestMapping("/feedback_log") public class AppFeedbackLogController { @@ -25,6 +28,7 @@ public class AppFeedbackLogController { * @param feedbackLog * @return */ + @ApiOperation("上传日志") @PostMapping("/uploadFeedbackLog") public Result uploadFeedbackLog(MultipartFile file, FeedbackLog feedbackLog) { return Result.isBool(feedbackLogService.uploadFeedbackLog(file, feedbackLog)); diff --git a/src/main/java/com/corewing/app/modules/app/AppFirmwareController.java b/src/main/java/com/corewing/app/modules/app/AppFirmwareController.java index 2631ab4..7c0f7fd 100644 --- a/src/main/java/com/corewing/app/modules/app/AppFirmwareController.java +++ b/src/main/java/com/corewing/app/modules/app/AppFirmwareController.java @@ -7,12 +7,15 @@ import com.corewing.app.common.Result; import com.corewing.app.entity.Firmware; import com.corewing.app.service.FirmwareService; import com.corewing.app.util.I18nUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; /** * 固件 Controller */ +@Api(tags = "固件接口") @RestController @RequestMapping("/firmware") public class AppFirmwareController { @@ -26,6 +29,7 @@ public class AppFirmwareController { /** * 根据ID查询固件 */ + @ApiOperation("根据id查询固件") @GetMapping("/{id}") public Result getById(@PathVariable Long id) { Firmware firmware = firmwareService.getById(id); @@ -43,6 +47,7 @@ public class AppFirmwareController { * @param firmwareName 固件名称(可选) * @param firmwareType 固件类型(可选) */ + @ApiOperation("分页查询固件列表") @GetMapping("/page") public Result> page( @RequestParam(defaultValue = "1") Long current, @@ -73,6 +78,7 @@ public class AppFirmwareController { /** * 查询所有固件 */ + @ApiOperation("查询所有固件集合") @GetMapping("/list") public Result> list() { java.util.List list = firmwareService.list(); @@ -84,6 +90,7 @@ public class AppFirmwareController { * * @param firmwareType 固件类型 */ + @ApiOperation("根据类型查询固件版本") @GetMapping("/type/{firmwareType}") public Result> listByType(@PathVariable Integer firmwareType) { if (firmwareType == null) { diff --git a/src/main/java/com/corewing/app/modules/app/AppModelController.java b/src/main/java/com/corewing/app/modules/app/AppModelController.java index e9c68c7..945961e 100644 --- a/src/main/java/com/corewing/app/modules/app/AppModelController.java +++ b/src/main/java/com/corewing/app/modules/app/AppModelController.java @@ -1,27 +1,222 @@ package com.corewing.app.modules.app; +import cn.hutool.core.lang.tree.Tree; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.corewing.app.common.Result; -import com.corewing.app.dto.ModelPageRequest; +import com.corewing.app.dto.AppModel.*; import com.corewing.app.entity.AppModel; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.corewing.app.entity.AppModelCategory; +import com.corewing.app.service.AppModelCategoryService; +import com.corewing.app.service.AppModelService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.List; /** * 模型 */ @RestController @RequestMapping("/model") +@Validated +@Api(tags = "模型接口") public class AppModelController { + @Resource + private AppModelService appModelService; + + @Resource + private AppModelCategoryService appModelCategoryService; + /** - * 获取模型集合 + * 获取模型分页 * @param modelPageRequest * @return */ + @ApiOperation("模型数据分页") + @GetMapping("/page") public Result> page(ModelPageRequest modelPageRequest) { - return Result.success(); + return Result.success(appModelService.page(modelPageRequest)); + } + + /** + * 获取模型集合 + * @param modelListRequest + * @return + */ + @ApiOperation("模型数据集合") + @GetMapping("/list") + public Result> list(ModelListRequest modelListRequest) { + return Result.success(appModelService.list(modelListRequest)); } + /** + * 获取模型分类分页 + * @param modelCategoryPageRequest + * @return + */ + @ApiOperation("模型分类数据分页") + @GetMapping("/category/page") + public Result> categoryPage(ModelCategoryPageRequest modelCategoryPageRequest) { + return Result.success(appModelCategoryService.page(modelCategoryPageRequest)); + } + + /** + * 获取模型分类集合 + * @param modelCategoryListRequest + * @return + */ + @ApiOperation("模型分类数据集合") + @GetMapping("/category/list") + public Result> categoryList(ModelCategoryListRequest modelCategoryListRequest) { + return Result.success(appModelCategoryService.list(modelCategoryListRequest)); + } + + /** + * 获取模型分类树形集合 + * @param modelCategoryListRequest + * @return + */ + @ApiOperation("模型分类树形集合") + @GetMapping("/category/tree") + public Result>> categoryTree(ModelCategoryListRequest modelCategoryListRequest) { + return Result.success(appModelCategoryService.tree(modelCategoryListRequest)); + } + + /** + * 模型收藏 + * @param modelFavoriteRequest + * @return + */ + @ApiOperation("收藏模型") + @PostMapping("/favorite") + public Result favorite(@RequestBody @Valid ModelFavoriteRequest modelFavoriteRequest) { + return Result.isBool(appModelService.favorite(modelFavoriteRequest)); + } + + /** + * 增加模型下载记录 + * @param modelDownloadRequest + * @return + */ + @ApiOperation("增加模型下载记录") + @PostMapping("/download") + public Result download(@RequestBody @Valid ModelDownloadRequest modelDownloadRequest) { + return Result.isBool(appModelService.download(modelDownloadRequest)); + } + + /** + * 点赞模型 + * @param modelLikeRequest + * @return + */ + @ApiOperation("点赞模型") + @PostMapping("/like") + public Result like(@RequestBody @Valid ModelLikeRequest modelLikeRequest) { + return Result.isBool(appModelService.like(modelLikeRequest)); + } + + /** + * 模型详情 + * @return + */ + @ApiOperation("模型详情") + @GetMapping("/detail/{modelId}") + public Result detail(@PathVariable String modelId) { + return Result.success(appModelService.detail(modelId)); + } + + /** + * 创建模型 + * @param modelCreateRequest + * @return + */ + @ApiOperation("创建模型") + @PostMapping("/create") + public Result create(@Valid ModelCreateRequest modelCreateRequest) { + return Result.isBool(appModelService.create(modelCreateRequest)); + } + + /** + * 提交模型审核 + * @param modelIdRequest + * @return + */ + @ApiOperation("提交模型审核") + @PostMapping("/audit") + public Result audit(@RequestBody @Valid ModelIdRequest modelIdRequest) { + return Result.isBool(appModelService.audit(modelIdRequest)); + } + + /** + * 获取收藏列表 + * @param modelFavoriteListRequest + * @return + */ + @ApiOperation("收藏模型列表") + @GetMapping("/favorite/list") + public Result> favoriteList(ModelFavoriteListRequest modelFavoriteListRequest) { + return Result.success(appModelService.favoriteList(modelFavoriteListRequest)); + } + + /** + * 获取收藏分页列表 + * @param modelFavoritePageRequest + * @return + */ + @ApiOperation("收藏模型分页列表") + @GetMapping("/favorite/page") + public Result> favoritePage(ModelFavoritePageRequest modelFavoritePageRequest) { + return Result.success(appModelService.favoritePage(modelFavoritePageRequest)); + } + + /** + * 模型下架 + * @param modelIdRequest + * @return + */ + @ApiOperation("模型下架") + @PostMapping("/delisted") + public Result delisted(@RequestBody @Valid ModelIdRequest modelIdRequest) { + return Result.isBool(appModelService.delisted(modelIdRequest)); + } + + + /** + * 模型下载记录列表 + * @param modelDownloadLogListRequest + * @return + */ + @ApiOperation("模型下载记录列表") + @GetMapping("/download_log/list") + public Result> downloadLogList(ModelDownloadLogListRequest modelDownloadLogListRequest) { + return Result.success(appModelService.downloadLogList(modelDownloadLogListRequest)); + } + + /** + * 模型下载记录分页列表 + * @param modelDownloadLogPageRequest + * @return + */ + @ApiOperation("模型下载记录分页列表") + @GetMapping("/download_log/page") + public Result> downloadLogPage(ModelDownloadLogPageRequest modelDownloadLogPageRequest) { + return Result.success(appModelService.downloadLogPage(modelDownloadLogPageRequest)); + } + + /** + * 删除模型 + * @return + */ + @ApiOperation("删除模型") + @DeleteMapping("/delete/{id}") + public Result delete(@PathVariable String id) { + return Result.isBool(appModelService.delete(id)); + } + } diff --git a/src/main/java/com/corewing/app/modules/app/AppParamsCenterController.java b/src/main/java/com/corewing/app/modules/app/AppParamsCenterController.java index 8be3e1f..33272bb 100644 --- a/src/main/java/com/corewing/app/modules/app/AppParamsCenterController.java +++ b/src/main/java/com/corewing/app/modules/app/AppParamsCenterController.java @@ -10,6 +10,8 @@ import com.corewing.app.entity.ParamsCenter; import com.corewing.app.service.ParamsCenterService; import com.corewing.app.util.I18nUtil; import com.corewing.app.vo.ParamsCenterVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; @@ -18,6 +20,7 @@ import java.util.List; /** * 参数配置中心 Controller */ +@Api(tags = "参数配置中心接口") @RestController @RequestMapping("/params") public class AppParamsCenterController { @@ -31,6 +34,7 @@ public class AppParamsCenterController { /** * 创建参数配置 */ + @ApiOperation("创建参数配置接口") @PostMapping public Result create(@Valid @RequestBody CreateParamRequest request) { try { @@ -60,6 +64,7 @@ public class AppParamsCenterController { /** * 更新参数配置 */ + @ApiOperation("更新参数配置接口") @PutMapping public Result update(@Valid @RequestBody UpdateParamRequest request) { try { @@ -97,6 +102,7 @@ public class AppParamsCenterController { /** * 删除参数配置 */ + @ApiOperation("根据id删除参数配置") @DeleteMapping("/{id}") public Result delete(@PathVariable Long id) { try { @@ -124,6 +130,7 @@ public class AppParamsCenterController { /** * 根据ID查询参数配置 */ + @ApiOperation("根据id查询参数配置") @GetMapping("/{id}") public Result getById(@PathVariable Long id) { try { @@ -146,6 +153,7 @@ public class AppParamsCenterController { /** * 查询所有公共参数列表(公开接口,支持飞控型号过滤) */ + @ApiOperation("获取所有公共参数集合") @GetMapping("/all/list") public Result> listAll(@RequestParam(required = false) String fcModel) { try { @@ -159,6 +167,7 @@ public class AppParamsCenterController { /** * 查询当前用户的参数列表(支持飞控型号过滤) */ + @ApiOperation("获取当前用户的参数列表") @GetMapping("/my/list") public Result> listMy(@RequestParam(required = false) String fcModel) { try { @@ -173,6 +182,7 @@ public class AppParamsCenterController { /** * 分页查询所有参数列表(公开接口,支持飞控型号过滤) */ + @ApiOperation("分页查询所有公共参数集合") @GetMapping("/all/page") public Result> pageAll( @RequestParam(defaultValue = "1") Long current, @@ -190,6 +200,7 @@ public class AppParamsCenterController { /** * 分页查询当前用户的参数列表(支持飞控型号过滤) */ + @ApiOperation("分页查询当前用户参数列表") @GetMapping("/my/page") public Result> pageMy( @RequestParam(defaultValue = "1") Long current, @@ -208,6 +219,7 @@ public class AppParamsCenterController { /** * 增加下载次数 */ + @ApiOperation("增加参数中心下载次数") @PostMapping("/{id}/download") public Result incrementDownloadCount(@PathVariable Long id) { try { @@ -236,6 +248,7 @@ public class AppParamsCenterController { * @param id * @return */ + @ApiOperation("发布公共参数提交审核") @GetMapping("/review/{id}") public Result review(@PathVariable Long id) { try { diff --git a/src/main/java/com/corewing/app/modules/app/AppPrivacyPolicyController.java b/src/main/java/com/corewing/app/modules/app/AppPrivacyPolicyController.java index b1e2b9a..1ec36e3 100644 --- a/src/main/java/com/corewing/app/modules/app/AppPrivacyPolicyController.java +++ b/src/main/java/com/corewing/app/modules/app/AppPrivacyPolicyController.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.corewing.app.common.Result; import com.corewing.app.entity.PrivacyPolicy; import com.corewing.app.service.PrivacyPolicyService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.GetMapping; @@ -17,6 +19,7 @@ import java.util.List; /** * 隐私政策与协议 */ +@Api(tags = "隐私政策与协议") @Controller @RequestMapping("/privacy_policy") public class AppPrivacyPolicyController { @@ -28,6 +31,7 @@ public class AppPrivacyPolicyController { * 隐私政策列表 * @return */ + @ApiOperation("隐私政策列表") @GetMapping("/view_list/{lang}") public String viewList(@PathVariable String lang, ModelMap modelMap) { List list = privacyPolicyService.list(); @@ -42,6 +46,7 @@ public class AppPrivacyPolicyController { * @param category * @return */ + @ApiOperation("根据类型获取集合数据") @GetMapping("/getListByCategory/{category}") @ResponseBody public Result getListByCategory(@PathVariable Integer category) { diff --git a/src/main/java/com/corewing/app/modules/app/AppReplaySessionController.java b/src/main/java/com/corewing/app/modules/app/AppReplaySessionController.java index 455aace..dc943d3 100644 --- a/src/main/java/com/corewing/app/modules/app/AppReplaySessionController.java +++ b/src/main/java/com/corewing/app/modules/app/AppReplaySessionController.java @@ -5,11 +5,14 @@ import com.corewing.app.common.Result; import com.corewing.app.dto.uploadReplaySessionRequest; import com.corewing.app.entity.ReplaySession; import com.corewing.app.service.ReplaySessionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; +@Api(tags = "飞行记录接口") @RestController @RequestMapping("/replay-session") public class AppReplaySessionController { @@ -21,6 +24,7 @@ public class AppReplaySessionController { * 获取飞行记录 * @return */ + @ApiOperation("获取当前用户飞行记录") @GetMapping("/getReplayList") public Result> getReplayList() { return Result.success(replaySessionService.getReplayList(StpUtil.getLoginId())); @@ -31,6 +35,7 @@ public class AppReplaySessionController { * @param uploadReplaySessionRequests * @return */ + @ApiOperation("上传飞行记录") @PostMapping("/uploadReplaySession") public Result uploadReplaySession(@RequestBody List uploadReplaySessionRequests) { return Result.isBool(replaySessionService.uploadReplaySession(uploadReplaySessionRequests)); @@ -41,6 +46,7 @@ public class AppReplaySessionController { * @param syncId * @return */ + @ApiOperation("根据同步id删除飞行记录") @DeleteMapping("/deleteReplaySession/{syncId}") public Result deleteReplaySession(@PathVariable String syncId) { return Result.isBool(replaySessionService.deleteReplaySession(syncId)); diff --git a/src/main/java/com/corewing/app/modules/app/AppTutorialController.java b/src/main/java/com/corewing/app/modules/app/AppTutorialController.java index 785a984..dee648d 100644 --- a/src/main/java/com/corewing/app/modules/app/AppTutorialController.java +++ b/src/main/java/com/corewing/app/modules/app/AppTutorialController.java @@ -9,6 +9,8 @@ import com.corewing.app.entity.TutorialCategory; import com.corewing.app.service.TutorialCategoryService; import com.corewing.app.service.TutorialService; import com.corewing.app.util.I18nUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; @@ -19,6 +21,7 @@ import java.util.List; /** * 教程接口 */ +@Api(tags = "教程接口") @RequestMapping("/tutorial") @Controller @Slf4j @@ -38,6 +41,7 @@ public class AppTutorialController { * @param model 数据模型 * @return 详情页 */ + @ApiOperation("跳转到界面查看教程详情") @GetMapping("/viewDetail/{tutorialId}") public String viewDetail(@PathVariable Long tutorialId, ModelMap model) { Tutorial tutorial = tutorialService.getById(tutorialId); @@ -51,6 +55,7 @@ public class AppTutorialController { * @param tutorialId 教程id * @return */ + @ApiOperation("添加查看次数") @GetMapping("/addViewCount") @ResponseBody public Result addViewCount(@RequestParam Long tutorialId) { @@ -69,6 +74,7 @@ public class AppTutorialController { * @param firstStatus 置首状态(选填) * */ + @ApiOperation("分类查询集合") @GetMapping("/category") @ResponseBody public Result> category( @@ -91,6 +97,7 @@ public class AppTutorialController { * @param tutorialTitle 教程标题(选填) * */ + @ApiOperation("分页查询教程列表") @GetMapping("/page") @ResponseBody public Result> getPageList( diff --git a/src/main/java/com/corewing/app/modules/app/AppUserController.java b/src/main/java/com/corewing/app/modules/app/AppUserController.java index 3603188..a7b7369 100755 --- a/src/main/java/com/corewing/app/modules/app/AppUserController.java +++ b/src/main/java/com/corewing/app/modules/app/AppUserController.java @@ -8,6 +8,8 @@ import com.corewing.app.service.UserService; import com.corewing.app.service.VerifyCodeService; import com.corewing.app.util.I18nUtil; import com.corewing.app.util.IpUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -18,6 +20,7 @@ import java.util.Map; /** * 应用用户 Controller */ +@Api(tags = "用户接口") @RestController @RequestMapping("/user") public class AppUserController { @@ -33,6 +36,7 @@ public class AppUserController { /** * 发送验证码 */ + @ApiOperation("发送验证码接口") @PostMapping("/sendCode") public Result sendCode(@RequestBody SendCodeRequest request) { try { @@ -49,6 +53,7 @@ public class AppUserController { /** * 用户登录(支持用户名/邮箱/手机号) */ + @ApiOperation("用户登录接口") @PostMapping("/login") public Result> login(@RequestBody LoginRequest request, HttpServletRequest httpRequest) { try { @@ -73,6 +78,7 @@ public class AppUserController { /** * 用户注册(需要验证码) */ + @ApiOperation("用户注册接口") @PostMapping("/register") public Result register(@RequestBody RegisterRequest request, HttpServletRequest httpRequest) { try { @@ -95,6 +101,7 @@ public class AppUserController { /** * 用户登出 */ + @ApiOperation("用户登出接口") @PostMapping("/logout") public Result logout() { StpUtil.logout(); @@ -104,6 +111,7 @@ public class AppUserController { /** * 获取当前登录用户信息 */ + @ApiOperation("获取当前登录用户信息") @GetMapping("/info") public Result getUserInfo() { Long userId = StpUtil.getLoginIdAsLong(); @@ -116,6 +124,7 @@ public class AppUserController { /** * 根据ID查询用户 */ + @ApiOperation("根据id查询用户") @GetMapping("/{id}") public Result getById(@PathVariable Long id) { User user = userService.getById(id); @@ -130,6 +139,7 @@ public class AppUserController { /** * 更新用户信息 */ + @ApiOperation("更新用户信息") @PutMapping("/update") public Result update(@RequestBody User user) { Long userId = StpUtil.getLoginIdAsLong(); @@ -146,6 +156,7 @@ public class AppUserController { /** * 修改密码 */ + @ApiOperation("用户修改密码") @PutMapping("/password") public Result updatePassword(@RequestBody UpdatePasswordRequest request) { try { @@ -178,6 +189,7 @@ public class AppUserController { * @param request * @return */ + @ApiOperation("忘记密码") @PutMapping("/forgetPassword") public Result forgetPassword(@RequestBody ForgetPasswordRequest request) { return Result.isBool(userService.forgetPassword(request)); @@ -187,6 +199,7 @@ public class AppUserController { * 验证码登录 * @return */ + @ApiOperation("验证码登录") @PostMapping("/codeLogin") public Result> codeLogin(@RequestBody CodeLoginRequest codeLoginRequest, HttpServletRequest request) { @@ -208,6 +221,7 @@ public class AppUserController { * @param logoffRequest * @return */ + @ApiOperation("注销用户") @DeleteMapping("/delete") public Result logoff(@RequestBody @Valid LogoffRequest logoffRequest) { return Result.isBool(userService.logoff(logoffRequest)); @@ -217,6 +231,7 @@ public class AppUserController { * 注销发送验证码 * @return */ + @ApiOperation("发送注销验证码") @PostMapping("/delete/sendCode") public Result> deleteSendCode() { return userService.deleteSendCode(); diff --git a/src/main/java/com/corewing/app/modules/app/AppVersionController.java b/src/main/java/com/corewing/app/modules/app/AppVersionController.java index 5c4b0d0..249b467 100644 --- a/src/main/java/com/corewing/app/modules/app/AppVersionController.java +++ b/src/main/java/com/corewing/app/modules/app/AppVersionController.java @@ -4,6 +4,8 @@ import com.corewing.app.common.Result; import com.corewing.app.dto.CheckVersionRequest; import com.corewing.app.entity.AppVersion; import com.corewing.app.service.AppVersionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -13,6 +15,7 @@ import javax.annotation.Resource; /** * app升级校验接口 */ +@Api(tags = "APP版本接口") @RestController @RequestMapping("/app_version") public class AppVersionController { @@ -25,6 +28,7 @@ public class AppVersionController { * @param checkVersionRequest * @return */ + @ApiOperation("校验是否有新版本") @GetMapping("/checkUpdate") public Result checkUpdate(CheckVersionRequest checkVersionRequest) { AppVersion version = appVersionService.getNewAppVersion(checkVersionRequest); diff --git a/src/main/java/com/corewing/app/service/AppModelCategoryService.java b/src/main/java/com/corewing/app/service/AppModelCategoryService.java new file mode 100644 index 0000000..9f2c226 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AppModelCategoryService.java @@ -0,0 +1,23 @@ +package com.corewing.app.service; + +import cn.hutool.core.lang.tree.Tree; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.dto.AppModel.ModelCategoryListRequest; +import com.corewing.app.dto.AppModel.ModelCategoryPageRequest; +import com.corewing.app.dto.AppModel.ModelDownloadRequest; +import com.corewing.app.dto.AppModel.ModelFavoriteRequest; +import com.corewing.app.entity.AppModelCategory; + +import javax.validation.Valid; +import java.util.List; + +public interface AppModelCategoryService extends IService { + + Page page(ModelCategoryPageRequest modelCategoryPageRequest); + + List list(ModelCategoryListRequest modelCategoryListRequest); + + List> tree(ModelCategoryListRequest modelCategoryListRequest); + +} diff --git a/src/main/java/com/corewing/app/service/AppModelDownloadLogService.java b/src/main/java/com/corewing/app/service/AppModelDownloadLogService.java new file mode 100644 index 0000000..824f5f4 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AppModelDownloadLogService.java @@ -0,0 +1,8 @@ +package com.corewing.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.entity.AppModelDownloadLog; + +public interface AppModelDownloadLogService extends IService { + +} diff --git a/src/main/java/com/corewing/app/service/AppModelFavoriteService.java b/src/main/java/com/corewing/app/service/AppModelFavoriteService.java new file mode 100644 index 0000000..99bd898 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AppModelFavoriteService.java @@ -0,0 +1,7 @@ +package com.corewing.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.entity.AppModelFavorite; + +public interface AppModelFavoriteService extends IService { +} diff --git a/src/main/java/com/corewing/app/service/AppModelFileService.java b/src/main/java/com/corewing/app/service/AppModelFileService.java new file mode 100644 index 0000000..1ef6784 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AppModelFileService.java @@ -0,0 +1,7 @@ +package com.corewing.app.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.entity.AppModelFile; + +public interface AppModelFileService extends IService { +} diff --git a/src/main/java/com/corewing/app/service/AppModelService.java b/src/main/java/com/corewing/app/service/AppModelService.java new file mode 100644 index 0000000..e1dc8a8 --- /dev/null +++ b/src/main/java/com/corewing/app/service/AppModelService.java @@ -0,0 +1,39 @@ +package com.corewing.app.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.corewing.app.dto.AppModel.*; +import com.corewing.app.entity.AppModel; + +import java.util.List; + +public interface AppModelService extends IService { + + Page page(ModelPageRequest modelPageRequest); + + List list(ModelListRequest modelListRequest); + + boolean like(ModelLikeRequest modelLikeRequest); + + boolean favorite(ModelFavoriteRequest modelFavoriteRequest); + + boolean download(ModelDownloadRequest modelDownloadRequest); + + AppModel detail(String modelId); + + boolean create(ModelCreateRequest modelCreateRequest); + + boolean audit(ModelIdRequest modelIdRequest); + + List favoriteList(ModelFavoriteListRequest modelFavoriteListRequest); + + Page favoritePage(ModelFavoritePageRequest modelFavoritePageRequest); + + boolean delisted(ModelIdRequest modelIdRequest); + + List downloadLogList(ModelDownloadLogListRequest modelDownloadLogListRequest); + + Page downloadLogPage(ModelDownloadLogPageRequest modelDownloadLogPageRequest); + + boolean delete(String id); +} diff --git a/src/main/java/com/corewing/app/service/impl/AppModelCategoryServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AppModelCategoryServiceImpl.java new file mode 100644 index 0000000..db4de9e --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AppModelCategoryServiceImpl.java @@ -0,0 +1,103 @@ +package com.corewing.app.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.tree.Tree; +import cn.hutool.core.lang.tree.TreeNode; +import cn.hutool.core.lang.tree.TreeUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.common.page.PageContext; +import com.corewing.app.dto.AppModel.ModelCategoryListRequest; +import com.corewing.app.dto.AppModel.ModelCategoryPageRequest; +import com.corewing.app.dto.AppModel.ModelDownloadRequest; +import com.corewing.app.dto.AppModel.ModelFavoriteRequest; +import com.corewing.app.entity.AppModel; +import com.corewing.app.entity.AppModelCategory; +import com.corewing.app.entity.AppModelDownloadLog; +import com.corewing.app.entity.AppModelFavorite; +import com.corewing.app.handler.GlobalExceptionHandler; +import com.corewing.app.mapper.AppModelCategoryMapper; +import com.corewing.app.service.AppModelCategoryService; +import com.corewing.app.service.AppModelDownloadLogService; +import com.corewing.app.service.AppModelFavoriteService; +import com.corewing.app.service.AppModelService; +import com.corewing.app.util.CommonServletUtil; +import com.corewing.app.util.IpUtil; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +@Service +public class AppModelCategoryServiceImpl extends ServiceImpl implements AppModelCategoryService { + + @Resource + private AppModelCategoryMapper appModelCategoryMapper; + + @Override + public Page page(ModelCategoryPageRequest modelCategoryPageRequest) { + Page page = PageContext.getPage(AppModelCategory.class); + return appModelCategoryMapper.page(page, modelCategoryPageRequest); + } + + @Override + public List list(ModelCategoryListRequest modelCategoryListRequest) { + return appModelCategoryMapper.list(modelCategoryListRequest); + } + + @Override + public List> tree(ModelCategoryListRequest modelCategoryListRequest) { + List resourceList = appModelCategoryMapper.list(modelCategoryListRequest); + + // 填充上层的父级菜单 + this.fillParentCategoryInfo(resourceList); + + List> treeNodeList = resourceList.stream().map(modelCategory -> + new TreeNode<>(modelCategory.getId(), modelCategory.getParentId(), + modelCategory.getName(), modelCategory.getSortCode()).setExtra(JSONUtil.parseObj(modelCategory))) + .collect(Collectors.toList()); + return TreeUtil.build(treeNodeList, "0"); + } + + + private void fillParentCategoryInfo(List categoryList) { + if(CollUtil.isNotEmpty(categoryList)){ + List parentModelCategoryList = categoryList.stream().filter(distinctByKey(AppModelCategory::getParentId)).collect(Collectors.toList()); + + List parentIds = null; + if(CollUtil.isNotEmpty(parentModelCategoryList)){ + parentIds = CollUtil.newArrayList(); + for(AppModelCategory parentCategory : categoryList){ + if(!StrUtil.equals(parentCategory.getParentId(),"0")){ + parentIds.add(parentCategory.getParentId()); + } + } + } + if(CollUtil.isNotEmpty(parentIds)){ + LambdaQueryWrapper parentCategoryLambdaQueryWrapper = new LambdaQueryWrapper<>(); + parentCategoryLambdaQueryWrapper.in(AppModelCategory::getId,parentIds); + List parentCategoryList = this.list(parentCategoryLambdaQueryWrapper); + if(CollUtil.isNotEmpty(parentCategoryList)){ + this.fillParentCategoryInfo(parentCategoryList); + categoryList.addAll(parentCategoryList); + } + } + } + } + + private static Predicate distinctByKey(Function keyExtractor) { + Set seen = ConcurrentHashMap.newKeySet(); + return t -> seen.add(keyExtractor.apply(t)); + } +} diff --git a/src/main/java/com/corewing/app/service/impl/AppModelDownloadLogServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AppModelDownloadLogServiceImpl.java new file mode 100644 index 0000000..0c6f615 --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AppModelDownloadLogServiceImpl.java @@ -0,0 +1,11 @@ +package com.corewing.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.entity.AppModelDownloadLog; +import com.corewing.app.mapper.AppModelDownloadLogMapper; +import com.corewing.app.service.AppModelDownloadLogService; +import org.springframework.stereotype.Service; + +@Service +public class AppModelDownloadLogServiceImpl extends ServiceImpl implements AppModelDownloadLogService { +} diff --git a/src/main/java/com/corewing/app/service/impl/AppModelFavoriteServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AppModelFavoriteServiceImpl.java new file mode 100644 index 0000000..09e231c --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AppModelFavoriteServiceImpl.java @@ -0,0 +1,11 @@ +package com.corewing.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.entity.AppModelFavorite; +import com.corewing.app.mapper.AppModelFavoriteMapper; +import com.corewing.app.service.AppModelFavoriteService; +import org.springframework.stereotype.Service; + +@Service +public class AppModelFavoriteServiceImpl extends ServiceImpl implements AppModelFavoriteService { +} diff --git a/src/main/java/com/corewing/app/service/impl/AppModelFileServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AppModelFileServiceImpl.java new file mode 100644 index 0000000..c12f924 --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AppModelFileServiceImpl.java @@ -0,0 +1,11 @@ +package com.corewing.app.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.entity.AppModelFile; +import com.corewing.app.mapper.AppModelFileMapper; +import com.corewing.app.service.AppModelFileService; +import org.springframework.stereotype.Service; + +@Service +public class AppModelFileServiceImpl extends ServiceImpl implements AppModelFileService { +} diff --git a/src/main/java/com/corewing/app/service/impl/AppModelServiceImpl.java b/src/main/java/com/corewing/app/service/impl/AppModelServiceImpl.java new file mode 100644 index 0000000..67fed4c --- /dev/null +++ b/src/main/java/com/corewing/app/service/impl/AppModelServiceImpl.java @@ -0,0 +1,238 @@ +package com.corewing.app.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.corewing.app.common.base.BaseEntity; +import com.corewing.app.common.enums.CommonDeleteFlagEnum; +import com.corewing.app.common.page.PageContext; +import com.corewing.app.dto.AppModel.*; +import com.corewing.app.entity.*; +import com.corewing.app.mapper.AppModelMapper; +import com.corewing.app.service.AppModelDownloadLogService; +import com.corewing.app.service.AppModelFavoriteService; +import com.corewing.app.service.AppModelFileService; +import com.corewing.app.service.AppModelService; +import com.corewing.app.util.CommonServletUtil; +import com.corewing.app.util.IpUtil; +import com.corewing.app.util.OSSUploadUtil; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.io.IOException; +import java.util.List; + +@Service +public class AppModelServiceImpl extends ServiceImpl implements AppModelService { + + @Resource + private AppModelMapper appModelMapper; + + @Resource + private AppModelFavoriteService modelFavoriteService; + + @Resource + private AppModelDownloadLogService modelDownloadLogService; + + @Resource + private AppModelFileService modelFileService; + + @Override + public Page page(ModelPageRequest modelPageRequest) { + Page page = PageContext.getPage(AppModel.class); + return appModelMapper.page(page, modelPageRequest); + } + + @Override + public List list(ModelListRequest modelListRequest) { + return appModelMapper.list(modelListRequest); + } + + @Override + public boolean like(ModelLikeRequest modelLikeRequest) { + AppModel appModel = this.getById(modelLikeRequest.getModelId()); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AppModel::getId, appModel.getId()); + updateWrapper.set(AppModel::getLikeCount, appModel.getLikeCount() + 1); + return this.update(updateWrapper); + } + + @Override + public boolean favorite(ModelFavoriteRequest modelFavoriteRequest) { + + // 校验是否已经收藏了 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModelFavorite::getModelId, modelFavoriteRequest.getModelId()); + if(modelFavoriteService.count(queryWrapper) > 0) { + throw new RuntimeException("已经收藏了"); + } + + AppModel appModel = this.getById(modelFavoriteRequest.getModelId()); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AppModel::getId, appModel.getId()); + updateWrapper.set(AppModel::getFavoriteCount, appModel.getFavoriteCount() + 1); + this.update(updateWrapper); + + AppModelFavorite modelFavorite = new AppModelFavorite(); + modelFavorite.setModelId(appModel.getId()); + modelFavorite.setUserId(Long.valueOf(StpUtil.getLoginId().toString())); + + return modelFavoriteService.save(modelFavorite); + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean download(ModelDownloadRequest modelDownloadRequest) { + AppModel appModel = this.getById(modelDownloadRequest.getModelId()); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AppModel::getId, appModel.getId()); + updateWrapper.set(AppModel::getDownloadCount, appModel.getDownloadCount() + 1); + this.update(updateWrapper); + + AppModelDownloadLog log = new AppModelDownloadLog(); + log.setModelId(appModel.getId()); + log.setUserId(Long.valueOf(StpUtil.getLoginId().toString())); + log.setIpAddress(IpUtil.getClientIp(CommonServletUtil.getRequest())); + + return modelDownloadLogService.save(log); + } + + @Override + public AppModel detail(String modelId) { + AppModel appModel = appModelMapper.getModelById(modelId); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModelFile::getModelId, modelId); + List list = modelFileService.list(queryWrapper); + if(list != null) { + appModel.setModelFile(list); + } + return appModel; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean create(ModelCreateRequest modelCreateRequest) { + + // 模型标题校验 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModel::getTitle, modelCreateRequest.getTitle()); + if(count(queryWrapper) > 0) { + throw new RuntimeException("模型标题已存在"); + } + + AppModel appModel = BeanUtil.toBean(modelCreateRequest, AppModel.class); + appModel.setIsPublic("0"); + appModel.setStatus("1"); + appModel.setUserId(Long.valueOf(StpUtil.getLoginId().toString())); + this.save(appModel); + + // 上传文件 + modelCreateRequest.getFiles().forEach(item -> { + try { + String downloadUrl = OSSUploadUtil.uploadFile(item.getInputStream(), "customModel/" + item.getOriginalFilename()); + AppModelFile modelFile = new AppModelFile(); + modelFile.setFileName(item.getOriginalFilename()); + modelFile.setFileUrl(downloadUrl); + modelFile.setFileSize(item.getSize()); + modelFile.setFileType(item.getContentType()); + modelFile.setModelId(appModel.getId()); + modelFileService.save(modelFile); + + } catch (IOException e) { + throw new RuntimeException("创建模型失败"); + } + }); + return true; + } + + @Transactional(rollbackFor = Exception.class) + @Override + public boolean audit(ModelIdRequest modelIdRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModel::getId, modelIdRequest.getModelId()); + queryWrapper.eq(AppModel::getUserId, StpUtil.getLoginId().toString()); + AppModel appModel = this.getOne(queryWrapper); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AppModel::getId, appModel.getId()); + updateWrapper.set(AppModel::getStatus, "2"); + return this.update(updateWrapper); + } + + @Override + public List favoriteList(ModelFavoriteListRequest modelFavoriteListRequest) { + return appModelMapper.favoriteList(Long.valueOf(StpUtil.getLoginId().toString()), modelFavoriteListRequest); + } + + @Override + public Page favoritePage(ModelFavoritePageRequest modelFavoritePageRequest) { + Page page = PageContext.getPage(AppModel.class); + return appModelMapper.favoritePage(page, Long.valueOf(StpUtil.getLoginId().toString()), modelFavoritePageRequest); + } + + @Override + public boolean delisted(ModelIdRequest modelIdRequest) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModel::getId, modelIdRequest.getModelId()); + queryWrapper.eq(AppModel::getUserId, StpUtil.getLoginId().toString()); + AppModel appModel = this.getOne(queryWrapper); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + // 下架模型后,强制将公开状态转私有,模型状态转为下架 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(AppModel::getId, appModel.getId()); + updateWrapper.set(AppModel::getStatus, "0"); + updateWrapper.set(AppModel::getIsPublic, "0"); + return this.update(updateWrapper); + } + + @Override + public List downloadLogList(ModelDownloadLogListRequest modelDownloadLogListRequest) { + return appModelMapper.downloadLogList(Long.valueOf(StpUtil.getLoginId().toString()), modelDownloadLogListRequest); + } + + @Override + public Page downloadLogPage(ModelDownloadLogPageRequest modelDownloadLogPageRequest) { + Page page = PageContext.getPage(AppModel.class); + return appModelMapper.downloadLogPage(page, Long.valueOf(StpUtil.getLoginId().toString()), modelDownloadLogPageRequest); + } + + @Override + public boolean delete(String id) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AppModel::getId, id); + queryWrapper.eq(AppModel::getUserId, StpUtil.getLoginId().toString()); + AppModel appModel = this.getOne(queryWrapper); + if(appModel == null) { + throw new RuntimeException("该模型不存在"); + } + return this.removeById(appModel.getId()); + } + + +} diff --git a/src/main/java/com/corewing/app/util/CommonServletUtil.java b/src/main/java/com/corewing/app/util/CommonServletUtil.java new file mode 100644 index 0000000..2a6137c --- /dev/null +++ b/src/main/java/com/corewing/app/util/CommonServletUtil.java @@ -0,0 +1,83 @@ +package com.corewing.app.util; + +import cn.hutool.core.util.ObjectUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * HttpServlet工具类,获取当前request和response + */ +@Slf4j +public class CommonServletUtil { + + /** + * 从请求中中获取参数 + * + * @author xuyuxiang + * @date 2021/10/14 10:44 + **/ + public static String getParamFromRequest(String paramName) { + HttpServletRequest request = getRequest(); + + // 1. 尝试从请求体里面读取 + String paramValue = request.getParameter(paramName); + + // 2. 尝试从header里读取 + if (ObjectUtil.isEmpty(paramValue)) { + paramValue = request.getHeader(paramName); + } + // 3. 尝试从cookie里读取 + if (ObjectUtil.isEmpty(paramValue)) { + Cookie[] cookies = request.getCookies(); + if(ObjectUtil.isNotEmpty(cookies)) { + for (Cookie cookie : cookies) { + String cookieName = cookie.getName(); + if (cookieName.equals(paramName)) { + return cookie.getValue(); + } + } + } + } + // 4. 返回 + return paramValue; + } + + public static HttpServletRequest getRequest() { + ServletRequestAttributes servletRequestAttributes; + try { + servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } catch (Exception e) { + log.error(">>> 非Web上下文无法获取Request:", e); + throw new RuntimeException("非Web上下文无法获取Request"); + } + if (servletRequestAttributes == null) { + throw new RuntimeException("非Web上下文无法获取Request"); + } else { + return servletRequestAttributes.getRequest(); + } + } + + public static HttpServletResponse getResponse() { + ServletRequestAttributes servletRequestAttributes; + try { + servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } catch (Exception e) { + log.error(">>> 非Web上下文无法获取Response:", e); + throw new RuntimeException("非Web上下文无法获取Response"); + } + if (servletRequestAttributes == null) { + throw new RuntimeException("非Web上下文无法获取Response"); + } else { + return servletRequestAttributes.getResponse(); + } + } + + public static boolean isWeb() { + return RequestContextHolder.getRequestAttributes() != null; + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9424d99..3a1fc1e 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -36,8 +36,15 @@ mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml mybatis-plus.type-aliases-package=com.corewing.app.entity mybatis-plus.configuration.map-underscore-to-camel-case=true mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl -mybatis-plus.global-config.db-config.id-type=AUTO +mybatis-plus.global-config.db-config.id-type=ASSIGN_ID mybatis-plus.global-config.db-config.table-prefix= +# ========== 逻辑删除核心配置 ========== +# 1. 自定义逻辑删除字段名(替换为你的字段,如 is_delete、del_flag 等) +mybatis-plus.global-config.db-config.logic-delete-field=del_flag +# 2. 逻辑未删除值(替换为你的业务未删除值,如 0、false、N 等) +mybatis-plus.global-config.db-config.logic-not-delete-value=NOT_DELETE +# 3. 逻辑已删除值(替换为你的业务已删除值,如 1、true、Y 等) +mybatis-plus.global-config.db-config.logic-delete-value=DELETE # Redis 配置 spring.redis.host=localhost @@ -95,3 +102,41 @@ spring.mail.properties.mail.smtp.socketFactory.fallback=false dingtalk.webhook=https://oapi.dingtalk.com/robot/send?access_token=7eed4b3483303c9ec71ef37a08c347bb597fd4c64211a96a8f55f72405ff6444 # 如果使用加签安全设置,请填写密钥(secret) dingtalk.secret=SEC0f2b835f28139905e3c0b5be979b215df1735f1154f36514aafbae8708014148 + + + +# ===================== Knife4j 核心增强配置 ===================== +# 启用Knife4j增强模式 +knife4j.enable=true +knife4j.setting.language=zh_cn +knife4j.basic.enable=true +knife4j.basic.username=corewing +knife4j.basic.password=Aaa123.. +# ===================== Knife4j OpenAPI 全局文档配置 ===================== +# 文档标题 +knife4j.openapi.title=CoreWing APP API +# 文档描述(支持Markdown,换行用\n,特殊符号保留) + +knife4j.openapi.description= +# 作者邮箱 +knife4j.openapi.email= +# 联系人 +knife4j.openapi.concat= +# 文档官网地址 +knife4j.openapi.url= +# 文档版本 +knife4j.openapi.version=v1.0 +# 许可证 +knife4j.openapi.license= + + + +# ===================== Knife4j 分组配置 ===================== +# 分组名称 +knife4j.openapi.group.test1.group-name=APP接口 +# 接口扫描规则:package(按包扫描)、path(按路径匹配)、api(按注解匹配) +knife4j.openapi.group.test1.api-rule=package +# 按包扫描的资源(数组,用[索引]标识多个包) +knife4j.openapi.group.test1.api-rule-resources[0]=com.corewing.app.modules.app +# 若有多个包,继续添加索引 +# knife4j.openapi.group.test1.api-rule-resources[1]=com.knife4j.demo.new4 diff --git a/src/main/resources/mapper/AppModelCategoryMapper.xml b/src/main/resources/mapper/AppModelCategoryMapper.xml new file mode 100644 index 0000000..c95b177 --- /dev/null +++ b/src/main/resources/mapper/AppModelCategoryMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + select mc.* + from app_model_category mc + + + + + + + + diff --git a/src/main/resources/mapper/AppModelMapper.xml b/src/main/resources/mapper/AppModelMapper.xml new file mode 100644 index 0000000..529f0ed --- /dev/null +++ b/src/main/resources/mapper/AppModelMapper.xml @@ -0,0 +1,107 @@ + + + + + + + + select m.*,mc.name as categoryTitle + from app_model m + left join app_model_category mc on m.category_id = mc.id + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100755 index 0000000000000000000000000000000000000000..127e754c5fb532121c511852abe4e0667a9b1ce3 GIT binary patch literal 9662 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 literal 0 HcmV?d00001