feat:增加运动健康接口

This commit is contained in:
2025-11-04 20:05:01 +08:00
parent c8d2bd1df0
commit f9d01b7b36
12 changed files with 294 additions and 0 deletions

View File

@@ -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<HealthRecordDto> queryExercise(HealthQueryVo queryVo) {
return healthService.query(queryVo);
}
}

View File

@@ -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<HealthRecord> toEntities(List<HealthRecordDto> dto);
HealthRecordDto toDto(HealthRecord entities);
List<HealthRecordDto> toDtos(List<HealthRecord> entities);
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<ExerciseRecord> {
}

View File

@@ -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<HealthRecord> {
}

View File

@@ -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<WeightRecord> {
}

View File

@@ -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<HealthRecordDto> query(HealthQueryVo queryVo);
Boolean add(HealthRecordDto dto);
Boolean update(Long id, HealthRecordDto dto);
Boolean delete(Long id);
}

View File

@@ -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<HealthRecordDto> query(HealthQueryVo queryVo) {
LocalDate startDate = LocalDate.parse(queryVo.getStartDate());
LocalDate endDate = LocalDate.parse(queryVo.getEndDate());
LambdaQueryWrapper<HealthRecord> 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<HealthRecord>()
.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;
}
}

View File

@@ -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;
}