Browse Source

feat:宝宝信息相关接口 ,喂养记录接口

survive 13 hours ago
parent
commit
8d754cdddd
34 changed files with 1090 additions and 99 deletions
  1. 10 0
      babyApplication-dao/src/main/java/edu/travel/mapper/BtBabyInfoMapper.java
  2. 2 0
      babyApplication-dao/src/main/java/edu/travel/mapper/BtFeedRecordMapper.java
  3. 12 0
      babyApplication-dao/src/main/java/edu/travel/mapper/MtRelativeRoleMapper.java
  4. 0 8
      babyApplication-dao/src/main/java/edu/travel/mapper/MtRelativeRolesMapper.java
  5. 4 4
      babyApplication-dao/src/main/resources/mapper/BtFeedRecordMapper.xml
  6. 2 2
      babyApplication-dao/src/main/resources/mapper/MtRelativeRoleMapper.xml
  7. 10 0
      babyApplication-model/babyApplication-model-entity/pom.xml
  8. 46 0
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/BabyInfoDTO.java
  9. 24 0
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/BabyQueryDTO.java
  10. 55 0
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/FeedRecordCreateDTO.java
  11. 0 1
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/UpdateAccountDto.java
  12. 75 0
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtBabyInfo.java
  13. 4 4
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtBabyUserRelation.java
  14. 16 45
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtFeedRecord.java
  15. 1 1
      babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/MtRelativeRole.java
  16. 5 0
      babyApplication-service/pom.xml
  17. 27 0
      babyApplication-service/src/main/java/edu/travel/enumm/BloodType.java
  18. 24 0
      babyApplication-service/src/main/java/edu/travel/service/BtBabyInfoService.java
  19. 5 2
      babyApplication-service/src/main/java/edu/travel/service/BtFeedRecordService.java
  20. 7 0
      babyApplication-service/src/main/java/edu/travel/service/MtRelativeRoleService.java
  21. 0 8
      babyApplication-service/src/main/java/edu/travel/service/MtRelativeRolesService.java
  22. 400 0
      babyApplication-service/src/main/java/edu/travel/service/impl/BtBabyInfoServiceImpl.java
  23. 107 2
      babyApplication-service/src/main/java/edu/travel/service/impl/BtFeedRecordServiceImpl.java
  24. 14 0
      babyApplication-service/src/main/java/edu/travel/service/impl/MtRelativeRoleServiceImpl.java
  25. 0 17
      babyApplication-service/src/main/java/edu/travel/service/impl/MtRelativeRolesServiceImpl.java
  26. 25 0
      babyApplication-service/src/main/java/edu/travel/util/ConstellationUtil.java
  27. 28 0
      babyApplication-service/src/main/java/edu/travel/vo/BabyDetailVO.java
  28. 21 0
      babyApplication-service/src/main/java/edu/travel/vo/BabyInfoVO.java
  29. 21 0
      babyApplication-service/src/main/java/edu/travel/vo/BabyListItemVO.java
  30. 20 0
      babyApplication-service/src/main/java/edu/travel/vo/PageResult.java
  31. 11 0
      babyApplication-service/src/main/java/edu/travel/vo/RelativeVO.java
  32. 1 0
      babyApplication-web/src/main/java/edu/travel/config/SecurityConfig.java
  33. 89 0
      babyApplication-web/src/main/java/edu/travel/web/BabyInfoController.java
  34. 24 5
      babyApplication-web/src/main/java/edu/travel/web/BtFeedRecordController.java

+ 10 - 0
babyApplication-dao/src/main/java/edu/travel/mapper/BtBabyInfoMapper.java

@@ -0,0 +1,10 @@
+package edu.travel.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import edu.travel.entity.BtBabyInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface BtBabyInfoMapper extends BaseMapper<BtBabyInfo> {
+}

+ 2 - 0
babyApplication-dao/src/main/java/edu/travel/mapper/BtFeedRecordMapper.java

@@ -2,7 +2,9 @@ package edu.travel.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import edu.travel.entity.BtFeedRecord;
+import org.apache.ibatis.annotations.Mapper;
 
+@Mapper
 public interface BtFeedRecordMapper extends BaseMapper<BtFeedRecord> {
 
 }

+ 12 - 0
babyApplication-dao/src/main/java/edu/travel/mapper/MtRelativeRoleMapper.java

@@ -0,0 +1,12 @@
+package edu.travel.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import edu.travel.entity.BtBabyUserRelation;
+import edu.travel.entity.MtRelativeRole;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface MtRelativeRoleMapper extends BaseMapper<MtRelativeRole> {
+    BtBabyUserRelation selectByBabyIdAndDeleteFlag(@Param("babyId") Long babyId);
+}

+ 0 - 8
babyApplication-dao/src/main/java/edu/travel/mapper/MtRelativeRolesMapper.java

@@ -1,8 +0,0 @@
-package edu.travel.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import edu.travel.entity.MtRelativeRoles;
-
-public interface MtRelativeRolesMapper extends BaseMapper<MtRelativeRoles> {
-
-}

+ 4 - 4
babyApplication-dao/src/main/resources/mapper/BtFeedRecordMapper.xml

@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="edu.travel.mapper.BtFeedRecordMapper">
-  <resultMap id="BaseResultMap" type="edu.travel.entity.BtFeedRecord">
-    <!--@mbg.generated-->
-    <!--@Table bt_feed_record-->
+<!--  <resultMap id="BaseResultMap" type="edu.travel.entity.BtFeedRecord">
+    &lt;!&ndash;@mbg.generated&ndash;&gt;
+    &lt;!&ndash;@Table bt_feed_record&ndash;&gt;
     <id column="id" jdbcType="BIGINT" property="id" />
     <result column="type" jdbcType="INTEGER" property="type" />
     <result column="nurse_method" jdbcType="INTEGER" property="nurseMethod" />
@@ -21,7 +21,7 @@
     <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
     <result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
     <result column="delete_flag" jdbcType="INTEGER" property="deleteFlag" />
-  </resultMap>
+  </resultMap>-->
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, `type`, nurse_method, nurse_amount, complementary_name, has_stool, milk_output, 

+ 2 - 2
babyApplication-dao/src/main/resources/mapper/MtRelativeRolesMapper.xml → babyApplication-dao/src/main/resources/mapper/MtRelativeRoleMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-<mapper namespace="edu.travel.mapper.MtRelativeRolesMapper">
-  <resultMap id="BaseResultMap" type="edu.travel.entity.MtRelativeRoles">
+<mapper namespace="edu.travel.mapper.MtRelativeRoleMapper">
+  <resultMap id="BaseResultMap" type="edu.travel.entity.MtRelativeRole">
     <!--@mbg.generated-->
     <!--@Table mt_relative_roles-->
     <id column="id" jdbcType="BIGINT" property="id" />

+ 10 - 0
babyApplication-model/babyApplication-model-entity/pom.xml

@@ -23,5 +23,15 @@
             <artifactId>babyApplication-model-base</artifactId>
             <version>1.0-SNAPSHOT</version>
         </dependency>
+        <!-- https://mvnrepository.com/artifact/org.hibernate.validator/hibernate-validator -->
+        <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>8.0.1.Final</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-extension</artifactId>
+        </dependency>
     </dependencies>
 </project>

+ 46 - 0
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/BabyInfoDTO.java

@@ -0,0 +1,46 @@
+package edu.travel.dto;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BabyInfoDTO {
+
+
+    private Long id;
+
+//    @NotBlank(message = "宝宝姓名不能为空")
+    private String name;
+
+//    @NotBlank(message = "宝宝昵称不能为空")
+    private String nickname;
+
+//    @NotNull(message = "出生日期不能为空")
+//    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date birthdayNew;
+
+//    @NotNull(message = "性别不能为空")
+//    @Min(value = 0, message = "性别无效")
+//    @Max(value = 1, message = "性别无效")
+    private Integer gender;
+
+//    @Min(value = 1, message = "血型无效")
+//    @Max(value = 5, message = "血型无效")
+    private Integer bloodType = 5;
+
+    //头像
+    private String avatar;
+    private String qrCode;
+
+//    @NotBlank(message = "项目不能为空")
+    private String project;
+
+//    @NotNull(message = "亲属角色不能为空")
+    private Long relativeRoleId;
+    /**
+     * 角色名
+     */
+    private String roleName;
+}

+ 24 - 0
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/BabyQueryDTO.java

@@ -0,0 +1,24 @@
+package edu.travel.dto;
+
+import lombok.Data;
+
+@Data
+public class BabyQueryDTO {
+
+    private Integer pageNum = 1;
+
+
+    private Integer pageSize = 10;
+
+
+    private String name;
+
+
+    private Integer gender;
+
+//    @Schema(description = "排序字段(create_time/birthday_new)")
+    private String sortField = "create_time";
+
+//    @Schema(description = "排序方向(asc/desc)")
+    private String sortOrder = "desc";
+}

+ 55 - 0
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/FeedRecordCreateDTO.java

@@ -0,0 +1,55 @@
+package edu.travel.dto;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+
+
+import javax.validation.constraints.FutureOrPresent;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
+
+@Data
+//@ApiModel("新增喂养记录DTO")
+public class FeedRecordCreateDTO {
+//    @ApiModelProperty(value = "行为类型", required = true)
+    @NotNull(message = "类型不能为空")
+    @Range(min = 1, max = 7, message = "无效的类型值")
+    private Integer type;
+
+//    @ApiModelProperty("喂奶方式(类型为1时必填)")
+    @Range(min = 1, max = 3, message = "无效的喂奶方式")
+    private Integer nurseMethod;
+
+//    @ApiModelProperty("喂奶量(母乳瓶喂/配方奶时必填)")
+    @Min(value = 0, message = "喂奶量不能为负数")
+    private Integer nurseAmount;
+
+//    @ApiModelProperty("辅食名称(类型为2时必填)")
+    @Size(max = 50, message = "辅食名称最长50字符")
+    private String complementaryName;
+
+//    @ApiModelProperty("是否有粪便(类型为3时必填)")
+    private Integer hasStool;
+
+//    @ApiModelProperty("吸奶量(类型为5时必填)")
+    @Min(value = 0, message = "吸奶量不能为负数")
+    private Integer milkOutput;
+
+//    @ApiModelProperty(value = "开始时间", required = true)
+//    @FutureOrPresent(message = "开始时间不能是过去时间")
+    private Date startTime;
+
+//    @ApiModelProperty(value = "结束时间", required = true)
+//    @FutureOrPresent(message = "结束时间不能是过去时间")
+    private Date endTime;
+
+//    @ApiModelProperty("备注")
+    @Size(max = 255, message = "备注最长255字符")
+    private String remark;
+
+//    @ApiModelProperty("图片URL列表")
+    private List<String> images;
+}

+ 0 - 1
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/dto/UpdateAccountDto.java

@@ -3,7 +3,6 @@ package edu.travel.dto;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
-import com.sun.istack.internal.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;

+ 75 - 0
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtBabyInfo.java

@@ -0,0 +1,75 @@
+package edu.travel.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;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@TableName("bt_baby_info")
+@AllArgsConstructor
+@NoArgsConstructor
+public class BtBabyInfo extends BaseEntity{
+
+    /**
+     * 主键ID
+     */
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private Long id;
+
+    /**
+     * 姓名
+     */
+    @TableField(value = "name")
+    private String name;
+    /**
+     * 昵称
+     */
+    @TableField(value = "nickname")
+    private String nickname;
+    /**
+     * 新历生日
+     */
+    @TableField(value = "birthday_new")
+    private Date birthdayNew;
+    /**
+     * 生日
+     */
+    @TableField(value = "birthday_old")
+    private String birthdayOld;
+    /**
+     * 星座
+     */
+    @TableField(value = "constellation")
+    private String constellation;
+    /**
+     * 性别 0男 1女
+     */
+    @TableField(value = "gender")
+    private Integer gender;
+    /**
+     * 血型 1A 2B 3AB 4O 5未知
+     */
+    @TableField(value = "blood_type")
+    private Integer bloodType;
+    /**
+     * 头像
+     */
+    @TableField(value = "avatar")
+    private String avatar;
+    /**
+     * 二维码
+     */
+    @TableField(value = "qr_code")
+    private String qrCode;
+
+
+    private static final long serialVersionUID = 1L;
+
+
+}

+ 4 - 4
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtBabyUserRelation.java

@@ -28,25 +28,25 @@ public class BtBabyUserRelation implements Serializable {
      * 用户id
      */
     @TableField(value = "user_id")
-    private String userId;
+    private Long userId;
 
     /**
      * 宝宝id
      */
     @TableField(value = "baby_id")
-    private String babyId;
+    private Long babyId;
 
     /**
      * 亲属角色id
      */
     @TableField(value = "relative_role_id")
-    private String relativeRoleId;
+    private Long relativeRoleId;
 
     /**
      * 是否是创建人 0否 1是 (只有创建人有权修改宝宝基本信息和宝宝的亲属列表)
      */
     @TableField(value = "is_founder")
-    private Byte isFounder;
+    private Integer isFounder;
 
     /**
      * 项目名称

+ 16 - 45
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/BtFeedRecord.java

@@ -1,14 +1,16 @@
 package edu.travel.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;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.apache.ibatis.type.JdbcType;
 
 /**
  * 喂养记录表
@@ -17,11 +19,11 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName(value = "bt_feed_record")
-public class BtFeedRecord implements Serializable {
+public class BtFeedRecord extends BaseEntity implements Serializable {
     /**
      * 主键
      */
-    @TableId(value = "id", type = IdType.INPUT)
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
     private Long id;
 
     /**
@@ -36,6 +38,10 @@ public class BtFeedRecord implements Serializable {
     @TableField(value = "nurse_method")
     private Integer nurseMethod;
 
+    public void setNurseMethod(Integer nurseMethod) {
+        this.nurseMethod = nurseMethod;
+    }
+
     /**
      * 喂奶量(ml) type==1&&nurse_method==2 或type==1&&nurse_method==3 时使用
      */
@@ -52,7 +58,7 @@ public class BtFeedRecord implements Serializable {
      * 是否有粪便 0没有 1有 type==3 时使用
      */
     @TableField(value = "has_stool")
-    private Byte hasStool;
+    private Integer hasStool;
 
     /**
      * 吸奶量 type==5 时使用
@@ -81,44 +87,9 @@ public class BtFeedRecord implements Serializable {
     /**
      * 相关图片 限制6张
      */
-    @TableField(value = "images")
-    private String images;
-
-    /**
-     * 项目名称
-     */
-    @TableField(value = "project")
-    private String project;
-
-    /**
-     * 创建时间
-     */
-    @TableField(value = "create_time")
-    private Date createTime;
-
-    /**
-     * 创建用户id
-     */
-    @TableField(value = "create_user_id")
-    private Long createUserId;
-
-    /**
-     * 更新时间
-     */
-    @TableField(value = "update_time")
-    private Date updateTime;
-
-    /**
-     * 更新用户id
-     */
-    @TableField(value = "update_user_id")
-    private Long updateUserId;
-
-    /**
-     * 逻辑删除标记
-     */
-    @TableField(value = "delete_flag")
-    private Integer deleteFlag;
+    @TableField(value = "images",typeHandler = JacksonTypeHandler.class,
+            jdbcType = JdbcType.VARCHAR)
+    private List<String> images;
 
     private static final long serialVersionUID = 1L;
 }

+ 1 - 1
babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/MtRelativeRoles.java → babyApplication-model/babyApplication-model-entity/src/main/java/edu/travel/entity/MtRelativeRole.java

@@ -17,7 +17,7 @@ import lombok.NoArgsConstructor;
 @AllArgsConstructor
 @NoArgsConstructor
 @TableName(value = "mt_relative_roles")
-public class MtRelativeRoles implements Serializable {
+public class MtRelativeRole implements Serializable {
     /**
      * 主键id
      */

+ 5 - 0
babyApplication-service/pom.xml

@@ -67,5 +67,10 @@
             <version>3.19.2</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>cn.6tail</groupId>
+            <artifactId>lunar</artifactId>
+            <version>1.3.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 27 - 0
babyApplication-service/src/main/java/edu/travel/enumm/BloodType.java

@@ -0,0 +1,27 @@
+package edu.travel.enumm;
+
+public enum BloodType {
+    A(1, "A型"),
+    B(2, "B型"),
+    AB(3, "AB型"),
+    O(4, "O型"),
+    UNKNOWN(5, "未知");
+
+    private final int code;
+    private final String description;
+
+    BloodType(int code, String description) {
+        this.code = code;
+        this.description = description;
+    }
+
+    public static String getDescriptionByCode(Integer code) {
+        if (code == null) return UNKNOWN.description;
+        for (BloodType type : values()) {
+            if (type.code == code) {
+                return type.description;
+            }
+        }
+        return UNKNOWN.description;
+    }
+}

+ 24 - 0
babyApplication-service/src/main/java/edu/travel/service/BtBabyInfoService.java

@@ -0,0 +1,24 @@
+package edu.travel.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.dto.BabyInfoDTO;
+import edu.travel.dto.BabyQueryDTO;
+import edu.travel.entity.BtBabyInfo;
+import edu.travel.vo.BabyDetailVO;
+import edu.travel.vo.BabyInfoVO;
+import edu.travel.vo.BabyListItemVO;
+import edu.travel.vo.PageResult;
+
+
+public interface BtBabyInfoService extends IService<BtBabyInfo> {
+
+//    void updateBabyInfo(Long babyId, BabyInfoDTO dto);
+    BabyInfoVO updateBabyInfo(BabyInfoDTO dto, Long currentUserId);
+    BabyInfoVO addBaby(BabyInfoDTO dto,Long currentUserId);
+
+    BabyDetailVO getBabyInfoDetail(Long babyId);
+
+    String deleteBabyWithValidation(Long babyId, Long l);
+
+    PageResult<BabyListItemVO> listBabiesByPage(BabyQueryDTO queryDTO, Long l);
+}

+ 5 - 2
babyApplication-service/src/main/java/edu/travel/service/BtFeedRecordService.java

@@ -1,8 +1,11 @@
 package edu.travel.service;
 
+import com.baomidou.mybatisplus.extension.service.IService;
+import edu.travel.dto.FeedRecordCreateDTO;
+import edu.travel.entity.BtBabyInfo;
 import edu.travel.entity.BtFeedRecord;
-public interface BtFeedRecordService{
-
+public interface BtFeedRecordService extends IService<BtFeedRecord> {
 
 
+    void createRecord(FeedRecordCreateDTO dto, String project);
 }

+ 7 - 0
babyApplication-service/src/main/java/edu/travel/service/MtRelativeRoleService.java

@@ -0,0 +1,7 @@
+package edu.travel.service;
+
+public interface MtRelativeRoleService {
+
+
+
+}

+ 0 - 8
babyApplication-service/src/main/java/edu/travel/service/MtRelativeRolesService.java

@@ -1,8 +0,0 @@
-package edu.travel.service;
-
-import edu.travel.entity.MtRelativeRoles;
-public interface MtRelativeRolesService{
-
-
-
-}

+ 400 - 0
babyApplication-service/src/main/java/edu/travel/service/impl/BtBabyInfoServiceImpl.java

@@ -0,0 +1,400 @@
+package edu.travel.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.dto.BabyInfoDTO;
+import edu.travel.dto.BabyQueryDTO;
+import edu.travel.entity.BtBabyInfo;
+import edu.travel.entity.BtBabyUserRelation;
+import edu.travel.entity.MtRelativeRole;
+import edu.travel.enumm.BloodType;
+import edu.travel.exception.BaseException;
+import edu.travel.mapper.BtBabyInfoMapper;
+import edu.travel.mapper.BtBabyUserRelationMapper;
+import edu.travel.mapper.MtRelativeRoleMapper;
+import edu.travel.service.BtBabyInfoService;
+import edu.travel.util.ConstellationUtil;
+import edu.travel.vo.BabyDetailVO;
+import edu.travel.vo.BabyInfoVO;
+import edu.travel.vo.BabyListItemVO;
+import edu.travel.vo.PageResult;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDate;
+import java.time.Period;
+import java.time.ZoneId;
+import java.time.temporal.ChronoUnit;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author Survive
+ * @date 2025/3/13
+ * @description TODO
+ */
+@Service
+public class BtBabyInfoServiceImpl extends ServiceImpl<BtBabyInfoMapper, BtBabyInfo> implements BtBabyInfoService {
+
+    @Autowired
+    private BtBabyUserRelationMapper relationMapper;
+    @Autowired
+    private BtBabyInfoMapper babyInfoMapper;
+
+    @Autowired
+    private MtRelativeRoleMapper relativeRoleMapper;
+
+    /**
+     * 查询所有宝宝信息
+     * @param dto
+     * @param currentUserId
+     * @return
+     */
+    @Override
+    public PageResult<BabyListItemVO> listBabiesByPage(BabyQueryDTO dto, Long currentUserId) {
+        // 1. 构建分页参数
+        int pageNum = dto.getPageNum() != null ? dto.getPageNum() : 1;
+        int pageSize = dto.getPageSize() != null ? dto.getPageSize() : 10;
+        Page<BtBabyInfo> page = new Page<>(pageNum, pageSize);
+
+        // 2. 构建查询条件
+        QueryWrapper<BtBabyInfo> wrapper = new QueryWrapper<>();
+        buildQueryConditions(wrapper, dto, currentUserId);
+        handleSorting(wrapper, dto);
+
+        // 3. 执行分页查询
+        Page<BtBabyInfo> resultPage = babyInfoMapper.selectPage(page, wrapper);
+
+        // 4. 转换为VO
+        List<BabyListItemVO> voList = convertToVOList(resultPage.getRecords());
+
+        return new PageResult<>(
+                voList,
+                resultPage.getTotal(),
+                resultPage.getCurrent(),
+                resultPage.getSize()
+        );
+    }
+
+    private void buildQueryConditions(QueryWrapper<BtBabyInfo> wrapper, BabyQueryDTO dto, Long userId) {
+        // 基础条件
+        wrapper.eq("delete_flag", 0);
+
+        // 权限过滤
+        wrapper.inSql("id",
+                "SELECT baby_id FROM bt_baby_user_relation " +
+                        "WHERE user_id = " + userId + " AND delete_flag = 0");
+
+        // 筛选条件
+        if (StringUtils.isNotBlank(dto.getName())) {
+            wrapper.like("name", dto.getName().trim());
+        }
+        if (dto.getGender() != null) {
+            wrapper.eq("gender", dto.getGender());
+        }
+    }
+
+    private void handleSorting(QueryWrapper<BtBabyInfo> wrapper, BabyQueryDTO dto) {
+        String safeSortField = Arrays.asList("create_time", "birthday_new")
+                .contains(dto.getSortField()) ? dto.getSortField() : "create_time";
+
+        wrapper.orderBy(true, "asc".equalsIgnoreCase(dto.getSortOrder()),
+                safeSortField + (dto.getSortField().equals("birthday_new") ? " DESC" : ""));
+    }
+
+    private List<BabyListItemVO> convertToVOList(List<BtBabyInfo> records) {
+        return records.stream().map(baby -> {
+            BabyListItemVO vo = new BabyListItemVO();
+            BeanUtils.copyProperties(baby, vo);
+            vo.setBirth(baby.getBirthdayNew());
+            vo.setAge(calculateAge(baby.getBirthdayNew()));
+            vo.setGender(baby.getGender() == 1 ? "男" : "女");
+            vo.setBloodType(BloodType.getDescriptionByCode(baby.getBloodType()));
+            return vo;
+        }).collect(Collectors.toList());
+    }
+
+
+    private String calculateAge(Date birthday) {
+        LocalDate birthDate = birthday.toInstant()
+                .atZone(ZoneId.systemDefault())
+                .toLocalDate();
+        LocalDate now = LocalDate.now();
+
+        // 处理未来日期
+        if (birthDate.isAfter(now)) {
+            return "未出生";
+        }
+
+        // 计算年月
+        Period period = Period.between(birthDate, now);
+
+        // 计算剩余天数
+        LocalDate tempDate = birthDate.plusYears(period.getYears())
+                .plusMonths(period.getMonths());
+        long days = ChronoUnit.DAYS.between(tempDate, now);
+
+        return formatAge(birthDate,now,period.getYears(), period.getMonths(), days);
+    }
+
+    private String formatAge(LocalDate birthDate, LocalDate now, int years, int months, long days) {
+        StringBuilder sb = new StringBuilder();
+        if (years > 0) sb.append(years).append("岁");
+        if (months > 0) sb.append(months).append("个月");
+        if (days > 0) sb.append(days).append("天");
+
+        // 处理全零情况
+        if (sb.length() == 0) {
+            long totalDays = ChronoUnit.DAYS.between(birthDate, now);
+            return totalDays + "天";
+        }
+
+        return sb.toString();
+    }
+
+
+    /**
+     * 新增宝宝信息
+     * @param dto
+     * @return
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public BabyInfoVO addBaby(BabyInfoDTO dto, Long currentUserId) {
+        // 根据角色名称查询角色ID
+        String name = dto.getRoleName();
+        if (StringUtils.isBlank(name) && name.equals("")) {
+            throw new BaseException(400, "角色类型不能为空");
+        }
+        QueryWrapper<MtRelativeRole> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(StringUtils.checkValNotNull(name), "role_name", name);
+        MtRelativeRole role = relativeRoleMapper.selectOne(queryWrapper);
+
+        if (role == null && role.getId() == null) {
+            throw new BaseException(400, "角色类型不存在");
+        }
+        Long relativeRoleId = role.getId();
+
+
+        // 校验亲属角色
+        MtRelativeRole role1 = relativeRoleMapper.selectById(relativeRoleId);
+        if (role1 == null || role1.getDeleteFlag() != 0) {
+            throw new BaseException("亲属角色不存在或已删除");
+        }
+
+        //  保存宝宝信息
+        BtBabyInfo baby = new BtBabyInfo();
+        BeanUtils.copyProperties(dto, baby);
+        //星座计算
+        baby.setConstellation(ConstellationUtil.getConstellation(dto.getBirthdayNew()));
+        baby.setCreateTime(new Date());
+//        登录传来的userId
+        baby.setCreateUserId(String.valueOf(currentUserId));
+        baby.setUpdateTime(new Date());
+        baby.setUpdateUserId(String.valueOf(currentUserId));
+        baby.setDeleteFlag(0);
+        babyInfoMapper.insert(baby);
+
+        // 保存关联关系
+        BtBabyUserRelation relation = new BtBabyUserRelation();
+        relation.setUserId(currentUserId);
+        relation.setBabyId(baby.getId());
+//        relation.setRelativeRoleId(dto.getRelativeRoleId());
+        relation.setRelativeRoleId(relativeRoleId);
+        relation.setIsFounder(1);
+        relation.setProject(dto.getProject());
+        relation.setCreateTime(new Date());
+        relation.setCreateUserId(currentUserId);
+        relation.setCreateUserId(currentUserId);
+        relation.setUpdateTime(new Date());
+        relation.setUpdateUserId(currentUserId);
+        relation.setDeleteFlag(0);
+        relationMapper.insert(relation);
+
+        return convertToVO(baby);
+    }
+
+    /**
+     * 查询宝宝信息
+     * @param babyId
+     * @return
+     */
+    @Override
+    public BabyDetailVO getBabyInfoDetail(Long babyId) {
+        //  获取基础信息
+        BtBabyInfo babyInfo = getValidBabyInfo(babyId);
+
+        //  权限校验
+        verifyAccessPermission(babyId);
+
+        //  组装详细信息
+        return assembleDetailVO(babyInfo);
+    }
+
+    @Override
+    public String deleteBabyWithValidation(Long babyId, Long l) {
+        //权限校验 只有创建人有权限删除 删除时需要校验是否为 is_founder == 1?
+
+        BtBabyUserRelation btBabyUserRelation = relativeRoleMapper.selectByBabyIdAndDeleteFlag(babyId);
+        if (btBabyUserRelation.getIsFounder() == 0) {
+            throw new BaseException("无删除权限");
+        }
+
+        //执行逻辑删除逻辑
+        BtBabyInfo entity = new BtBabyInfo();
+        entity.setDeleteFlag(1);
+        entity.setUpdateTime(new Date());
+        entity.setUpdateUserId(String.valueOf(l));
+        UpdateWrapper<BtBabyInfo> updateBabyWrapper = new UpdateWrapper<>();
+        updateBabyWrapper.eq("id", babyId)
+                .set("delete_flag", 1);
+        int rows = babyInfoMapper.update(entity, updateBabyWrapper);
+        if (rows != 1) {
+            throw new BaseException("宝宝信息删除失败");
+        }
+        //逻辑删除关联关系
+        LambdaUpdateWrapper<BtBabyUserRelation> updateWrapper = new LambdaUpdateWrapper<>();
+        updateWrapper.set(BtBabyUserRelation::getDeleteFlag, 1)
+                .set(BtBabyUserRelation::getUpdateTime, new Date())
+//                .set(BtBabyUserRelation::getUpdateUserId, SecurityUtils.getCurrentUserId())
+                .set(BtBabyUserRelation::getUpdateUserId,l)
+                .eq(BtBabyUserRelation::getBabyId, babyId);
+
+        int affectRows = relationMapper.update(null, updateWrapper);
+
+        return "删除成功";
+    }
+
+
+
+    private BtBabyInfo getValidBabyInfo(Long babyId) {
+        BtBabyInfo baby = babyInfoMapper.selectById(babyId);
+        if (baby == null || baby.getDeleteFlag() == 1) {
+            throw new BaseException("宝宝信息不存在");
+        }
+        return baby;
+    }
+
+    private void verifyAccessPermission(Long babyId) {
+        LambdaQueryWrapper<BtBabyUserRelation> query = new LambdaQueryWrapper<>();
+        query.eq(BtBabyUserRelation::getBabyId, babyId.toString())
+                .eq(BtBabyUserRelation::getDeleteFlag, 0);
+        if (relationMapper.selectCount(query) == 0) {
+            throw new BaseException("无访问权限");
+        }
+    }
+
+    private BabyDetailVO assembleDetailVO(BtBabyInfo baby) {
+        BabyDetailVO vo = new BabyDetailVO();
+        BeanUtils.copyProperties(baby, vo);
+        // 转换基础字段
+        vo.setGender(baby.getGender() == 0 ? "男" : "女");
+        vo.setBirthdayNew(new SimpleDateFormat("yyyy-MM-dd").format(baby.getBirthdayNew()));
+        vo.setBloodType(BloodType.getDescriptionByCode(baby.getBloodType()));
+        return vo;
+    }
+    /**
+     * 修改宝宝信息
+     * @param dto
+     * @param currentUserId
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public BabyInfoVO updateBabyInfo(BabyInfoDTO dto, Long currentUserId) {
+        // 1. 校验宝宝是否存在
+        BtBabyInfo existBaby = babyInfoMapper.selectById(dto.getId());
+        if (existBaby == null || existBaby.getDeleteFlag() == 1) {
+            throw new BaseException("宝宝信息不存在");
+        }
+
+        // 2. 校验修改权限
+        checkUpdatePermission(existBaby.getId(), currentUserId);
+
+        // 3. 构建更新实体
+        BtBabyInfo updateBaby = new BtBabyInfo();
+        BeanUtils.copyProperties(dto, updateBaby);
+        updateBaby.setUpdateTime(new Date());
+        updateBaby.setUpdateUserId(String.valueOf(currentUserId));
+        updateBaby.setId(existBaby.getId());
+        updateBaby.setConstellation(ConstellationUtil.getConstellation(dto.getBirthdayNew()));
+        // 防止全表更新
+        UpdateWrapper<BtBabyInfo> wrapper = new UpdateWrapper<>();
+        wrapper.eq("id", dto.getId())
+                .eq("delete_flag", 0);
+        int rows =babyInfoMapper.update(updateBaby, wrapper);
+        // 4. 执行更新
+//        int rows = babyInfoMapper.updateById(updateBaby);
+        if (rows != 1) {
+            throw new BaseException("更新失败,请稍后重试");
+        }
+
+        return getBabyDetail(existBaby.getId());
+    }
+
+    /**
+     * 新增宝宝信息  baby实体转换为VO
+     * @param baby
+     * @return
+     */
+    private BabyInfoVO convertToVO(BtBabyInfo baby) {
+        BabyInfoVO vo = new BabyInfoVO();
+        BeanUtils.copyProperties(baby, vo);
+        vo.setBirthdayNew(new SimpleDateFormat("yyyy-MM-dd").format(baby.getBirthdayNew()));
+        vo.setGender(baby.getGender() == 0 ? "男" : "女");
+        // 血型映射逻辑...
+        // 血型映射
+        vo.setBloodType(BloodType.getDescriptionByCode(baby.getBloodType()));
+        vo.setCreateTime(baby.getCreateTime());
+        return vo;
+    }
+
+    /**
+     * 更新宝宝信息 权限校验  是否为创建人
+     * @param babyId
+     * @param userId
+     */
+    private void checkUpdatePermission(Long babyId, Long userId) {
+        LambdaQueryWrapper<BtBabyUserRelation> query = new LambdaQueryWrapper<>();
+        query.eq(BtBabyUserRelation::getBabyId, babyId.toString())
+//                .eq(BtBabyUserRelation::getUserId, userId.toString())
+                .eq(BtBabyUserRelation::getIsFounder, 1);
+
+        if (relationMapper.selectCount(query) == 0) {
+            throw new BaseException("无修改权限");
+        }
+    }
+
+
+    private BabyInfoVO getBabyDetail(Long babyId) {
+        BtBabyInfo baby = babyInfoMapper.selectById(babyId);
+        return convertToVO(baby);
+    }
+
+    /**
+     * 检查用户是否有权限修改宝宝信息
+     */
+    private void checkFounderPermission(Long babyId) {
+        QueryWrapper<BtBabyUserRelation> queryWrapper = new QueryWrapper<>();
+        queryWrapper
+//                .eq("user_id", userId)
+                .eq("baby_id", babyId)
+                .eq("is_founder", 1);
+
+        BtBabyUserRelation relation = relationMapper.selectOne(queryWrapper);
+        if (relation == null) {
+            throw new BaseException("仅创建人可修改宝宝信息");
+        }
+    }
+
+}

+ 107 - 2
babyApplication-service/src/main/java/edu/travel/service/impl/BtFeedRecordServiceImpl.java

@@ -1,14 +1,119 @@
 package edu.travel.service.impl;
 
-import edu.travel.service.SysServiceImpl;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import edu.travel.dto.FeedRecordCreateDTO;
+import edu.travel.exception.BaseException;
 import edu.travel.service.BtFeedRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 
 import edu.travel.entity.BtFeedRecord;
 import edu.travel.mapper.BtFeedRecordMapper;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
 
 @Service
-public class BtFeedRecordServiceImpl extends SysServiceImpl<BtFeedRecordMapper, BtFeedRecord> implements BtFeedRecordService {
+public class BtFeedRecordServiceImpl extends ServiceImpl<BtFeedRecordMapper, BtFeedRecord> implements BtFeedRecordService {
+    @Autowired
+    private BtFeedRecordMapper btFeedRecordMapper;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void createRecord(FeedRecordCreateDTO dto, String project) {
+        // 校验时间顺序
+        /*if (dto.getEndTime().before(dto.getStartTime())) {
+            throw new BaseException("结束时间不能早于开始时间");
+        }*/
+
+        // 类型相关校验
+        switch (dto.getType()) {
+            case 1: // 喂奶
+                validateNursing(dto);
+                break;
+            case 2: // 辅食
+                validateComplementary(dto);
+                break;
+            case 3: // 尿布
+                validateDiaper(dto);
+                break;
+            case 5: // 吸奶
+                validateMilkExpression(dto);
+                break;
+            case 6://洗澡
+                validateXizao(dto);
+                break;
+            case 7://游泳
+                validateSwimming(dto);
+                 break;
+        }
+        // DTO转Entity
+        BtFeedRecord record = new BtFeedRecord();
+                record.setType(dto.getType());
+                record .setNurseMethod(dto.getNurseMethod());
+                record.setNurseAmount(dto.getNurseAmount());
+                record.setComplementaryName(dto.getComplementaryName());
+                record.setHasStool(dto.getHasStool());
+                record.setMilkOutput(dto.getMilkOutput());
+                record.setStartTime(dto.getStartTime());
+        if (dto.getEndTime() != null) {
+            record.setEndTime(dto.getEndTime());
+        }else {record.setEndTime(new Date());}
+                record.setRemark(dto.getRemark());
+                record.setImages(dto.getImages());
+                record.setProject(project);
+                record.setRemark(dto.getRemark());
+                record.setCreateTime(new Date());
+                record.setCreateUserId(String.valueOf(1));
+                record.setUpdateUserId(String.valueOf(1));
+                record.setDeleteFlag(0);
+
+        int rows = btFeedRecordMapper.insert(record);
+        if (rows != 1) {
+            throw new BaseException("记录保存失败");
+        }
+    }
+
+    private void validateXizao(FeedRecordCreateDTO dto) {
+        if (dto.getStartTime() == null) {
+            throw new BaseException("开始时间不能为空");
+        }
+    }
+
+    private void validateSwimming(FeedRecordCreateDTO dto) {
+        if (dto.getStartTime() == null) {
+            throw new BaseException("开始时间不能为空");
+        }
+    }
+
+    private void validateNursing(FeedRecordCreateDTO dto) {
+        if (dto.getNurseMethod() == null) {
+            throw new BaseException("喂奶方式不能为空");
+        }
+     /*   if (dto.getNurseMethod() == 1 && (dto.getStartTime() == null||dto.getEndTime() == null )) {
+            throw new BaseException("喂奶方式为纯喂奶时开始时间或结束时间不能为空");
+        }*/
+        if ((dto.getNurseMethod() == 2 || dto.getNurseMethod() == 3)
+                && (dto.getNurseAmount() == null || dto.getNurseAmount() <= 0)) {
+            throw new BaseException("喂奶量必须大于0");
+        }
+    }
 
+    private void validateComplementary(FeedRecordCreateDTO dto) {
+        if (StringUtils.isBlank(dto.getComplementaryName())) {
+            throw new BaseException("辅食名称不能为空");
+        }
+    }
+    private void validateDiaper(FeedRecordCreateDTO dto) {
+        if (dto.getHasStool() == null) {
+            throw new BaseException("必须指定是否有粪便");
+        }
+    }
+    private void validateMilkExpression(FeedRecordCreateDTO dto) {
+        if (dto.getMilkOutput() == null || dto.getMilkOutput() < 0) {
+            throw new BaseException("吸奶量必须大于等于0");
+        }
+    }
 }

+ 14 - 0
babyApplication-service/src/main/java/edu/travel/service/impl/MtRelativeRoleServiceImpl.java

@@ -0,0 +1,14 @@
+package edu.travel.service.impl;
+
+import edu.travel.entity.MtRelativeRole;
+import edu.travel.mapper.MtRelativeRoleMapper;
+import edu.travel.service.SysServiceImpl;
+
+import edu.travel.service.MtRelativeRoleService;
+import org.springframework.stereotype.Service;
+
+@Service
+public class MtRelativeRoleServiceImpl extends SysServiceImpl<MtRelativeRoleMapper, MtRelativeRole> implements MtRelativeRoleService {
+
+
+}

+ 0 - 17
babyApplication-service/src/main/java/edu/travel/service/impl/MtRelativeRolesServiceImpl.java

@@ -1,17 +0,0 @@
-package edu.travel.service.impl;
-
-import edu.travel.service.SysServiceImpl;
-
-import edu.travel.service.MtRelativeRolesService;
-import org.springframework.stereotype.Service;
-
-import org.springframework.beans.factory.annotation.Autowired;
-
-import edu.travel.mapper.MtRelativeRolesMapper;
-import edu.travel.entity.MtRelativeRoles;
-
-@Service
-public class MtRelativeRolesServiceImpl extends SysServiceImpl<MtRelativeRolesMapper, MtRelativeRoles> implements MtRelativeRolesService {
-
-
-}

+ 25 - 0
babyApplication-service/src/main/java/edu/travel/util/ConstellationUtil.java

@@ -0,0 +1,25 @@
+package edu.travel.util;
+
+import java.util.Calendar;
+import java.util.Date;
+
+public class ConstellationUtil {
+    private static final String[] CONSTELLATIONS = {
+        "摩羯座", "水瓶座", "双鱼座", "白羊座", 
+        "金牛座", "双子座", "巨蟹座", "狮子座",
+        "处女座", "天秤座", "天蝎座", "射手座"
+    };
+
+    private static final int[] DAYS = {20, 19, 21, 20, 21, 22, 23, 23, 23, 24, 23, 22};
+
+    public static String getConstellation(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int month = cal.get(Calendar.MONTH);
+        int day = cal.get(Calendar.DAY_OF_MONTH);
+        
+        return day < DAYS[month] 
+            ? CONSTELLATIONS[month] 
+            : CONSTELLATIONS[(month + 1) % 12];
+    }
+}

+ 28 - 0
babyApplication-service/src/main/java/edu/travel/vo/BabyDetailVO.java

@@ -0,0 +1,28 @@
+package edu.travel.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class BabyDetailVO {
+    private Long id;
+    private String name;
+    private String nickname;
+    private String birthdayNew;
+    private String constellation;
+    private String gender;
+    private String bloodType;
+    private String avatar;
+    
+    // 创建者信息
+//    private UserInfoDTO creatorInfo;
+    
+    // 关联用户列表
+//    private List<RelativeVO> relatives;
+    
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
+    private Date createTime;
+}

+ 21 - 0
babyApplication-service/src/main/java/edu/travel/vo/BabyInfoVO.java

@@ -0,0 +1,21 @@
+package edu.travel.vo;
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+@Data
+public class BabyInfoVO {
+    private Long id;
+    private String name;
+    private String nickname;
+    private String birthdayNew;
+    private String constellation;
+    private String gender;
+    private String bloodType;
+    private String avatar;
+    private String qrCode;
+    private String project;
+    private Date createTime;
+}

+ 21 - 0
babyApplication-service/src/main/java/edu/travel/vo/BabyListItemVO.java

@@ -0,0 +1,21 @@
+package edu.travel.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class BabyListItemVO {
+    private Long id;
+    private String name;
+    private String nickname;
+    private String avatar;
+    private String gender;
+    private String bloodType;
+    private Date birth;
+    private String age;
+    private String constellation;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date createTime;
+}

+ 20 - 0
babyApplication-service/src/main/java/edu/travel/vo/PageResult.java

@@ -0,0 +1,20 @@
+package edu.travel.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PageResult<T> {
+    private List<T> list;
+    private Long total;
+    private Long pageNum;
+    private Long pageSize;
+
+    public PageResult(List<T> list, Long total, Long pageNum, Long pageSize) {
+        this.list = list;
+        this.total = total;
+        this.pageNum = pageNum;
+        this.pageSize = pageSize;
+    }
+}

+ 11 - 0
babyApplication-service/src/main/java/edu/travel/vo/RelativeVO.java

@@ -0,0 +1,11 @@
+package edu.travel.vo;
+
+import lombok.Data;
+
+@Data
+public class RelativeVO {
+    private String roleName;
+    private String nickname;
+    private String avatar;
+    private String relation; // 亲属关系描述
+}

+ 1 - 0
babyApplication-web/src/main/java/edu/travel/config/SecurityConfig.java

@@ -55,6 +55,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
                 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                 // 过滤请求
                 .authorizeRequests()
+                .antMatchers("/baby/**").permitAll()//放行宝宝相关接口
                 // 允许匿名访问
                 .antMatchers(
                         "/baby/login/**",

+ 89 - 0
babyApplication-web/src/main/java/edu/travel/web/BabyInfoController.java

@@ -0,0 +1,89 @@
+package edu.travel.web;
+
+import edu.travel.dto.BabyInfoDTO;
+import edu.travel.dto.BabyQueryDTO;
+import edu.travel.resp.BaseResponse;
+import edu.travel.service.BtBabyInfoService;
+import edu.travel.vo.BabyDetailVO;
+import edu.travel.vo.BabyInfoVO;
+import edu.travel.vo.BabyListItemVO;
+import edu.travel.vo.PageResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+/**
+ * @author Survive
+ * @date 2025/3/13
+ * @description TODO 宝宝信息接口
+ */
+@RestController
+@RequestMapping("/baby/info")
+public class BabyInfoController {
+
+    @Autowired
+    private BtBabyInfoService babyService;
+    
+    @GetMapping("/list")
+    public BaseResponse<PageResult<BabyListItemVO>> listBabies(
+            @Valid BabyQueryDTO queryDTO,
+            @RequestHeader("Authorization") String token
+    ) {
+//        Long currentUserId = SecurityUtils.getCurrentUserId();
+        PageResult<BabyListItemVO> babyListItemVOPageResult = babyService.listBabiesByPage(queryDTO, 1L);
+        return new BaseResponse<>(200, "success", babyListItemVOPageResult);
+    }
+
+    /**
+     * 获取宝宝信息
+     * @param babyId
+     * @return
+     */
+    @GetMapping("/getDetail/{babyId}")
+    public BaseResponse<BabyDetailVO> getBabyDetail(@PathVariable Long babyId
+//                                                    @RequestHeader("Authorization") String token
+    ) {
+        BabyDetailVO babyDetailVO = babyService.getBabyInfoDetail(babyId);
+        return new BaseResponse<>(200, "success", babyDetailVO);
+    }
+
+    /**
+     * 创建宝宝信息
+     * @param dto
+     * @return
+     */
+    @PostMapping("/add")
+    public BaseResponse<BabyInfoVO> createBaby(HttpServletRequest request, @RequestBody @Valid BabyInfoDTO dto) {
+//        Long currentUserId = SecurityUtils.getCurrentUserId();
+//        babyService.createBaby(dto, currentUserId);
+        return new BaseResponse<>(200, "success", babyService.addBaby(dto, 1L));
+    }
+
+
+    /**
+     * 更新宝宝信息
+     * @param dto
+     * @return
+     */
+    @PutMapping("/update")
+    public BaseResponse<BabyInfoVO> updateBabyInfo(@RequestBody @Valid BabyInfoDTO dto) {
+//        Long currentUserId = SecurityUtils.getCurrentUserId();
+        return new BaseResponse<>(200, "success", babyService.updateBabyInfo(dto, 1L));
+    }
+
+    /**
+     * 删除宝宝信息
+     * @param babyId
+     * @return
+     */
+    @DeleteMapping("/delete/{babyId}")
+    public BaseResponse deleteBabyInfo(@PathVariable Long babyId) {
+//        Long currentUserId = SecurityUtils.getCurrentUserId();
+        String s = babyService.deleteBabyWithValidation(babyId, 1L);
+        return new BaseResponse<>(200, "success", s);
+    }
+
+
+}

+ 24 - 5
babyApplication-web/src/main/java/edu/travel/web/BtFeedRecordController.java

@@ -1,15 +1,34 @@
 package edu.travel.web;
+import edu.travel.dto.FeedRecordCreateDTO;
+import edu.travel.resp.BaseResponse;
+import edu.travel.service.BtFeedRecordService;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import org.springframework.beans.factory.annotation.Autowired;
 
 /**
-* 喂养记录表(bt_feed_record)表控制层
-*
-* @author xxxxx
-*/
+ * 喂养记录表(bt_feed_record)表控制层
+ *
+ * @author xxxxx
+ */
 @RestController
-@RequestMapping("/bt_feed_record")
+@RequestMapping("/baby/bt_feed_record")
 public class BtFeedRecordController {
 
+    @Autowired
+    private BtFeedRecordService btFeedRecordService;
+
+
+    /**
+     * 新增喂养记录
+     * @param dto
+     * @param project
+     * @return
+     */
+    @PostMapping("/add")
+    public BaseResponse<Void> create(@Validated @RequestBody FeedRecordCreateDTO dto, @RequestHeader("project") String project) {
+        btFeedRecordService.createRecord(dto, project);
+        return new BaseResponse<>(200, "创建成功", null);
+    }
 }