From f9d01b7b36efea107e3e1791afd24b15f54cf46c Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Tue, 4 Nov 2025 20:05:01 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E8=BF=90=E5=8A=A8?= =?UTF-8?q?=E5=81=A5=E5=BA=B7=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cxx/home/controller/HealthController.java | 49 ++++++++++++++ .../cxx/home/converter/HealthConverter.java | 18 +++++ .../cxx/home/dto/health/HealthRecordDto.java | 33 ++++++++++ .../com/cxx/home/entity/ExerciseRecord.java | 23 +++++++ .../com/cxx/home/entity/HealthRecord.java | 26 ++++++++ .../com/cxx/home/entity/WeightRecord.java | 20 ++++++ .../cxx/home/mapper/ExerciseRecordMapper.java | 9 +++ .../cxx/home/mapper/HealthRecordMapper.java | 9 +++ .../cxx/home/mapper/WeightRecordMapper.java | 9 +++ .../com/cxx/home/service/HealthService.java | 17 +++++ .../home/service/impl/HealthServiceImpl.java | 66 +++++++++++++++++++ .../java/com/cxx/home/vo/HealthQueryVo.java | 15 +++++ 12 files changed, 294 insertions(+) create mode 100644 home-service/src/main/java/com/cxx/home/controller/HealthController.java create mode 100644 home-service/src/main/java/com/cxx/home/converter/HealthConverter.java create mode 100644 home-service/src/main/java/com/cxx/home/dto/health/HealthRecordDto.java create mode 100644 home-service/src/main/java/com/cxx/home/entity/ExerciseRecord.java create mode 100644 home-service/src/main/java/com/cxx/home/entity/HealthRecord.java create mode 100644 home-service/src/main/java/com/cxx/home/entity/WeightRecord.java create mode 100644 home-service/src/main/java/com/cxx/home/mapper/ExerciseRecordMapper.java create mode 100644 home-service/src/main/java/com/cxx/home/mapper/HealthRecordMapper.java create mode 100644 home-service/src/main/java/com/cxx/home/mapper/WeightRecordMapper.java create mode 100644 home-service/src/main/java/com/cxx/home/service/HealthService.java create mode 100644 home-service/src/main/java/com/cxx/home/service/impl/HealthServiceImpl.java create mode 100644 home-service/src/main/java/com/cxx/home/vo/HealthQueryVo.java diff --git a/home-service/src/main/java/com/cxx/home/controller/HealthController.java b/home-service/src/main/java/com/cxx/home/controller/HealthController.java new file mode 100644 index 0000000..0178fb6 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/controller/HealthController.java @@ -0,0 +1,49 @@ +package com.cxx.home.controller; + +import com.cxx.common.ReadView; +import com.cxx.common.WriteView; +import com.cxx.home.dto.health.HealthRecordDto; +import com.cxx.home.service.HealthService; +import com.cxx.home.vo.HealthQueryVo; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/health") +@Tag(name = "锻炼记录") +public class HealthController { + @Resource + private HealthService healthService; + + @Operation(summary = "新增锻炼记录") + @PostMapping("") + public Boolean addExercise(@RequestBody @JsonView(WriteView.class) @Validated HealthRecordDto dto) { + return healthService.add(dto); + } + + @Operation(summary = "更新锻炼记录") + @PutMapping("/{id}") + public Boolean updateExercise(@PathVariable("id") long id, + @RequestBody @JsonView(WriteView.class) HealthRecordDto dto) { + return healthService.update(id, dto); + } + + @Operation(summary = "删除锻炼记录") + @DeleteMapping("/{id}") + public Boolean deleteExercise(@PathVariable("id") long id) { + return healthService.delete(id); + } + + @Operation(summary = "查询锻炼记录") + @GetMapping("") + public @JsonView(ReadView.class) List queryExercise(HealthQueryVo queryVo) { + return healthService.query(queryVo); + } +} + \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/converter/HealthConverter.java b/home-service/src/main/java/com/cxx/home/converter/HealthConverter.java new file mode 100644 index 0000000..731af61 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/converter/HealthConverter.java @@ -0,0 +1,18 @@ +package com.cxx.home.converter; + +import com.cxx.home.dto.health.HealthRecordDto; +import com.cxx.home.entity.HealthRecord; +import org.mapstruct.Mapper; + +import java.util.List; + +@Mapper(componentModel = "spring") +public interface HealthConverter { + HealthRecord toEntity(HealthRecordDto dto); + + List toEntities(List dto); + + HealthRecordDto toDto(HealthRecord entities); + + List toDtos(List entities); +} diff --git a/home-service/src/main/java/com/cxx/home/dto/health/HealthRecordDto.java b/home-service/src/main/java/com/cxx/home/dto/health/HealthRecordDto.java new file mode 100644 index 0000000..ae27c3c --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/dto/health/HealthRecordDto.java @@ -0,0 +1,33 @@ +package com.cxx.home.dto.health; + +import com.cxx.common.PlainView; +import com.cxx.common.ReadView; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonView; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDate; + +@Getter +@Setter +@JsonView(PlainView.class) +public class HealthRecordDto { + @Schema(description = "id") + @JsonView(ReadView.class) + private Long id; + + @Schema(description = "运行项目") + private String sportProject; + + @Schema(description = "运行时长") + private Integer sportDuration; + + @Schema(description = "体重") + private Double weight; + + @Schema(description = "记录日期") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private LocalDate date; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/ExerciseRecord.java b/home-service/src/main/java/com/cxx/home/entity/ExerciseRecord.java new file mode 100644 index 0000000..20c9ae0 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/ExerciseRecord.java @@ -0,0 +1,23 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("exercise_record") +public class ExerciseRecord extends AbstractEntity { + @TableField("project") + private String project; + + @TableField("duration") + private Integer duration; + + @TableField("date") + private LocalDate date; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/HealthRecord.java b/home-service/src/main/java/com/cxx/home/entity/HealthRecord.java new file mode 100644 index 0000000..309bac0 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/HealthRecord.java @@ -0,0 +1,26 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("health_record") +public class HealthRecord extends AbstractEntity { + @TableField("sport_project") + private String sportProject; + + @TableField("sport_duration") + private Integer sportDuration; + + @TableField("weight") + private Double weight; + + @TableField("date") + private LocalDate date; +} diff --git a/home-service/src/main/java/com/cxx/home/entity/WeightRecord.java b/home-service/src/main/java/com/cxx/home/entity/WeightRecord.java new file mode 100644 index 0000000..e61a4e8 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/entity/WeightRecord.java @@ -0,0 +1,20 @@ +package com.cxx.home.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cxx.framework.data.AbstractEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDate; + +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("weight_record") +public class WeightRecord extends AbstractEntity { + @TableField("value") + private Double value; + + @TableField("date") + private LocalDate date; +} diff --git a/home-service/src/main/java/com/cxx/home/mapper/ExerciseRecordMapper.java b/home-service/src/main/java/com/cxx/home/mapper/ExerciseRecordMapper.java new file mode 100644 index 0000000..b0fe44a --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/ExerciseRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.ExerciseRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ExerciseRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/HealthRecordMapper.java b/home-service/src/main/java/com/cxx/home/mapper/HealthRecordMapper.java new file mode 100644 index 0000000..d58843f --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/HealthRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.HealthRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface HealthRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/mapper/WeightRecordMapper.java b/home-service/src/main/java/com/cxx/home/mapper/WeightRecordMapper.java new file mode 100644 index 0000000..bca7d50 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/mapper/WeightRecordMapper.java @@ -0,0 +1,9 @@ +package com.cxx.home.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.cxx.home.entity.WeightRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface WeightRecordMapper extends BaseMapper { +} \ No newline at end of file diff --git a/home-service/src/main/java/com/cxx/home/service/HealthService.java b/home-service/src/main/java/com/cxx/home/service/HealthService.java new file mode 100644 index 0000000..300fe6d --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/HealthService.java @@ -0,0 +1,17 @@ +package com.cxx.home.service; + + +import com.cxx.home.dto.health.HealthRecordDto; +import com.cxx.home.vo.HealthQueryVo; + +import java.util.List; + +public interface HealthService { + List query(HealthQueryVo queryVo); + + Boolean add(HealthRecordDto dto); + + Boolean update(Long id, HealthRecordDto dto); + + Boolean delete(Long id); +} diff --git a/home-service/src/main/java/com/cxx/home/service/impl/HealthServiceImpl.java b/home-service/src/main/java/com/cxx/home/service/impl/HealthServiceImpl.java new file mode 100644 index 0000000..68ad234 --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/service/impl/HealthServiceImpl.java @@ -0,0 +1,66 @@ +package com.cxx.home.service.impl; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.cxx.framework.web.CustomException; +import com.cxx.home.converter.HealthConverter; +import com.cxx.home.dto.health.HealthRecordDto; +import com.cxx.home.entity.HealthRecord; +import com.cxx.home.mapper.HealthRecordMapper; +import com.cxx.home.service.HealthService; +import com.cxx.home.vo.HealthQueryVo; +import jakarta.annotation.Resource; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; +import java.util.List; + +@Service +public class HealthServiceImpl implements HealthService { + @Resource + private HealthRecordMapper healthRecordMapper; + + @Resource + private HealthConverter healthConverter; + + @Override + public List query(HealthQueryVo queryVo) { + LocalDate startDate = LocalDate.parse(queryVo.getStartDate()); + LocalDate endDate = LocalDate.parse(queryVo.getEndDate()); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.ge(HealthRecord::getDate, startDate) + .le(HealthRecord::getDate, endDate) + .orderByDesc(HealthRecord::getDate); + + return healthConverter.toDtos(healthRecordMapper.selectList(queryWrapper)); + } + + @Override + public Boolean add(HealthRecordDto dto) { + HealthRecord healthRecord = new HealthRecord(); + BeanUtils.copyProperties(dto, healthRecord); + + return healthRecordMapper.insert(healthRecord) == 1; + } + + @Override + public Boolean update(Long id, HealthRecordDto dto) { + if (!healthRecordMapper.exists(new LambdaQueryWrapper() + .eq(HealthRecord::getId, id))) { + throw new CustomException("记录不存在"); + } + + HealthRecord healthRecord = new HealthRecord(); + BeanUtils.copyProperties(dto, healthRecord); + healthRecord.setId(id); + + return healthRecordMapper.updateById(healthRecord) == 1; + } + + @Override + public Boolean delete(Long id) { + return healthRecordMapper.deleteById(id) == 1; + } +} diff --git a/home-service/src/main/java/com/cxx/home/vo/HealthQueryVo.java b/home-service/src/main/java/com/cxx/home/vo/HealthQueryVo.java new file mode 100644 index 0000000..0810a6c --- /dev/null +++ b/home-service/src/main/java/com/cxx/home/vo/HealthQueryVo.java @@ -0,0 +1,15 @@ +package com.cxx.home.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class HealthQueryVo { + @Schema(description = "开始日期") + private String startDate; + + @Schema(description = "结束日期") + private String endDate; +} \ No newline at end of file