feat: 添加会员和课程模块,支持CRUD操作

This commit is contained in:
Administrator 2026-07-12 10:48:53 +08:00
commit b3d8874496
24 changed files with 789 additions and 1 deletions

View file

@ -3,6 +3,7 @@ package edu.situ.stlserver.controller;
import edu.situ.stlserver.model.dto.CoachAddDTO; import edu.situ.stlserver.model.dto.CoachAddDTO;
import edu.situ.stlserver.model.dto.CoachQueryDTO; import edu.situ.stlserver.model.dto.CoachQueryDTO;
import edu.situ.stlserver.model.dto.CoachUpdateDTO;
import edu.situ.stlserver.model.vo.HttpResult; import edu.situ.stlserver.model.vo.HttpResult;
import edu.situ.stlserver.service.CoachService; import edu.situ.stlserver.service.CoachService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -17,6 +18,12 @@ public class CoachController {
private CoachService coachService; private CoachService coachService;
@GetMapping("/{id}")
public HttpResult getById(@PathVariable Integer id)
{
return HttpResult.success(coachService.getById(id));
}
@GetMapping @GetMapping
public HttpResult getByPage(Integer page , Integer limit , CoachQueryDTO coachQueryDTO) public HttpResult getByPage(Integer page , Integer limit , CoachQueryDTO coachQueryDTO)
{ {
@ -37,10 +44,25 @@ public class CoachController {
return HttpResult.success(); return HttpResult.success();
} }
@DeleteMapping("/{id}")
public HttpResult delete(@PathVariable Integer id)
{
coachService.delete(id);
return HttpResult.success();
}
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public HttpResult add(CoachAddDTO coachAddDTO) public HttpResult add(CoachAddDTO coachAddDTO)
{ {
coachService.add(coachAddDTO); coachService.add(coachAddDTO);
return HttpResult.success(); return HttpResult.success();
} }
@PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public HttpResult update(CoachUpdateDTO coachUpdateDTO)
{
coachService.update(coachUpdateDTO);
return HttpResult.success();
}
} }

View file

@ -0,0 +1,51 @@
package edu.situ.stlserver.controller;
import edu.situ.stlserver.model.dto.CourseAddDTO;
import edu.situ.stlserver.model.dto.CourseQueryDTO;
import edu.situ.stlserver.model.dto.CourseUpdateDTO;
import edu.situ.stlserver.model.vo.HttpResult;
import edu.situ.stlserver.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/course")
public class CourseController {
@Autowired
private CourseService courseService;
@GetMapping("/{id}")
public HttpResult getById(@PathVariable Integer id) {
return HttpResult.success(courseService.getById(id));
}
@GetMapping
public HttpResult getByPage(Integer page, Integer limit, CourseQueryDTO courseQueryDTO) {
return HttpResult.success(courseService.getByPage(page, limit, courseQueryDTO));
}
@DeleteMapping("/{id}")
public HttpResult delete(@PathVariable Integer id) {
courseService.delete(id);
return HttpResult.success();
}
@PutMapping("/{id}/status")
public HttpResult updateStatus(@PathVariable Integer id) {
courseService.updateStatus(id);
return HttpResult.success();
}
@PostMapping
public HttpResult add(@RequestBody CourseAddDTO courseAddDTO) {
courseService.add(courseAddDTO);
return HttpResult.success();
}
@PutMapping
public HttpResult update(@RequestBody CourseUpdateDTO courseUpdateDTO) {
courseService.update(courseUpdateDTO);
return HttpResult.success();
}
}

View file

@ -0,0 +1,58 @@
package edu.situ.stlserver.controller;
import edu.situ.stlserver.model.dto.MemberAddDTO;
import edu.situ.stlserver.model.dto.MemberQueryDTO;
import edu.situ.stlserver.model.dto.MemberUpdateDTO;
import edu.situ.stlserver.model.vo.HttpResult;
import edu.situ.stlserver.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/member")
public class MemberController {
@Autowired
private MemberService memberService;
@GetMapping("/{id}")
public HttpResult getById(@PathVariable Integer id) {
return HttpResult.success(memberService.getById(id));
}
@GetMapping
public HttpResult getByPage(Integer page, Integer limit, MemberQueryDTO memberQueryDTO) {
return HttpResult.success(memberService.getByPage(page, limit, memberQueryDTO));
}
@PutMapping("/{id}/cancel")
public HttpResult cancel(@PathVariable Integer id) {
memberService.cancel(id);
return HttpResult.success();
}
@PutMapping("/{id}/renew")
public HttpResult renew(@PathVariable Integer id) {
memberService.renew(id);
return HttpResult.success();
}
@DeleteMapping("/{id}")
public HttpResult delete(@PathVariable Integer id) {
memberService.delete(id);
return HttpResult.success();
}
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public HttpResult add(MemberAddDTO memberAddDTO) {
memberService.add(memberAddDTO);
return HttpResult.success();
}
@PutMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public HttpResult update(MemberUpdateDTO memberUpdateDTO) {
memberService.update(memberUpdateDTO);
return HttpResult.success();
}
}

View file

@ -38,7 +38,21 @@ public interface CoachMapper {
@Update(value = "UPDATE `coaches` SET `quit_date` = null WHERE `id` = #{id}") @Update(value = "UPDATE `coaches` SET `quit_date` = null WHERE `id` = #{id}")
void rejoin(Integer id); void rejoin(Integer id);
@Delete(value = "DELETE FROM `coaches` WHERE `id` = #{id}")
void delete(Integer id);
@Insert(value = "INSERT INTO `coaches`(`name`, `sex`, `remark`, `avatar`) VALUES (#{name}, #{sex}, #{remark}, #{avatar})") @Insert(value = "INSERT INTO `coaches`(`name`, `sex`, `remark`, `avatar`) VALUES (#{name}, #{sex}, #{remark}, #{avatar})")
@Options(useGeneratedKeys = true, keyProperty = "id" , keyColumn = "id") @Options(useGeneratedKeys = true, keyProperty = "id" , keyColumn = "id")
void insert(Coach coach); void insert(Coach coach);
@Select(value = "SELECT * FROM coaches WHERE id = #{id}")
Coach selectById(Integer id);
@Update(value = "UPDATE coaches SET name = #{name}, sex = #{sex}, remark = #{remark}, avatar = #{avatar} WHERE id = #{id}")
void update(Coach coach);
@Select(value = "SELECT avatar FROM coaches WHERE id = #{id}")
String selectAvatarById(Integer id);
} }

View file

@ -0,0 +1,40 @@
package edu.situ.stlserver.dao;
import edu.situ.stlserver.model.entity.Course;
import edu.situ.stlserver.model.dto.CourseQueryDTO;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface CourseMapper {
@Select(value = "SELECT * FROM courses")
List<Course> selectAll();
@Select(value = {
"<script>",
"SELECT * FROM `courses`",
"<where>",
"<if test=\"name != null and name != ''\"> AND `name` LIKE CONCAT('%', #{name}, '%')</if>",
"<if test=\"status != null and status != ''\"> AND `status` = #{status}</if>",
"</where>",
"</script>"
})
List<Course> select(CourseQueryDTO courseQueryDTO);
@Insert(value = "INSERT INTO `courses`(`name`, `type`, `coach_name`, `price`, `duration`, `start_time`, `capacity`, `remark`, `status`, `enrolled`) VALUES (#{name}, #{type}, #{coachName}, #{price}, #{duration}, #{startTime}, #{capacity}, #{remark}, #{status}, #{enrolled})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
void insert(Course course);
@Delete(value = "DELETE FROM `courses` WHERE `id` = #{id}")
void delete(Integer id);
@Update(value = "UPDATE `courses` SET `status` = #{status} WHERE `id` = #{id}")
void updateStatus(@Param("id") Integer id, @Param("status") String status);
@Select(value = "SELECT * FROM courses WHERE id = #{id}")
Course selectById(Integer id);
@Update(value = "UPDATE courses SET name = #{name}, type = #{type}, coach_name = #{coachName}, price = #{price}, duration = #{duration}, start_time = #{startTime}, capacity = #{capacity}, remark = #{remark} WHERE id = #{id}")
void update(Course course);
}

View file

@ -0,0 +1,52 @@
package edu.situ.stlserver.dao;
import edu.situ.stlserver.model.entity.Member;
import edu.situ.stlserver.model.dto.MemberQueryDTO;
import org.apache.ibatis.annotations.*;
import java.util.List;
@Mapper
public interface MemberMapper {
@Select(value = "SELECT * FROM members")
List<Member> selectAll();
@Select(value = {
"<script>",
"SELECT * FROM `members`",
"<where>",
"<if test=\"name != null and name != ''\"> AND `name` LIKE CONCAT('%', #{name}, '%')</if>",
"<if test=\"sex != null and sex != 0\"> AND `sex` = #{sex}</if>",
"<if test=\"status != null and status != 1\">",
"<choose>",
"<when test=\"status == 2\"> AND expire_date IS NULL</when>",
"<when test=\"status == 3\"> AND expire_date IS NOT NULL</when>",
"</choose>",
"</if>",
"</where>",
"</script>"
})
List<Member> select(MemberQueryDTO memberQueryDTO);
@Insert(value = "INSERT INTO `members`(`name`, `sex`, `phone`, `level`, `remark`, `avatar`, `join_date`, `remain_count`, `total_spend`) VALUES (#{name}, #{sex}, #{phone}, #{level}, #{remark}, #{avatar}, #{joinDate}, #{remainCount}, #{totalSpend})")
@Options(useGeneratedKeys = true, keyProperty = "id", keyColumn = "id")
void insert(Member member);
@Update(value = "UPDATE `members` SET `expire_date` = #{expireDate} WHERE `id` = #{id}")
void cancel(@Param("id") Integer id, @Param("expireDate") String expireDate);
@Update(value = "UPDATE `members` SET `expire_date` = null WHERE `id` = #{id}")
void renew(Integer id);
@Delete(value = "DELETE FROM `members` WHERE `id` = #{id}")
void delete(Integer id);
@Select(value = "SELECT * FROM members WHERE id = #{id}")
Member selectById(Integer id);
@Select(value = "SELECT avatar FROM members WHERE id = #{id}")
String selectAvatarById(Integer id);
@Update(value = "UPDATE members SET name = #{name}, sex = #{sex}, phone = #{phone}, level = #{level}, remark = #{remark}, avatar = #{avatar} WHERE id = #{id}")
void update(Member member);
}

View file

@ -0,0 +1,21 @@
package edu.situ.stlserver.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.web.multipart.MultipartFile;
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class CoachUpdateDTO {
private Integer id;
private String name;
private String avatar;
private String remark;
private Integer sex;
private MultipartFile file;
}

View file

@ -0,0 +1,19 @@
package edu.situ.stlserver.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CourseAddDTO {
private String name;
private String type;
private String coachName;
private Integer price;
private String duration;
private String startTime;
private Integer capacity;
private String remark;
}

View file

@ -0,0 +1,13 @@
package edu.situ.stlserver.model.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@ToString
@NoArgsConstructor
@Data
public class CourseQueryDTO {
private String name;
private String status;
}

View file

@ -0,0 +1,20 @@
package edu.situ.stlserver.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class CourseUpdateDTO {
private Integer id;
private String name;
private String type;
private String coachName;
private Integer price;
private String duration;
private String startTime;
private Integer capacity;
private String remark;
}

View file

@ -0,0 +1,18 @@
package edu.situ.stlserver.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemberAddDTO {
private String name;
private Integer sex;
private String phone;
private String level;
private String remark;
private MultipartFile file;
}

View file

@ -0,0 +1,14 @@
package edu.situ.stlserver.model.dto;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@ToString
@NoArgsConstructor
@Data
public class MemberQueryDTO {
private String name;
private Integer sex;
private Integer status;
}

View file

@ -0,0 +1,20 @@
package edu.situ.stlserver.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.web.multipart.MultipartFile;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MemberUpdateDTO {
private Integer id;
private String name;
private Integer sex;
private String phone;
private String level;
private String remark;
private String avatar;
private MultipartFile file;
}

View file

@ -0,0 +1,22 @@
package edu.situ.stlserver.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@ToString
@NoArgsConstructor
@Data
public class Course {
private Integer id;
private String name;
private String type;
private String coachName;
private Integer price;
private String duration;
private String status;
private String remark;
private String startTime;
private Integer enrolled;
private Integer capacity;
}

View file

@ -0,0 +1,22 @@
package edu.situ.stlserver.model.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@ToString
@NoArgsConstructor
@Data
public class Member {
private Integer id;
private String name;
private Integer sex;
private String avatar;
private String phone;
private String remark;
private String expireDate;
private String joinDate;
private String level;
private Integer remainCount;
private Integer totalSpend;
}

View file

@ -2,6 +2,7 @@ package edu.situ.stlserver.service;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.model.dto.CoachAddDTO; import edu.situ.stlserver.model.dto.CoachAddDTO;
import edu.situ.stlserver.model.dto.CoachUpdateDTO;
import edu.situ.stlserver.model.entity.Coach; import edu.situ.stlserver.model.entity.Coach;
import edu.situ.stlserver.model.dto.CoachQueryDTO; import edu.situ.stlserver.model.dto.CoachQueryDTO;
@ -14,5 +15,8 @@ public interface CoachService {
PageInfo<Coach> getByPage(Integer page, Integer limit, CoachQueryDTO coachQueryDTO); PageInfo<Coach> getByPage(Integer page, Integer limit, CoachQueryDTO coachQueryDTO);
void quit(Integer id); void quit(Integer id);
void rejoin(Integer id); void rejoin(Integer id);
void delete(Integer id);
void add(CoachAddDTO coachAddDTO); void add(CoachAddDTO coachAddDTO);
Coach getById(Integer id);
void update(CoachUpdateDTO coachUpdateDTO);
} }

View file

@ -0,0 +1,19 @@
package edu.situ.stlserver.service;
import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.model.dto.CourseAddDTO;
import edu.situ.stlserver.model.dto.CourseUpdateDTO;
import edu.situ.stlserver.model.entity.Course;
import edu.situ.stlserver.model.dto.CourseQueryDTO;
import java.util.List;
public interface CourseService {
List<Course> getAll();
PageInfo<Course> getByPage(Integer page, Integer limit, CourseQueryDTO courseQueryDTO);
void delete(Integer id);
void updateStatus(Integer id);
void add(CourseAddDTO courseAddDTO);
Course getById(Integer id);
void update(CourseUpdateDTO courseUpdateDTO);
}

View file

@ -0,0 +1,20 @@
package edu.situ.stlserver.service;
import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.model.dto.MemberAddDTO;
import edu.situ.stlserver.model.dto.MemberUpdateDTO;
import edu.situ.stlserver.model.entity.Member;
import edu.situ.stlserver.model.dto.MemberQueryDTO;
import java.util.List;
public interface MemberService {
List<Member> getAll();
PageInfo<Member> getByPage(Integer page, Integer limit, MemberQueryDTO memberQueryDTO);
void cancel(Integer id);
void renew(Integer id);
void delete(Integer id);
void add(MemberAddDTO memberAddDTO);
Member getById(Integer id);
void update(MemberUpdateDTO memberUpdateDTO);
}

View file

@ -5,6 +5,7 @@ import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.dao.CoachMapper; import edu.situ.stlserver.dao.CoachMapper;
import edu.situ.stlserver.model.dto.CoachAddDTO; import edu.situ.stlserver.model.dto.CoachAddDTO;
import edu.situ.stlserver.model.dto.CoachUpdateDTO;
import edu.situ.stlserver.model.entity.Coach; import edu.situ.stlserver.model.entity.Coach;
import edu.situ.stlserver.model.dto.CoachQueryDTO; import edu.situ.stlserver.model.dto.CoachQueryDTO;
import edu.situ.stlserver.service.CoachService; import edu.situ.stlserver.service.CoachService;
@ -51,6 +52,15 @@ public class CoachServiceImpl implements CoachService {
coachMapper.rejoin(id); coachMapper.rejoin(id);
} }
@Override
public void delete(Integer id) {
String avatar = coachMapper.selectAvatarById(id);
if (avatar != null) {
new File(baseUploadPath + avatar).delete();
}
coachMapper.delete(id);
}
@Override @Override
public void add(CoachAddDTO coachAddDTO) { public void add(CoachAddDTO coachAddDTO) {
Coach coach = new Coach(); Coach coach = new Coach();
@ -73,6 +83,8 @@ public class CoachServiceImpl implements CoachService {
} }
private String saveAvatar(MultipartFile file) throws Exception { private String saveAvatar(MultipartFile file) throws Exception {
String originFilename = file.getOriginalFilename(); String originFilename = file.getOriginalFilename();
String suffix = originFilename.substring(originFilename.lastIndexOf(".")); String suffix = originFilename.substring(originFilename.lastIndexOf("."));
@ -83,4 +95,43 @@ public class CoachServiceImpl implements CoachService {
return coachUploadPath + filename; return coachUploadPath + filename;
} }
@Override
public Coach getById(Integer id) {
return coachMapper.selectById(id);
}
@Override
public void update(CoachUpdateDTO coachUpdateDTO) {
// 将coachUpdateDTO转换为coach对象
Coach coach = new Coach();
coach.setId(coachUpdateDTO.getId());
coach.setName(coachUpdateDTO.getName());
coach.setSex(coachUpdateDTO.getSex());
coach.setRemark(coachUpdateDTO.getRemark());
// 处理avatar
String recordAvatar = coachMapper.selectAvatarById(coachUpdateDTO.getId()); // 获取教练当前记录的头像路径
if (coachUpdateDTO.getFile() != null && !coachUpdateDTO.getFile().isEmpty()) { // 情况一:用户选了新头像
// 保存新选的文件
String avatar;
try {
avatar = saveAvatar(coachUpdateDTO.getFile());
if (recordAvatar != null) { // 如果有旧文件,删除旧文件
new File(baseUploadPath + recordAvatar).delete();
}
coach.setAvatar(avatar); // 再将新文件的访问路径保存到coach对象的avatar字段中
} catch (Exception e) {
throw new RuntimeException("教练新头像保存失败/删除旧头像失败");
}
} else {
if ((coachUpdateDTO.getAvatar() == null || coachUpdateDTO.getAvatar().isEmpty()) && recordAvatar != null) { // 情况二:用户把原来的头像删除了
new File(baseUploadPath + recordAvatar).delete();
coach.setAvatar(null);
} else { // 情况三:用户没有动头像
coach.setAvatar(coachUpdateDTO.getAvatar());
coach.setAvatar(recordAvatar);
}
}
// 调用coachMapper的insert完成数据库的插入操作
coachMapper.update(coach);
}
} }

View file

@ -0,0 +1,84 @@
package edu.situ.stlserver.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.dao.CourseMapper;
import edu.situ.stlserver.model.dto.CourseAddDTO;
import edu.situ.stlserver.model.dto.CourseUpdateDTO;
import edu.situ.stlserver.model.entity.Course;
import edu.situ.stlserver.model.dto.CourseQueryDTO;
import edu.situ.stlserver.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class CourseServiceImpl implements CourseService {
@Autowired
private CourseMapper courseMapper;
@Override
public List<Course> getAll() {
return courseMapper.selectAll();
}
@Override
public PageInfo<Course> getByPage(Integer page, Integer limit, CourseQueryDTO courseQueryDTO) {
if (page == null) page = 1;
if (limit == null) limit = 10;
PageHelper.startPage(page, limit);
return new PageInfo<>(courseMapper.select(courseQueryDTO));
}
@Override
public void delete(Integer id) {
courseMapper.delete(id);
}
@Override
public void updateStatus(Integer id) {
Course course = courseMapper.selectById(id);
if (course != null) {
String newStatus = "进行中".equals(course.getStatus()) ? "已结束" : "进行中";
courseMapper.updateStatus(id, newStatus);
}
}
@Override
public void add(CourseAddDTO courseAddDTO) {
Course course = new Course();
course.setName(courseAddDTO.getName());
course.setType(courseAddDTO.getType());
course.setCoachName(courseAddDTO.getCoachName());
course.setPrice(courseAddDTO.getPrice());
course.setDuration(courseAddDTO.getDuration());
course.setStartTime(courseAddDTO.getStartTime());
course.setCapacity(courseAddDTO.getCapacity());
course.setRemark(courseAddDTO.getRemark());
course.setStatus("进行中");
course.setEnrolled(0);
courseMapper.insert(course);
}
@Override
public Course getById(Integer id) {
return courseMapper.selectById(id);
}
@Override
public void update(CourseUpdateDTO courseUpdateDTO) {
Course course = new Course();
course.setId(courseUpdateDTO.getId());
course.setName(courseUpdateDTO.getName());
course.setType(courseUpdateDTO.getType());
course.setCoachName(courseUpdateDTO.getCoachName());
course.setPrice(courseUpdateDTO.getPrice());
course.setDuration(courseUpdateDTO.getDuration());
course.setStartTime(courseUpdateDTO.getStartTime());
course.setCapacity(courseUpdateDTO.getCapacity());
course.setRemark(courseUpdateDTO.getRemark());
courseMapper.update(course);
}
}

View file

@ -0,0 +1,135 @@
package edu.situ.stlserver.service.impl;
import cn.hutool.core.date.DateUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import edu.situ.stlserver.dao.MemberMapper;
import edu.situ.stlserver.model.dto.MemberAddDTO;
import edu.situ.stlserver.model.dto.MemberUpdateDTO;
import edu.situ.stlserver.model.entity.Member;
import edu.situ.stlserver.model.dto.MemberQueryDTO;
import edu.situ.stlserver.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.List;
import java.util.UUID;
@Service
public class MemberServiceImpl implements MemberService {
@Value("${upload.base-path}")
private String baseUploadPath;
@Value("${upload.image.member}")
private String memberUploadPath;
@Autowired
private MemberMapper memberMapper;
@Override
public List<Member> getAll() {
return memberMapper.selectAll();
}
@Override
public PageInfo<Member> getByPage(Integer page, Integer limit, MemberQueryDTO memberQueryDTO) {
if (page == null) page = 1;
if (limit == null) limit = 10;
PageHelper.startPage(page, limit);
return new PageInfo<>(memberMapper.select(memberQueryDTO));
}
@Override
public void cancel(Integer id) {
memberMapper.cancel(id, DateUtil.today());
}
@Override
public void renew(Integer id) {
memberMapper.renew(id);
}
@Override
public void delete(Integer id) {
String avatar = memberMapper.selectAvatarById(id);
if (avatar != null) {
new File(baseUploadPath + avatar).delete();
}
memberMapper.delete(id);
}
@Override
public void add(MemberAddDTO memberAddDTO) {
Member member = new Member();
member.setName(memberAddDTO.getName());
member.setSex(memberAddDTO.getSex());
member.setPhone(memberAddDTO.getPhone());
member.setLevel(memberAddDTO.getLevel());
member.setRemark(memberAddDTO.getRemark());
member.setJoinDate(DateUtil.today());
member.setRemainCount(null);
member.setTotalSpend(0);
if (memberAddDTO.getFile() != null && !memberAddDTO.getFile().isEmpty()) {
try {
String avatar = saveAvatar(memberAddDTO.getFile());
member.setAvatar(avatar);
} catch (Exception e) {
throw new RuntimeException("保存头像失败");
}
}
memberMapper.insert(member);
}
private String saveAvatar(MultipartFile file) throws Exception {
String originFilename = file.getOriginalFilename();
String suffix = originFilename.substring(originFilename.lastIndexOf("."));
String filename = UUID.randomUUID().toString() + suffix;
File dir = new File(baseUploadPath + memberUploadPath);
if (!dir.exists()) {
dir.mkdirs();
}
file.transferTo(new File(baseUploadPath + memberUploadPath + filename));
return memberUploadPath + filename;
}
@Override
public Member getById(Integer id) {
return memberMapper.selectById(id);
}
@Override
public void update(MemberUpdateDTO memberUpdateDTO) {
Member member = new Member();
member.setId(memberUpdateDTO.getId());
member.setName(memberUpdateDTO.getName());
member.setSex(memberUpdateDTO.getSex());
member.setPhone(memberUpdateDTO.getPhone());
member.setLevel(memberUpdateDTO.getLevel());
member.setRemark(memberUpdateDTO.getRemark());
String recordAvatar = memberMapper.selectAvatarById(memberUpdateDTO.getId());
if (memberUpdateDTO.getFile() != null && !memberUpdateDTO.getFile().isEmpty()) {
try {
String avatar = saveAvatar(memberUpdateDTO.getFile());
if (recordAvatar != null) {
new File(baseUploadPath + recordAvatar).delete();
}
member.setAvatar(avatar);
} catch (Exception e) {
throw new RuntimeException("会员新头像保存失败");
}
} else {
if ((memberUpdateDTO.getAvatar() == null || memberUpdateDTO.getAvatar().isEmpty()) && recordAvatar != null) {
new File(baseUploadPath + recordAvatar).delete();
member.setAvatar(null);
} else {
member.setAvatar(recordAvatar);
}
}
memberMapper.update(member);
}
}

View file

@ -29,4 +29,4 @@ upload:
base-path: D:/stl-static base-path: D:/stl-static
image: image:
coach: /images/coach/ coach: /images/coach/
member: /imges/member/ member: /images/member/

View file

@ -0,0 +1,40 @@
-- 会员模拟数据
INSERT INTO `members` (`name`, `sex`, `phone`, `level`, `remark`, `join_date`, `remain_count`, `total_spend`) VALUES
('张三', 1, '13800138001', '金卡', '年卡会员,喜欢瑜伽', '2024-01-15', NULL, 5999),
('李四', 2, '13800138002', '银卡', '季卡会员,减脂塑形', '2024-06-20', NULL, 2999),
('王五', 1, '13800138003', '普通', '月卡会员,增肌训练', '2024-09-10', NULL, 999),
('赵六', 2, '13800138004', '钻石', '年卡会员,产后恢复', '2023-12-01', NULL, 12999),
('钱七', 1, '13800138005', '普通', '次卡会员,游泳爱好者', '2024-03-15', 5, 1500),
('孙八', 2, '13800138006', '金卡', '年卡会员,搏击训练', '2024-02-28', NULL, 8999),
('周九', 1, '13800138007', '银卡', '季卡会员,普拉提', '2024-07-05', NULL, 3499),
('吴十', 2, '13800138008', '普通', '月卡会员,有氧舞蹈', '2024-10-12', NULL, 799),
('郑十一', 1, '13800138009', '金卡', '年卡会员,自由重量', '2024-01-20', NULL, 6999),
('冯十二', 2, '13800138010', '普通', '次卡会员,动感单车', '2024-05-18', 8, 1200),
('陈十三', 1, '13800138011', '钻石', '年卡会员,拳击训练', '2023-11-25', NULL, 15999),
('楚十四', 2, '13800138012', '银卡', '季卡会员,形体塑造', '2024-08-08', NULL, 2599),
('魏十五', 1, '13800138013', '普通', '月卡会员,康复训练', '2024-10-01', NULL, 599),
('蒋十六', 2, '13800138014', '金卡', '年卡会员,舞蹈培训', '2024-03-10', NULL, 7499),
('沈十七', 1, '13800138015', '普通', '次卡会员,攀岩爱好者', '2024-06-15', 12, 1800),
('韩十八', 2, '13800138016', '银卡', '季卡会员,有氧操', '2024-09-20', NULL, 2799),
('杨十九', 1, '13800138017', '钻石', '年卡会员,力量训练', '2024-01-05', NULL, 18999),
('朱二十', 2, '13800138018', '普通', '月卡会员,纤体瑜伽', '2024-10-15', NULL, 699),
('秦廿一', 1, '13800138019', '金卡', '年卡会员,CrossFit', '2024-02-14', NULL, 9499),
('许廿二', 2, '13800138020', '银卡', '季卡会员,空中瑜伽', '2024-07-22', NULL, 3199);
-- 课程模拟数据
INSERT INTO `courses` (`name`, `type`, `coach_name`, `price`, `duration`, `status`, `remark`, `start_time`, `enrolled`, `capacity`) VALUES
('瑜伽入门', '瑜伽', '铁娃', 199, '60分钟', '进行中', '适合零基础学员', '2024-08-01 09:00', 25, 30),
('力量训练', '力量', '小明', 299, '45分钟', '进行中', '增肌塑形专用', '2024-08-01 14:00', 18, 20),
('有氧舞蹈', '有氧', '李娜', 159, '50分钟', '进行中', '燃脂效果好', '2024-08-02 10:00', 30, 35),
('搏击操', '搏击', '王强', 259, '40分钟', '进行中', '释放压力', '2024-08-02 16:00', 15, 20),
('普拉提', '瑜伽', '刘芳', 229, '55分钟', '进行中', '改善体态', '2024-08-03 09:30', 22, 25),
('动感单车', '有氧', '陈刚', 179, '45分钟', '已结束', '高强度有氧', '2024-07-01 18:00', 30, 30),
('游泳训练', '水上', '赵敏', 349, '60分钟', '进行中', '全身运动', '2024-08-04 15:00', 12, 15),
('拳击入门', '搏击', '周涛', 289, '50分钟', '进行中', '防身健身两不误', '2024-08-05 19:00', 20, 20),
('形体塑造', '塑形', '吴雪', 199, '45分钟', '进行中', '塑造完美身材', '2024-08-06 10:30', 28, 30),
('康复训练', '康复', '孙磊', 399, '60分钟', '进行中', '运动损伤恢复', '2024-08-07 14:30', 8, 10),
('舞蹈培训', '舞蹈', '朱婷', 249, '50分钟', '已结束', '多种舞种', '2024-06-15 11:00', 25, 30),
('攀岩课程', '户外', '林浩', 329, '90分钟', '进行中', '挑战自我', '2024-08-08 16:30', 10, 12),
('空手道', '搏击', '杨丽', 279, '55分钟', '进行中', '防身技能', '2024-08-09 18:30', 16, 20),
('肚皮舞', '舞蹈', '黄勇', 189, '45分钟', '进行中', '女性专属', '2024-08-10 13:00', 22, 25),
('CrossFit', '综合', '徐静', 359, '60分钟', '进行中', '综合训练', '2024-08-11 07:30', 18, 20);

View file

@ -0,0 +1,29 @@
-- 会员表
CREATE TABLE IF NOT EXISTS `members` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(50) NOT NULL,
`sex` INT NOT NULL COMMENT '1:男 2:女',
`avatar` VARCHAR(255) DEFAULT NULL,
`phone` VARCHAR(20) NOT NULL,
`remark` TEXT DEFAULT NULL,
`expire_date` DATE DEFAULT NULL COMMENT '过期日期,NULL表示有效',
`join_date` DATE NOT NULL COMMENT '入会日期',
`level` VARCHAR(20) NOT NULL DEFAULT '普通' COMMENT '会员等级:普通/银卡/金卡/钻石',
`remain_count` INT DEFAULT NULL COMMENT '剩余次数,NULL表示不限次',
`total_spend` INT DEFAULT 0 COMMENT '累计消费(元)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 课程表
CREATE TABLE IF NOT EXISTS `courses` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100) NOT NULL,
`type` VARCHAR(50) NOT NULL COMMENT '课程类型',
`coach_name` VARCHAR(50) NOT NULL COMMENT '授课教练',
`price` INT NOT NULL COMMENT '价格(元)',
`duration` VARCHAR(20) NOT NULL COMMENT '时长',
`status` VARCHAR(20) NOT NULL DEFAULT '进行中' COMMENT '状态:进行中/已结束',
`remark` TEXT DEFAULT NULL,
`start_time` VARCHAR(50) NOT NULL COMMENT '开课时间',
`enrolled` INT DEFAULT 0 COMMENT '已报名人数',
`capacity` INT NOT NULL COMMENT '课程容量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;