diff --git a/src/main/java/com/youlai/boot/auth/service/impl/WxMaAuthServiceImpl.java b/src/main/java/com/youlai/boot/auth/service/impl/WxMaAuthServiceImpl.java index 7053024..62321c7 100644 --- a/src/main/java/com/youlai/boot/auth/service/impl/WxMaAuthServiceImpl.java +++ b/src/main/java/com/youlai/boot/auth/service/impl/WxMaAuthServiceImpl.java @@ -184,6 +184,7 @@ public class WxMaAuthServiceImpl implements WxMaAuthService { private SysUser createNewUser(String mobile) { SysUser user = new SysUser(); user.setMobile(mobile); + user.setUuid(IdUtil.fastSimpleUUID()); user.setUsername("wx_" + IdUtil.fastSimpleUUID().substring(0, 8)); user.setNickname("微信用户"); user.setStatus(1); diff --git a/src/main/java/com/youlai/boot/mini/controller/HomePageController.java b/src/main/java/com/youlai/boot/mini/controller/HomePageController.java new file mode 100644 index 0000000..5bc8304 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/controller/HomePageController.java @@ -0,0 +1,27 @@ +package com.youlai.boot.mini.controller; + + +import com.youlai.boot.common.result.Result; +import com.youlai.boot.mini.model.dto.MapSearchDTO; +import com.youlai.boot.mini.service.StrayAnimalService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@Tag(name = "首页的相关接口") +@RestController +@RequestMapping("/api/v1/mini/homePage") +@RequiredArgsConstructor +public class HomePageController { + + private final StrayAnimalService strayAnimalService; + + @Operation(summary = "根据地图边界获取流浪动物信息(不需要登录)") + @RequestMapping(value = "/listByBounds", method = RequestMethod.GET) + public Result listByMapBounds(MapSearchDTO mapSearch) { + return Result.success(strayAnimalService.listByMapBounds(mapSearch)); + } + +} + diff --git a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java index 0897d1d..56e01de 100644 --- a/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java +++ b/src/main/java/com/youlai/boot/mini/controller/StrayAnimalController.java @@ -4,12 +4,16 @@ import com.youlai.boot.common.annotation.Log; import com.youlai.boot.common.annotation.RepeatSubmit; import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; -import com.youlai.boot.common.model.Option; +import com.youlai.boot.common.result.PageResult; import com.youlai.boot.common.result.Result; +import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.dto.EditVisibilityDTO; import com.youlai.boot.mini.model.form.StrayAnimalForm; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; +import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; import com.youlai.boot.mini.service.StrayAnimalService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -19,7 +23,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; -import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -111,4 +114,32 @@ public class StrayAnimalController { return Result.success(); } + @Operation(summary = "获取自己登记创建的动物信息列表") + @GetMapping(value = "/getSelfCreatedPage") + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.LIST) + public PageResult getSelfCreatedPage( + OwnStrayAnimalQuery queryParams + ) { + return PageResult.success(strayAnimalService.getSelfCreatedPage(queryParams)); + } + + + @Operation(summary = "获取动物信息详情") + @RequestMapping(value = "/getDetails/{animalUuid}", method = RequestMethod.GET) + public Result getDetails( + @PathVariable String animalUuid){ + return Result.success(strayAnimalService.getDetails(animalUuid, SecurityUtils.getUserId())); + } + + + @Operation(summary = "获取某个用户登记创建的动物信息列表") + @GetMapping(value = "/getOthersCreatedPage/{authorUuid}") + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.LIST) + public PageResult getOthersCreatedPage( + @PathVariable String authorUuid, + OwnStrayAnimalQuery queryParams + ) { + return PageResult.success(strayAnimalService.getOthersCreatedPage(authorUuid, queryParams)); + } + } diff --git a/src/main/java/com/youlai/boot/mini/controller/UnauthenticatedController.java b/src/main/java/com/youlai/boot/mini/controller/UnauthenticatedController.java new file mode 100644 index 0000000..16fbf95 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/controller/UnauthenticatedController.java @@ -0,0 +1,59 @@ +package com.youlai.boot.mini.controller; + +import com.youlai.boot.common.annotation.Log; +import com.youlai.boot.common.annotation.RepeatSubmit; +import com.youlai.boot.common.enums.ActionTypeEnum; +import com.youlai.boot.common.enums.LogModuleEnum; +import com.youlai.boot.common.result.PageResult; +import com.youlai.boot.common.result.Result; +import com.youlai.boot.framework.security.util.SecurityUtils; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; +import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; +import com.youlai.boot.mini.model.dto.EditVisibilityDTO; +import com.youlai.boot.mini.model.form.StrayAnimalForm; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; +import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; +import com.youlai.boot.mini.service.StrayAnimalService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +/** + * 流浪动物信息 + */ +@Tag(name = "未登录状态下的相关接口") +@RestController +@RequestMapping("/api/v1/mini/public") +@RequiredArgsConstructor +public class UnauthenticatedController { + + private final StrayAnimalService strayAnimalService; + + + @Operation(summary = "获取动物信息详情)", operationId = "publicGetAnimalDetails") + @RequestMapping(value = "/strayAnimal/getDetails/{animalUuid}", method = RequestMethod.GET) + public Result getDetails( + @PathVariable String animalUuid){ + return Result.success(strayAnimalService.getDetails(animalUuid, null)); + } + + + @Operation(summary = "获取某个用户登记创建的动物信息列表", operationId = "publicGetOthersCreatedPage") + @GetMapping(value = "/strayAnimal/getOthersCreatedPage/{authorUuid}") + @Log(module = LogModuleEnum.STRAY_ANIMAL_INFO, value = ActionTypeEnum.LIST) + public PageResult getOthersCreatedPage( + @PathVariable String authorUuid, + OwnStrayAnimalQuery queryParams + ) { + return PageResult.success(strayAnimalService.getOthersCreatedPage(authorUuid, queryParams)); + } + +} diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java index 72946ec..65440d5 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalMapper.java @@ -1,7 +1,17 @@ package com.youlai.boot.mini.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.youlai.boot.mini.model.dto.MapSearchDTO; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; +import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalNearbyVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 流浪动物基础信息表 Mapper 接口 @@ -15,4 +25,9 @@ public interface MiniStrayAnimalMapper extends BaseMapper { void updateStrayAnimal(MiniStrayAnimal miniStrayAnimal); + IPage getAnimalPage(Page page, @Param("queryParams") OwnStrayAnimalQuery queryParams); + + StrayAnimalDetailsVO getStrayAnimalDetails(@Param("animalUuid") String animalUuid, @Param("miniUserId") Long miniUserId); + + List listByMapBounds(MapSearchDTO mapSearch); } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java index c326c67..0ebc1aa 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniStrayAnimalNoteMediaMapper.java @@ -2,16 +2,20 @@ package com.youlai.boot.mini.mapper; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteMedia; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.youlai.boot.mini.model.vo.MiniStrayAnimalNoteMediaVO; +import java.util.List; import java.util.Map; /** * 流浪信息资源表 Mapper 接口 * * @author jwy -* @since +* @since */ public interface MiniStrayAnimalNoteMediaMapper extends BaseMapper { int getMediaCountByNoteIdAndType(Map param); + + List getMediaByNoteIdAndType(Map param); } diff --git a/src/main/java/com/youlai/boot/mini/model/dto/MapBoundsDTO.java b/src/main/java/com/youlai/boot/mini/model/dto/MapBoundsDTO.java new file mode 100644 index 0000000..88f4ef4 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/dto/MapBoundsDTO.java @@ -0,0 +1,24 @@ +package com.youlai.boot.mini.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 地图视口边界请求参数 DTO + */ +@Data +public class MapBoundsDTO { + + @Schema(description = "地图窗口左下角经度") + private Double southWestLng; + + @Schema(description = "地图窗口左下角纬度") + private Double southWestLat; + + @Schema(description = "地图窗口右上角经度") + private Double northEastLng; + + @Schema(description = "地图窗口右上角纬度") + private Double northEastLat; +} + diff --git a/src/main/java/com/youlai/boot/mini/model/dto/MapSearchDTO.java b/src/main/java/com/youlai/boot/mini/model/dto/MapSearchDTO.java new file mode 100644 index 0000000..cb17c31 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/dto/MapSearchDTO.java @@ -0,0 +1,18 @@ +package com.youlai.boot.mini.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 地图视口边界请求参数 DTO + */ +@EqualsAndHashCode(callSuper = true) +@Data +public class MapSearchDTO extends MapBoundsDTO{ + + @Schema(description = "动物类型,cat-猫,dog-狗,other-其他", example = "cat") + private String animalType; + +} + diff --git a/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java b/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java index 5760a35..7f40ee3 100644 --- a/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java +++ b/src/main/java/com/youlai/boot/mini/model/entity/MiniStrayAnimalNoteMedia.java @@ -60,10 +60,6 @@ public class MiniStrayAnimalNoteMedia implements Serializable { @Schema(description = "时长(秒,视频用)") private Integer duration; - @TableField("sort_order") - @Schema(description = "排序顺序") - private Long sortOrder; - @TableField("create_time") @Schema(description = "创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") diff --git a/src/main/java/com/youlai/boot/mini/model/query/OwnStrayAnimalQuery.java b/src/main/java/com/youlai/boot/mini/model/query/OwnStrayAnimalQuery.java new file mode 100644 index 0000000..bc38593 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/query/OwnStrayAnimalQuery.java @@ -0,0 +1,18 @@ +package com.youlai.boot.mini.model.query; + +import com.youlai.boot.common.base.BaseQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class OwnStrayAnimalQuery extends StrayAnimalQuery { + + @Schema(description = "登录用户ID", example = "1", hidden = true) + private Long miniUserId; + + @Schema(description = "创建动物的用户ID", example = "1", hidden = true) + private Long creatorId; + +} diff --git a/src/main/java/com/youlai/boot/mini/model/query/StrayAnimalQuery.java b/src/main/java/com/youlai/boot/mini/model/query/StrayAnimalQuery.java new file mode 100644 index 0000000..e8a254d --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/query/StrayAnimalQuery.java @@ -0,0 +1,20 @@ +package com.youlai.boot.mini.model.query; + +import com.youlai.boot.common.base.BaseQuery; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class StrayAnimalQuery extends BaseQuery { + + @Schema(description = "动物类型,cat-猫,dog-狗,other-其他", example = "cat") + private String animalType; + + @Schema(description = "起始登记时间,毫秒级时间戳", example = "1776426078459") + private Long createStartTimestamp; + + @Schema(description = "截止登记时间,毫秒级时间戳", example = "1776426078459") + private Long createEndTimestamp; +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/MiniStrayAnimalNoteMediaVO.java b/src/main/java/com/youlai/boot/mini/model/vo/MiniStrayAnimalNoteMediaVO.java new file mode 100644 index 0000000..4f4f7d4 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/MiniStrayAnimalNoteMediaVO.java @@ -0,0 +1,36 @@ +package com.youlai.boot.mini.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class MiniStrayAnimalNoteMediaVO { + + @Schema(type = "string", description = "资源ID") + private String noteMediaUuid; + + @Schema(type = "string", description = "动物笔记UUID", example = "0677d62d63ec693bf1bd6dab8a877dc1", requiredMode = Schema.RequiredMode.REQUIRED) + private String noteUuid; + + @Schema(description = "媒体类型,image-图片,video-视频") + private String mediaType; + + @Schema(description = "资源URL") + private String sourceUrl; + + @Schema(description = "对象存储中的key") + private String storageKey; + + @Schema(description = "缩略图URL(视频需要)") + private String thumbnailUrl; + + @Schema(description = "宽度(像素)") + private Integer width; + + @Schema(description = "高度(像素)") + private Integer height; + + @Schema(description = "时长(秒,视频用)") + private Integer duration; + +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalDetailsVO.java b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalDetailsVO.java new file mode 100644 index 0000000..34b9d9c --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalDetailsVO.java @@ -0,0 +1,46 @@ +package com.youlai.boot.mini.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + + +@Data +public class StrayAnimalDetailsVO extends StrayAnimalShortVO { + + @Schema(description = "颜色", example = "白色") + private String color; + + @Schema(description = "体型,small-小,medium-中等,large-大", example = "medium") + private String size; + + @Schema(description = "状态,found-发现,adopted-已被领养,missing-失踪", example = "missing", requiredMode = Schema.RequiredMode.REQUIRED) + private String status="found"; + + @Schema(description = "经度", example = "118.08125") + private Double lng; + + @Schema(description = "纬度", example = "24.606929") + private Double lat; + + @Schema(description = "省", example = "福建省") + private String province; + + @Schema(description = "市", example = "厦门市") + private String city; + + @Schema(description = "区(县)", example = "集美区") + private String district; + + @Schema(description = "完整详细地址,含省市区(县)", example = "福建省厦门市集美区侨英街道莲花尚院1号院") + private String address; + + @Schema(description = "图片信息", example = "[]") + private List images; + + @Schema(description = "视频信息", example = "[]") + private List videos; + +} + diff --git a/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalNearbyVO.java b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalNearbyVO.java new file mode 100644 index 0000000..04055d9 --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalNearbyVO.java @@ -0,0 +1,28 @@ +package com.youlai.boot.mini.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data +public class StrayAnimalNearbyVO { + + @Schema(type = "string", description = "动物信息UUID", example = "0677d62d63ec693bf1bd6dab8a877dc1", requiredMode = Schema.RequiredMode.REQUIRED) + private String animalUuid; + + @Schema(description = "动物类型,cat-猫,dog-狗,other-其他") + private String animalType; + + @Schema(description = "颜色") + private String color; + + @Schema(description = "体型大小,small-小,medium-中等,large-大") + private String size; + + @Schema(description = "经度") + private Double lng; + + @Schema(description = "纬度") + private Double lat; + +} diff --git a/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalShortVO.java b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalShortVO.java new file mode 100644 index 0000000..b07deab --- /dev/null +++ b/src/main/java/com/youlai/boot/mini/model/vo/StrayAnimalShortVO.java @@ -0,0 +1,89 @@ +package com.youlai.boot.mini.model.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + + +@Data +public class StrayAnimalShortVO { + + @Schema(description = "作者uuid", example = "true") + private String authorUuid; + + @Schema(description = "作者昵称", example = "true") + private String authorName; + + @Schema(description = "作者头像", example = "true") + private String authorAvatar; + + @Schema(type = "string", description = "动物信息UUID", example = "0677d62d63ec693bf1bd6dab8a877dc1", requiredMode = Schema.RequiredMode.REQUIRED) + private String animalUuid; + + @Schema(type = "string", description = "动物笔记UUID", example = "0677d62d63ec693bf1bd6dab8a877dc1", requiredMode = Schema.RequiredMode.REQUIRED) + private String animalNoteUuid; + + @Schema(description = "封面图片url", example = "https://pet-map.oss-cn-beijing.aliyuncs.com/animal_note/18ec68e743a0bba8c85f441fbce08/17441599158f190n30q.jpg") + private String firstImageUrl; + + @Schema(description = "动物类型,cat-猫,dog-狗,other-其他", example = "cat", requiredMode = Schema.RequiredMode.REQUIRED) + private String animalType; + +// @Schema(description = "颜色", example = "白色") +// private String color; +// +// @Schema(description = "体型,small-小,medium-中等,large-大", example = "medium") +// private String size; + +// @Schema(description = "状态,found-发现,adopted-已被领养,missing-失踪", example = "missing", requiredMode = Schema.RequiredMode.REQUIRED) +// private String status="found"; + + @Schema(description = "笔记标题", example = "在公园发现的小猫", requiredMode = Schema.RequiredMode.REQUIRED) + private String title; + + @Schema(description = "笔记内容", example = "今天下午在人民公园看到一只走失的小猫") + private String content; + + @Schema(description = "可见性范围:public-公开,private-仅自己,friends-仅好友", example = "public") + private String visibility="public"; + +// @Schema(description = "经度", example = "118.08125") +// private Double lng; +// +// @Schema(description = "纬度", example = "24.606929") +// private Double lat; +// +// @Schema(description = "省", example = "福建省") +// private String province; +// +// @Schema(description = "市", example = "厦门市") +// private String city; +// +// @Schema(description = "区(县)", example = "集美区") +// private String district; +// +// @Schema(description = "完整详细地址,含省市区(县)", example = "福建省厦门市集美区侨英街道莲花尚院1号院") +// private String address; + + @Schema(description = "浏览数", example = "118") + private Integer viewCount; + + @Schema(description = "点赞数", example = "125") + private Integer likeCount; + + @Schema(description = "评论数", example = "125") + private Integer commentCount; + + @Schema(description = "收藏数", example = "125") + private Integer collectCount; + + @Schema(description = "当前用户是否已点赞", example = "false") + private Boolean isLiked; + + @Schema(description = "当前用户是否收藏", example = "false") + private Boolean isCollected; + + @Schema(description = "审核状态:0通过,1审核中,2审核未通过", example = "0") + private Integer auditStatus; + +} + diff --git a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java index 834f336..9629cbd 100644 --- a/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java +++ b/src/main/java/com/youlai/boot/mini/service/StrayAnimalService.java @@ -1,12 +1,17 @@ package com.youlai.boot.mini.service; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; -import com.youlai.boot.common.result.Result; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.dto.EditVisibilityDTO; +import com.youlai.boot.mini.model.dto.MapSearchDTO; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.form.StrayAnimalForm; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; +import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalNearbyVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; import jakarta.validation.Valid; import org.springframework.web.multipart.MultipartFile; @@ -25,5 +30,13 @@ public interface StrayAnimalService extends IService { void updateVisibility(String animalUuid, EditVisibilityDTO editVisibilityDTO); void delete(DeleteStrayAnimalDTO deleteStrayAnimalDTO); + + IPage getSelfCreatedPage(OwnStrayAnimalQuery queryParams); + + StrayAnimalDetailsVO getDetails(String animalUuid, Long miniUserId); + + IPage getOthersCreatedPage(String authorUuid, OwnStrayAnimalQuery queryParams); + + List listByMapBounds(MapSearchDTO mapSearch); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java index 6fc83b1..23fabd9 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/StrayAnimalServiceImpl.java @@ -3,8 +3,11 @@ package com.youlai.boot.mini.service.impl; import ch.hsr.geohash.GeoHash; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.youlai.boot.common.constant.CommonConstants; import com.youlai.boot.common.exception.MsgException; @@ -21,12 +24,20 @@ import com.youlai.boot.mini.mapper.MiniStrayAnimalNoteMediaMapper; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalDTO; import com.youlai.boot.mini.model.dto.DeleteStrayAnimalNoteMediaDTO; import com.youlai.boot.mini.model.dto.EditVisibilityDTO; +import com.youlai.boot.mini.model.dto.MapSearchDTO; import com.youlai.boot.mini.model.enums.AnimalNoteMediaTypeEnum; import com.youlai.boot.mini.model.entity.MiniStrayAnimal; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNote; import com.youlai.boot.mini.model.entity.MiniStrayAnimalNoteMedia; import com.youlai.boot.mini.model.form.StrayAnimalForm; +import com.youlai.boot.mini.model.query.OwnStrayAnimalQuery; +import com.youlai.boot.mini.model.vo.MiniStrayAnimalNoteMediaVO; +import com.youlai.boot.mini.model.vo.StrayAnimalDetailsVO; +import com.youlai.boot.mini.model.vo.StrayAnimalNearbyVO; +import com.youlai.boot.mini.model.vo.StrayAnimalShortVO; import com.youlai.boot.mini.service.StrayAnimalService; +import com.youlai.boot.system.mapper.UserMapper; +import com.youlai.boot.system.model.entity.SysUser; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; @@ -34,6 +45,7 @@ import org.apache.commons.io.FilenameUtils; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.Point; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -51,14 +63,26 @@ import java.util.*; @Slf4j public class StrayAnimalServiceImpl extends ServiceImpl implements StrayAnimalService { + @Value("${oss.aliyun.endpoint}") + private String endpoint; + + @Value("${oss.aliyun.bucket-name}") + private String bucketName; + + private final AliyunFileService aliyunFileService; private final MiniStrayAnimalNoteMapper miniStrayAnimalNoteMapper; private final MiniStrayAnimalNoteMediaMapper miniStrayAnimalNoteMediaMapper; private final MiniStrayAnimalMapper miniStrayAnimalMapper; + private final UserMapper userMapper; private final MiniStrayAnimalConverter miniStrayAnimalConverter; + public String getDefaultCatCoverHost() { + return "https://" + bucketName + "." + endpoint; + } + @Override @Transactional(rollbackFor = Exception.class) @@ -81,7 +105,6 @@ public class StrayAnimalServiceImpl extends ServiceImpl images, List videos, long currentTimestamp) { - long sortOrder = currentTimestamp; // 处理图片 if (images != null) { for (MultipartFile image : images) { @@ -101,7 +124,6 @@ public class StrayAnimalServiceImpl extends ServiceImpl getSelfCreatedPage(OwnStrayAnimalQuery queryParams) { + queryParams.setMiniUserId(SecurityUtils.getUserId()); + queryParams.setCreatorId(SecurityUtils.getUserId()); + return getAnimalPage(queryParams); + } + + private IPage getAnimalPage(OwnStrayAnimalQuery queryParams) { + // 参数构建 + int pageNum = queryParams.getPageNum(); + int pageSize = queryParams.getPageSize(); + Page page = new Page<>(pageNum, pageSize); + + IPage result = this.miniStrayAnimalMapper.getAnimalPage(page, queryParams); + if (result.getTotal() > 0) { + result.getRecords().forEach(item -> { + if (StrUtil.isBlank(item.getFirstImageUrl())) { + switch (item.getAnimalType()) { + case "cat": + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_cat.png"); + break; + case "dog": + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_dog.png"); + break; + default: + item.setFirstImageUrl(getDefaultCatCoverHost() + "/default_other.png"); + break; + } + } + }); + } + // 查询数据 + return result; + } + + @Override + public StrayAnimalDetailsVO getDetails(String animalUuid, Long miniUserId) { + // 校验动物是否存在 + MiniStrayAnimal animal = getValidAnimal(animalUuid); + + StrayAnimalDetailsVO strayAnimalDetailsVO = miniStrayAnimalMapper.getStrayAnimalDetails(animalUuid, miniUserId); + + MiniStrayAnimalNote appStrayAnimalNote = miniStrayAnimalNoteMapper.selectOne(new LambdaQueryWrapper() + .eq(MiniStrayAnimalNote::getStrayAnimalId, animal.getId())); + if (appStrayAnimalNote != null) { + Map param = new HashMap<>(); + param.put("noteId", appStrayAnimalNote.getId()); + + param.put("mediaType", AnimalNoteMediaTypeEnum.IMAGE.name().toLowerCase()); + List images = miniStrayAnimalNoteMediaMapper.getMediaByNoteIdAndType(param); + if (CollectionUtils.isNotEmpty(images)) { + images.forEach(item -> { + item.setNoteUuid(appStrayAnimalNote.getUuid()); + }); + } + + param.put("mediaType", AnimalNoteMediaTypeEnum.VIDEO.name().toLowerCase()); + List videos = miniStrayAnimalNoteMediaMapper.getMediaByNoteIdAndType(param); + if (CollectionUtils.isNotEmpty(videos)) { + videos.forEach(item -> { + item.setNoteUuid(appStrayAnimalNote.getUuid()); + }); + } + + strayAnimalDetailsVO.setImages(images); + strayAnimalDetailsVO.setVideos(videos); + } + + return strayAnimalDetailsVO; + } + + @Override + public IPage getOthersCreatedPage(String authorUuid, OwnStrayAnimalQuery queryParams) { + SysUser sysUser = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUuid, authorUuid) + .eq(SysUser::getIsDeleted, 0)); + if (sysUser == null) { + throw new MsgException("用户不存在"); + } + + queryParams.setMiniUserId(SecurityUtils.getUserId()); + queryParams.setCreatorId(sysUser.getId()); + return getAnimalPage(queryParams); + } + + @Override + public List listByMapBounds(MapSearchDTO mapSearch) { + if (mapSearch.getNorthEastLng() == null || mapSearch.getNorthEastLat() == null + || mapSearch.getSouthWestLng() == null || mapSearch.getSouthWestLat() == null) { + throw new MsgException("地图边界参数未完整填写"); + } + + double[] wgs84 = CoordinateTransformUtils.gcj02ToWgs84(mapSearch.getNorthEastLng(), mapSearch.getNorthEastLat()); + mapSearch.setNorthEastLat(wgs84[1]); + mapSearch.setNorthEastLng(wgs84[0]); + + double[] wgs842 = CoordinateTransformUtils.gcj02ToWgs84(mapSearch.getSouthWestLng(), mapSearch.getSouthWestLat()); + mapSearch.setSouthWestLat(wgs842[1]); + mapSearch.setSouthWestLng(wgs842[0]); + + return miniStrayAnimalMapper.listByMapBounds(mapSearch); + } + } diff --git a/src/main/java/com/youlai/boot/system/model/entity/SysUser.java b/src/main/java/com/youlai/boot/system/model/entity/SysUser.java index 92cc954..fc7dbbe 100644 --- a/src/main/java/com/youlai/boot/system/model/entity/SysUser.java +++ b/src/main/java/com/youlai/boot/system/model/entity/SysUser.java @@ -13,6 +13,11 @@ import lombok.Setter; @Setter public class SysUser extends BaseEntity { + /** + * uuid + */ + private String uuid; + /** * 用户名 */ @@ -72,4 +77,4 @@ public class SysUser extends BaseEntity { * 是否删除(0-否 1-是) */ private Integer isDeleted; -} \ No newline at end of file +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 4fb6ed5..16a2d8b 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -88,6 +88,8 @@ security: - /api/v1/auth/refresh-token # 刷新令牌接口 - /api/v1/wxma/auth/** # 微信小程序认证接口(静默登录/手机号快捷登录/绑定手机号) - /api/v1/logs/** # 日志接口(访问日志列表) + - /api/v1/mini/public/** + - /api/v1/mini/homePage/listByBounds - /healthcheck # 非安全端点路径,完全绕过 Spring Security 的过滤器 unsecured-urls: diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index eb5b995..0ad1f6e 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -88,6 +88,8 @@ security: - /api/v1/auth/refresh-token # 刷新令牌接口 - /api/v1/wxma/auth/** # 微信小程序认证接口(静默登录/手机号快捷登录/绑定手机号) - /api/v1/logs/** # 日志接口(访问日志列表) + - /api/v1/mini/public/** + - /api/v1/mini/homePage/listByBounds - /healthcheck # 非安全端点路径,完全绕过 Spring Security 的过滤器 unsecured-urls: diff --git a/src/main/resources/default-img/default_cat.png b/src/main/resources/default-img/default_cat.png new file mode 100644 index 0000000..670a31d Binary files /dev/null and b/src/main/resources/default-img/default_cat.png differ diff --git a/src/main/resources/default-img/default_dog.png b/src/main/resources/default-img/default_dog.png new file mode 100644 index 0000000..d509b9f Binary files /dev/null and b/src/main/resources/default-img/default_dog.png differ diff --git a/src/main/resources/default-img/default_other.png b/src/main/resources/default-img/default_other.png new file mode 100644 index 0000000..92e725d Binary files /dev/null and b/src/main/resources/default-img/default_other.png differ diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml index aaeab58..712a2c4 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalMapper.xml @@ -116,4 +116,180 @@ WHERE id = #{id} + + + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml index e7dbb62..c3dbe87 100644 --- a/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml +++ b/src/main/resources/mapper/mini/MiniStrayAnimalNoteMediaMapper.xml @@ -14,4 +14,21 @@ note_id = #{noteId} AND media_type = #{mediaType} + +