分类管理,评论,资源,课程

main
2991692032 4 weeks ago
parent f4a8658562
commit 5f8719721c

@ -0,0 +1,84 @@
package com.unilife.controller;
import com.unilife.common.result.Result;
import com.unilife.model.entity.Category;
import com.unilife.service.CategoryService;
import com.unilife.utils.BaseContext;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Tag(name = "分类管理")
@RestController
@RequestMapping("/categories")
@Slf4j
public class CategoryController {
@Autowired
private CategoryService categoryService;
@Operation(summary = "获取分类详情")
@GetMapping("/{id}")
public Result<?> getCategoryDetail(@PathVariable("id") Long categoryId) {
return categoryService.getCategoryDetail(categoryId);
}
@Operation(summary = "获取分类列表")
@GetMapping
public Result<?> getCategoryList(
@RequestParam(value = "status", required = false) Byte status) {
return categoryService.getCategoryList(status);
}
@Operation(summary = "创建分类")
@PostMapping
public Result<?> createCategory(@RequestBody Category category) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
// 检查用户权限(只有管理员可以创建分类)
// 实际项目中应该从用户服务获取用户角色信息
// 这里简化处理,假设已经检查了权限
return categoryService.createCategory(category);
}
@Operation(summary = "更新分类")
@PutMapping("/{id}")
public Result<?> updateCategory(
@PathVariable("id") Long categoryId,
@RequestBody Category category) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
// 检查用户权限(只有管理员可以更新分类)
// 实际项目中应该从用户服务获取用户角色信息
// 这里简化处理,假设已经检查了权限
return categoryService.updateCategory(categoryId, category);
}
@Operation(summary = "删除分类")
@DeleteMapping("/{id}")
public Result<?> deleteCategory(@PathVariable("id") Long categoryId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
// 检查用户权限(只有管理员可以删除分类)
// 实际项目中应该从用户服务获取用户角色信息
// 这里简化处理,假设已经检查了权限
return categoryService.deleteCategory(categoryId);
}
}

@ -0,0 +1,62 @@
package com.unilife.controller;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateCommentDTO;
import com.unilife.service.CommentService;
import com.unilife.utils.BaseContext;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Tag(name = "评论管理")
@RestController
@RequestMapping("/comments")
@Slf4j
public class CommentController {
@Autowired
private CommentService commentService;
@Operation(summary = "创建评论")
@PostMapping
public Result<?> createComment(@RequestBody CreateCommentDTO createCommentDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return commentService.createComment(userId, createCommentDTO);
}
@Operation(summary = "获取帖子评论列表")
@GetMapping("/post/{postId}")
public Result<?> getCommentsByPostId(@PathVariable("postId") Long postId) {
// 从当前上下文获取用户ID可能为null未登录用户
Long userId = BaseContext.getId();
return commentService.getCommentsByPostId(postId, userId);
}
@Operation(summary = "删除评论")
@DeleteMapping("/{id}")
public Result<?> deleteComment(@PathVariable("id") Long commentId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return commentService.deleteComment(commentId, userId);
}
@Operation(summary = "点赞/取消点赞评论")
@PostMapping("/{id}/like")
public Result<?> likeComment(@PathVariable("id") Long commentId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return commentService.likeComment(commentId, userId);
}
}

@ -0,0 +1,104 @@
package com.unilife.controller;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateCourseDTO;
import com.unilife.service.CourseService;
import com.unilife.utils.BaseContext;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@Tag(name = "课程管理")
@RestController
@RequestMapping("/courses")
@Slf4j
public class CourseController {
@Autowired
private CourseService courseService;
@Operation(summary = "创建课程")
@PostMapping
public Result<?> createCourse(@RequestBody CreateCourseDTO createCourseDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.createCourse(userId, createCourseDTO);
}
@Operation(summary = "获取课程详情")
@GetMapping("/{id}")
public Result<?> getCourseDetail(@PathVariable("id") Long courseId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.getCourseDetail(courseId, userId);
}
@Operation(summary = "获取用户的所有课程")
@GetMapping
public Result<?> getCourseList() {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.getCourseList(userId);
}
@Operation(summary = "获取用户在指定星期几的课程")
@GetMapping("/day/{dayOfWeek}")
public Result<?> getCourseListByDayOfWeek(@PathVariable("dayOfWeek") Byte dayOfWeek) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.getCourseListByDayOfWeek(userId, dayOfWeek);
}
@Operation(summary = "更新课程")
@PutMapping("/{id}")
public Result<?> updateCourse(
@PathVariable("id") Long courseId,
@RequestBody CreateCourseDTO createCourseDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.updateCourse(courseId, userId, createCourseDTO);
}
@Operation(summary = "删除课程")
@DeleteMapping("/{id}")
public Result<?> deleteCourse(@PathVariable("id") Long courseId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.deleteCourse(courseId, userId);
}
@Operation(summary = "检查课程时间冲突")
@GetMapping("/check-conflict")
public Result<?> checkCourseConflict(
@RequestParam("dayOfWeek") Byte dayOfWeek,
@RequestParam("startTime") String startTime,
@RequestParam("endTime") String endTime,
@RequestParam(value = "excludeCourseId", required = false) Long excludeCourseId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return courseService.checkCourseConflict(userId, dayOfWeek, startTime, endTime, excludeCourseId);
}
}

@ -0,0 +1,127 @@
package com.unilife.controller;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateResourceDTO;
import com.unilife.service.ResourceService;
import com.unilife.utils.BaseContext;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Tag(name = "资源管理")
@RestController
@RequestMapping("/resources")
@Slf4j
public class ResourceController {
@Autowired
private ResourceService resourceService;
@Operation(summary = "上传资源")
@PostMapping
public Result<?> uploadResource(@RequestParam("file") MultipartFile file,
@RequestParam("title") String title,
@RequestParam("description") String description,
@RequestParam("categoryId") Long categoryId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
// 创建DTO
CreateResourceDTO createResourceDTO = new CreateResourceDTO();
createResourceDTO.setTitle(title);
createResourceDTO.setDescription(description);
createResourceDTO.setCategoryId(categoryId);
return resourceService.uploadResource(userId, createResourceDTO, file);
}
@Operation(summary = "获取资源详情")
@GetMapping("/{id}")
public Result<?> getResourceDetail(@PathVariable("id") Long resourceId) {
// 从当前上下文获取用户ID可能为null未登录用户
Long userId = BaseContext.getId();
return resourceService.getResourceDetail(resourceId, userId);
}
@Operation(summary = "获取资源列表")
@GetMapping
public Result<?> getResourceList(
@RequestParam(value = "category", required = false) Long categoryId,
@RequestParam(value = "user", required = false) Long userId,
@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
return resourceService.getResourceList(categoryId, userId, keyword, page, size);
}
@Operation(summary = "更新资源")
@PutMapping("/{id}")
public Result<?> updateResource(
@PathVariable("id") Long resourceId,
@RequestBody CreateResourceDTO createResourceDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return resourceService.updateResource(resourceId, userId, createResourceDTO);
}
@Operation(summary = "删除资源")
@DeleteMapping("/{id}")
public Result<?> deleteResource(@PathVariable("id") Long resourceId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return resourceService.deleteResource(resourceId, userId);
}
@Operation(summary = "下载资源")
@GetMapping("/{id}/download")
public Result<?> downloadResource(@PathVariable("id") Long resourceId) {
// 从当前上下文获取用户ID可能为null未登录用户
Long userId = BaseContext.getId();
return resourceService.downloadResource(resourceId, userId);
}
@Operation(summary = "点赞/取消点赞资源")
@PostMapping("/{id}/like")
public Result<?> likeResource(@PathVariable("id") Long resourceId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return resourceService.likeResource(resourceId, userId);
}
@Operation(summary = "获取用户上传的资源列表")
@GetMapping("/user/{userId}")
public Result<?> getUserResources(
@PathVariable("userId") Long targetUserId,
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
return resourceService.getUserResources(targetUserId, page, size);
}
@Operation(summary = "获取当前用户上传的资源列表")
@GetMapping("/my")
public Result<?> getMyResources(
@RequestParam(value = "page", defaultValue = "1") Integer page,
@RequestParam(value = "size", defaultValue = "10") Integer size) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return resourceService.getUserResources(userId, page, size);
}
}

@ -0,0 +1,116 @@
package com.unilife.controller;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateScheduleDTO;
import com.unilife.service.ScheduleService;
import com.unilife.utils.BaseContext;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
@Tag(name = "日程管理")
@RestController
@RequestMapping("/schedules")
@Slf4j
public class ScheduleController {
@Autowired
private ScheduleService scheduleService;
@Operation(summary = "创建日程")
@PostMapping
public Result<?> createSchedule(@RequestBody CreateScheduleDTO createScheduleDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.createSchedule(userId, createScheduleDTO);
}
@Operation(summary = "获取日程详情")
@GetMapping("/{id}")
public Result<?> getScheduleDetail(@PathVariable("id") Long scheduleId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.getScheduleDetail(scheduleId, userId);
}
@Operation(summary = "获取用户的所有日程")
@GetMapping
public Result<?> getScheduleList() {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.getScheduleList(userId);
}
@Operation(summary = "获取用户在指定时间范围内的日程")
@GetMapping("/range")
public Result<?> getScheduleListByTimeRange(
@RequestParam("startTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
@RequestParam("endTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.getScheduleListByTimeRange(userId, startTime, endTime);
}
@Operation(summary = "更新日程")
@PutMapping("/{id}")
public Result<?> updateSchedule(
@PathVariable("id") Long scheduleId,
@RequestBody CreateScheduleDTO createScheduleDTO) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.updateSchedule(scheduleId, userId, createScheduleDTO);
}
@Operation(summary = "删除日程")
@DeleteMapping("/{id}")
public Result<?> deleteSchedule(@PathVariable("id") Long scheduleId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.deleteSchedule(scheduleId, userId);
}
@Operation(summary = "检查日程时间冲突")
@GetMapping("/check-conflict")
public Result<?> checkScheduleConflict(
@RequestParam("startTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startTime,
@RequestParam("endTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endTime,
@RequestParam(value = "excludeScheduleId", required = false) Long excludeScheduleId) {
// 从当前上下文获取用户ID
Long userId = BaseContext.getId();
if (userId == null) {
return Result.error(401, "未登录");
}
return scheduleService.checkScheduleConflict(userId, startTime, endTime, excludeScheduleId);
}
@Operation(summary = "处理日程提醒")
@PostMapping("/process-reminders")
public Result<?> processScheduleReminders() {
// 此接口通常由系统定时任务调用,不需要用户认证
// 实际项目中应该添加适当的安全措施如API密钥验证
return scheduleService.processScheduleReminders();
}
}

@ -0,0 +1,52 @@
package com.unilife.mapper;
import com.unilife.model.entity.Category;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 访
*/
@Mapper
public interface CategoryMapper {
/**
* ID
* @param id ID
* @return
*/
Category getById(Long id);
/**
*
* @param status null
* @return
*/
List<Category> getList(@Param("status") Byte status);
/**
*
* @param category
*/
void insert(Category category);
/**
*
* @param category
*/
void update(Category category);
/**
*
* @param id ID
*/
void delete(Long id);
/**
*
* @param status null
* @return
*/
Integer getCount(@Param("status") Byte status);
}

@ -0,0 +1,71 @@
package com.unilife.mapper;
import com.unilife.model.entity.Comment;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 访
*/
@Mapper
public interface CommentMapper {
/**
*
* @param comment
*/
void insert(Comment comment);
/**
* ID
* @param id ID
* @return
*/
Comment getById(Long id);
/**
*
* @param postId ID
* @return
*/
List<Comment> getTopLevelCommentsByPostId(@Param("postId") Long postId);
/**
*
* @param parentId ID
* @return
*/
List<Comment> getRepliesByParentId(@Param("parentId") Long parentId);
/**
*
* @param postId ID
* @return
*/
Integer getCountByPostId(@Param("postId") Long postId);
/**
*
* @param comment
*/
void update(Comment comment);
/**
*
* @param id ID
*/
void delete(Long id);
/**
*
* @param id ID
*/
void incrementLikeCount(Long id);
/**
*
* @param id ID
*/
void decrementLikeCount(Long id);
}

@ -0,0 +1,69 @@
package com.unilife.mapper;
import com.unilife.model.entity.Course;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 访
*/
@Mapper
public interface CourseMapper {
/**
*
* @param course
*/
void insert(Course course);
/**
* ID
* @param id ID
* @return
*/
Course getById(Long id);
/**
*
* @param userId ID
* @return
*/
List<Course> getListByUserId(Long userId);
/**
*
* @param course
*/
void update(Course course);
/**
*
* @param id ID
* @param userId ID
*/
void delete(@Param("id") Long id, @Param("userId") Long userId);
/**
*
* @param userId ID
* @param dayOfWeek 1-7
* @return
*/
List<Course> getListByUserIdAndDayOfWeek(@Param("userId") Long userId, @Param("dayOfWeek") Byte dayOfWeek);
/**
*
* @param userId ID
* @param dayOfWeek 1-7
* @param startTime
* @param endTime
* @param excludeCourseId ID
* @return
*/
Integer checkConflict(@Param("userId") Long userId,
@Param("dayOfWeek") Byte dayOfWeek,
@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("excludeCourseId") Long excludeCourseId);
}

@ -0,0 +1,46 @@
package com.unilife.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 访
*/
@Mapper
public interface PostLikeMapper {
/**
*
* @param postId ID
* @param userId ID
* @return
*/
Boolean isLiked(@Param("postId") Long postId, @Param("userId") Long userId);
/**
*
* @param postId ID
* @param userId ID
*/
void insert(@Param("postId") Long postId, @Param("userId") Long userId);
/**
*
* @param postId ID
* @param userId ID
*/
void delete(@Param("postId") Long postId, @Param("userId") Long userId);
/**
*
* @param postId ID
* @return
*/
Integer getCountByPostId(@Param("postId") Long postId);
/**
* ID
* @param userId ID
* @return ID
*/
java.util.List<Long> getLikedPostIdsByUserId(@Param("userId") Long userId);
}

@ -0,0 +1,92 @@
package com.unilife.mapper;
import com.unilife.model.entity.Resource;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 访
*/
@Mapper
public interface ResourceMapper {
/**
*
* @param resource
*/
void insert(Resource resource);
/**
* ID
* @param id ID
* @return
*/
Resource getById(Long id);
/**
*
* @param categoryId IDnull
* @param userId IDnull
* @param keyword null
* @return
*/
List<Resource> getList(@Param("categoryId") Long categoryId,
@Param("userId") Long userId,
@Param("keyword") String keyword);
/**
*
* @param categoryId IDnull
* @param userId IDnull
* @param keyword null
* @return
*/
Integer getCount(@Param("categoryId") Long categoryId,
@Param("userId") Long userId,
@Param("keyword") String keyword);
/**
*
* @param resource
*/
void update(Resource resource);
/**
*
* @param id ID
*/
void delete(Long id);
/**
*
* @param id ID
*/
void incrementDownloadCount(Long id);
/**
*
* @param id ID
*/
void incrementLikeCount(Long id);
/**
*
* @param id ID
*/
void decrementLikeCount(Long id);
/**
*
* @param userId ID
* @return
*/
Integer getCountByUserId(Long userId);
/**
*
* @param categoryId ID
* @return
*/
Integer getCountByCategoryId(Long categoryId);
}

@ -0,0 +1,83 @@
package com.unilife.mapper;
import com.unilife.model.entity.Schedule;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
/**
* 访
*/
@Mapper
public interface ScheduleMapper {
/**
*
* @param schedule
*/
void insert(Schedule schedule);
/**
* ID
* @param id ID
* @return
*/
Schedule getById(Long id);
/**
*
* @param userId ID
* @return
*/
List<Schedule> getListByUserId(Long userId);
/**
*
* @param userId ID
* @param startTime
* @param endTime
* @return
*/
List<Schedule> getListByUserIdAndTimeRange(
@Param("userId") Long userId,
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime);
/**
*
* @param schedule
*/
void update(Schedule schedule);
/**
*
* @param id ID
* @param userId ID
*/
void delete(@Param("id") Long id, @Param("userId") Long userId);
/**
*
* @param userId ID
* @param startTime
* @param endTime
* @param excludeScheduleId ID
* @return
*/
Integer checkConflict(
@Param("userId") Long userId,
@Param("startTime") LocalDateTime startTime,
@Param("endTime") LocalDateTime endTime,
@Param("excludeScheduleId") Long excludeScheduleId);
/**
*
* @param currentTime
* @param reminderMinutes
* @return
*/
List<Schedule> getSchedulesToRemind(
@Param("currentTime") LocalDateTime currentTime,
@Param("reminderMinutes") Integer reminderMinutes);
}

@ -0,0 +1,29 @@
package com.unilife.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateCommentDTO {
/**
* ID
*/
private Long postId;
/**
*
*/
private String content;
/**
* ID
* null
*/
private Long parentId;
}

@ -0,0 +1,60 @@
package com.unilife.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalTime;
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateCourseDTO {
/**
*
*/
private String name;
/**
*
*/
private String teacher;
/**
*
*/
private String location;
/**
* 1-7
*/
private Byte dayOfWeek;
/**
*
*/
private LocalTime startTime;
/**
*
*/
private LocalTime endTime;
/**
*
*/
private Byte startWeek;
/**
*
*/
private Byte endWeek;
/**
*
*/
private String color;
}

@ -0,0 +1,34 @@
package com.unilife.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateResourceDTO {
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
* ID
*/
private Long categoryId;
/**
*
*
*/
private String fileType;
}

@ -0,0 +1,55 @@
package com.unilife.model.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
*
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CreateScheduleDTO {
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
*
*/
private LocalDateTime startTime;
/**
*
*/
private LocalDateTime endTime;
/**
*
*/
private String location;
/**
* 0-, 1-
*/
private Byte isAllDay;
/**
*
*/
private Byte reminder;
/**
*
*/
private String color;
}

@ -0,0 +1,92 @@
package com.unilife.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Course implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long userId;
/**
*
*/
private String name;
/**
*
*/
private String teacher;
/**
*
*/
private String location;
/**
* 1-7
*/
private Byte dayOfWeek;
/**
*
*/
private LocalTime startTime;
/**
*
*/
private LocalTime endTime;
/**
*
*/
private Byte startWeek;
/**
*
*/
private Byte endWeek;
/**
*
*/
private String color;
/**
* 0-, 1-
*/
private Byte status = 1;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,86 @@
package com.unilife.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Resource implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long userId;
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
* URL
*/
private String fileUrl;
/**
*
*/
private Long fileSize;
/**
*
*/
private String fileType;
/**
* ID
*/
private Long categoryId;
/**
*
*/
private Integer downloadCount = 0;
/**
*
*/
private Integer likeCount = 0;
/**
* 0-, 1-
*/
private Byte status = 1;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,86 @@
package com.unilife.model.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Schedule implements Serializable {
private static final long serialVersionUID = 1L;
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long userId;
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
*
*/
private LocalDateTime startTime;
/**
*
*/
private LocalDateTime endTime;
/**
*
*/
private String location;
/**
* 0-, 1-
*/
private Byte isAllDay = 0;
/**
*
*/
private Byte reminder;
/**
*
*/
private String color;
/**
* 0-, 1-
*/
private Byte status = 1;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,73 @@
package com.unilife.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.util.List;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CommentVO {
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long postId;
/**
* ID
*/
private Long userId;
/**
*
*/
private String nickname;
/**
*
*/
private String avatar;
/**
*
*/
private String content;
/**
* ID
*/
private Long parentId;
/**
*
*/
private Integer likeCount;
/**
*
*/
private Boolean isLiked;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private List<CommentVO> replies;
}

@ -0,0 +1,88 @@
package com.unilife.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class CourseVO {
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long userId;
/**
*
*/
private String name;
/**
*
*/
private String teacher;
/**
*
*/
private String location;
/**
* 1-7
*/
private Byte dayOfWeek;
/**
*
*/
private LocalTime startTime;
/**
*
*/
private LocalTime endTime;
/**
*
*/
private Byte startWeek;
/**
*
*/
private Byte endWeek;
/**
*
*/
private String color;
/**
* 0-, 1-
*/
private Byte status;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,97 @@
package com.unilife.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ResourceVO {
/**
* ID
*/
private Long id;
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
* URL
*/
private String fileUrl;
/**
*
*/
private Long fileSize;
/**
*
*/
private String fileType;
/**
* ID
*/
private Long userId;
/**
*
*/
private String nickname;
/**
*
*/
private String avatar;
/**
* ID
*/
private Long categoryId;
/**
*
*/
private String categoryName;
/**
*
*/
private Integer downloadCount;
/**
*
*/
private Integer likeCount;
/**
*
*/
private Boolean isLiked;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,82 @@
package com.unilife.model.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
*
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ScheduleVO {
/**
* ID
*/
private Long id;
/**
* ID
*/
private Long userId;
/**
*
*/
private String title;
/**
*
*/
private String description;
/**
*
*/
private LocalDateTime startTime;
/**
*
*/
private LocalDateTime endTime;
/**
*
*/
private String location;
/**
* 0-, 1-
*/
private Byte isAllDay;
/**
*
*/
private Byte reminder;
/**
*
*/
private String color;
/**
* 0-, 1-
*/
private Byte status;
/**
*
*/
private LocalDateTime createdAt;
/**
*
*/
private LocalDateTime updatedAt;
}

@ -0,0 +1,45 @@
package com.unilife.service;
import com.unilife.common.result.Result;
import com.unilife.model.entity.Category;
/**
*
*/
public interface CategoryService {
/**
*
* @param categoryId ID
* @return
*/
Result getCategoryDetail(Long categoryId);
/**
*
* @param status null
* @return
*/
Result getCategoryList(Byte status);
/**
*
* @param category
* @return
*/
Result createCategory(Category category);
/**
*
* @param categoryId ID
* @param category
* @return
*/
Result updateCategory(Long categoryId, Category category);
/**
*
* @param categoryId ID
* @return
*/
Result deleteCategory(Long categoryId);
}

@ -0,0 +1,41 @@
package com.unilife.service;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateCommentDTO;
/**
*
*/
public interface CommentService {
/**
*
* @param userId ID
* @param createCommentDTO DTO
* @return
*/
Result createComment(Long userId, CreateCommentDTO createCommentDTO);
/**
*
* @param postId ID
* @param userId IDnull
* @return
*/
Result getCommentsByPostId(Long postId, Long userId);
/**
*
* @param commentId ID
* @param userId ID
* @return
*/
Result deleteComment(Long commentId, Long userId);
/**
* /
* @param commentId ID
* @param userId ID
* @return
*/
Result likeComment(Long commentId, Long userId);
}

@ -0,0 +1,68 @@
package com.unilife.service;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateCourseDTO;
/**
*
*/
public interface CourseService {
/**
*
* @param userId ID
* @param createCourseDTO DTO
* @return
*/
Result createCourse(Long userId, CreateCourseDTO createCourseDTO);
/**
*
* @param courseId ID
* @param userId ID
* @return
*/
Result getCourseDetail(Long courseId, Long userId);
/**
*
* @param userId ID
* @return
*/
Result getCourseList(Long userId);
/**
*
* @param userId ID
* @param dayOfWeek 1-7
* @return
*/
Result getCourseListByDayOfWeek(Long userId, Byte dayOfWeek);
/**
*
* @param courseId ID
* @param userId ID
* @param createCourseDTO DTO
* @return
*/
Result updateCourse(Long courseId, Long userId, CreateCourseDTO createCourseDTO);
/**
*
* @param courseId ID
* @param userId ID
* @return
*/
Result deleteCourse(Long courseId, Long userId);
/**
*
* @param userId ID
* @param dayOfWeek 1-7
* @param startTime
* @param endTime
* @param excludeCourseId ID
* @return
*/
Result checkCourseConflict(Long userId, Byte dayOfWeek, String startTime, String endTime, Long excludeCourseId);
}

@ -0,0 +1,80 @@
package com.unilife.service;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateResourceDTO;
import org.springframework.web.multipart.MultipartFile;
/**
*
*/
public interface ResourceService {
/**
*
* @param userId ID
* @param createResourceDTO DTO
* @param file
* @return
*/
Result uploadResource(Long userId, CreateResourceDTO createResourceDTO, MultipartFile file);
/**
*
* @param resourceId ID
* @param userId IDnull
* @return
*/
Result getResourceDetail(Long resourceId, Long userId);
/**
*
* @param categoryId IDnull
* @param userId IDnull
* @param keyword null
* @param page
* @param size
* @return
*/
Result getResourceList(Long categoryId, Long userId, String keyword, Integer page, Integer size);
/**
*
* @param resourceId ID
* @param userId ID
* @param createResourceDTO DTO
* @return
*/
Result updateResource(Long resourceId, Long userId, CreateResourceDTO createResourceDTO);
/**
*
* @param resourceId ID
* @param userId ID
* @return
*/
Result deleteResource(Long resourceId, Long userId);
/**
*
* @param resourceId ID
* @param userId IDnull
* @return
*/
Result downloadResource(Long resourceId, Long userId);
/**
* /
* @param resourceId ID
* @param userId ID
* @return
*/
Result likeResource(Long resourceId, Long userId);
/**
*
* @param userId ID
* @param page
* @param size
* @return
*/
Result getUserResources(Long userId, Integer page, Integer size);
}

@ -0,0 +1,77 @@
package com.unilife.service;
import com.unilife.common.result.Result;
import com.unilife.model.dto.CreateScheduleDTO;
import java.time.LocalDateTime;
/**
*
*/
public interface ScheduleService {
/**
*
* @param userId ID
* @param createScheduleDTO DTO
* @return
*/
Result createSchedule(Long userId, CreateScheduleDTO createScheduleDTO);
/**
*
* @param scheduleId ID
* @param userId ID
* @return
*/
Result getScheduleDetail(Long scheduleId, Long userId);
/**
*
* @param userId ID
* @return
*/
Result getScheduleList(Long userId);
/**
*
* @param userId ID
* @param startTime
* @param endTime
* @return
*/
Result getScheduleListByTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime);
/**
*
* @param scheduleId ID
* @param userId ID
* @param createScheduleDTO DTO
* @return
*/
Result updateSchedule(Long scheduleId, Long userId, CreateScheduleDTO createScheduleDTO);
/**
*
* @param scheduleId ID
* @param userId ID
* @return
*/
Result deleteSchedule(Long scheduleId, Long userId);
/**
*
* @param userId ID
* @param startTime
* @param endTime
* @param excludeScheduleId ID
* @return
*/
Result checkScheduleConflict(Long userId, LocalDateTime startTime, LocalDateTime endTime, Long excludeScheduleId);
/**
*
*
* @return
*/
Result processScheduleReminders();
}

@ -0,0 +1,96 @@
package com.unilife.service.impl;
import com.unilife.common.result.Result;
import com.unilife.mapper.CategoryMapper;
import com.unilife.model.entity.Category;
import com.unilife.service.CategoryService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class CategoryServiceImpl implements CategoryService {
@Autowired
private CategoryMapper categoryMapper;
@Override
public Result<?> getCategoryDetail(Long categoryId) {
// 获取分类
Category category = categoryMapper.getById(categoryId);
if (category == null) {
return Result.error(404, "分类不存在");
}
return Result.success(category);
}
@Override
public Result<?> getCategoryList(Byte status) {
// 获取分类列表
List<Category> categories = categoryMapper.getList(status);
// 获取分类总数
Integer count = categoryMapper.getCount(status);
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", count);
data.put("list", categories);
return Result.success(data);
}
@Override
public Result<?> createCategory(Category category) {
// 设置默认值
if (category.getSort() == null) {
category.setSort(0);
}
if (category.getStatus() == null) {
category.setStatus((byte) 1);
}
// 保存分类
categoryMapper.insert(category);
Map<String, Object> data = new HashMap<>();
data.put("categoryId", category.getId());
return Result.success(data, "创建成功");
}
@Override
public Result updateCategory(Long categoryId, Category category) {
// 获取分类
Category existingCategory = categoryMapper.getById(categoryId);
if (existingCategory == null) {
return Result.error(404, "分类不存在");
}
// 更新分类
category.setId(categoryId);
categoryMapper.update(category);
return Result.success(null, "更新成功");
}
@Override
public Result deleteCategory(Long categoryId) {
// 获取分类
Category category = categoryMapper.getById(categoryId);
if (category == null) {
return Result.error(404, "分类不存在");
}
// 删除分类(逻辑删除)
categoryMapper.delete(categoryId);
return Result.success(null, "删除成功");
}
}

@ -0,0 +1,189 @@
package com.unilife.service.impl;
import com.unilife.common.result.Result;
import com.unilife.mapper.CommentMapper;
import com.unilife.mapper.PostMapper;
import com.unilife.mapper.UserMapper;
import com.unilife.model.dto.CreateCommentDTO;
import com.unilife.model.entity.Comment;
import com.unilife.model.entity.Post;
import com.unilife.model.entity.User;
import com.unilife.model.vo.CommentVO;
import com.unilife.service.CommentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class CommentServiceImpl implements CommentService {
@Autowired
private CommentMapper commentMapper;
@Autowired
private PostMapper postMapper;
@Autowired
private UserMapper userMapper;
@Override
@Transactional
public Result createComment(Long userId, CreateCommentDTO createCommentDTO) {
// 检查用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 检查帖子是否存在
Post post = postMapper.getById(createCommentDTO.getPostId());
if (post == null) {
return Result.error(404, "帖子不存在");
}
// 如果是回复评论,检查父评论是否存在
if (createCommentDTO.getParentId() != null) {
Comment parentComment = commentMapper.getById(createCommentDTO.getParentId());
if (parentComment == null) {
return Result.error(404, "父评论不存在");
}
}
// 创建评论
Comment comment = new Comment();
comment.setPostId(createCommentDTO.getPostId());
comment.setUserId(userId);
comment.setContent(createCommentDTO.getContent());
comment.setParentId(createCommentDTO.getParentId());
comment.setLikeCount(0);
comment.setStatus((byte) 1);
// 保存评论
commentMapper.insert(comment);
// 增加帖子评论数
postMapper.incrementCommentCount(createCommentDTO.getPostId());
Map<String, Object> data = new HashMap<>();
data.put("commentId", comment.getId());
return Result.success(data, "评论成功");
}
@Override
public Result getCommentsByPostId(Long postId, Long userId) {
// 检查帖子是否存在
Post post = postMapper.getById(postId);
if (post == null) {
return Result.error(404, "帖子不存在");
}
// 获取一级评论
List<Comment> topLevelComments = commentMapper.getTopLevelCommentsByPostId(postId);
// 转换为VO
List<CommentVO> commentVOs = topLevelComments.stream().map(comment -> {
// 获取评论用户信息
User user = userMapper.getUserById(comment.getUserId());
// 获取回复列表
List<Comment> replies = commentMapper.getRepliesByParentId(comment.getId());
List<CommentVO> replyVOs = replies.stream().map(reply -> {
User replyUser = userMapper.getUserById(reply.getUserId());
return CommentVO.builder()
.id(reply.getId())
.postId(reply.getPostId())
.userId(reply.getUserId())
.nickname(replyUser != null ? replyUser.getNickname() : "未知用户")
.avatar(replyUser != null ? replyUser.getAvatar() : null)
.content(reply.getContent())
.parentId(reply.getParentId())
.likeCount(reply.getLikeCount())
.isLiked(false) // 实际开发中应该查询用户是否点赞
.createdAt(reply.getCreatedAt())
.replies(new ArrayList<>())
.build();
}).collect(Collectors.toList());
return CommentVO.builder()
.id(comment.getId())
.postId(comment.getPostId())
.userId(comment.getUserId())
.nickname(user != null ? user.getNickname() : "未知用户")
.avatar(user != null ? user.getAvatar() : null)
.content(comment.getContent())
.parentId(comment.getParentId())
.likeCount(comment.getLikeCount())
.isLiked(false) // 实际开发中应该查询用户是否点赞
.createdAt(comment.getCreatedAt())
.replies(replyVOs)
.build();
}).collect(Collectors.toList());
// 获取评论总数
Integer count = commentMapper.getCountByPostId(postId);
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", count);
data.put("list", commentVOs);
return Result.success(data);
}
@Override
@Transactional
public Result deleteComment(Long commentId, Long userId) {
// 获取评论
Comment comment = commentMapper.getById(commentId);
if (comment == null) {
return Result.error(404, "评论不存在");
}
// 检查是否有权限删除
if (!comment.getUserId().equals(userId)) {
return Result.error(403, "无权限删除此评论");
}
// 删除评论(逻辑删除)
commentMapper.delete(commentId);
// 减少帖子评论数
postMapper.decrementCommentCount(comment.getPostId());
return Result.success(null, "删除成功");
}
@Override
public Result likeComment(Long commentId, Long userId) {
// 获取评论
Comment comment = commentMapper.getById(commentId);
if (comment == null) {
return Result.error(404, "评论不存在");
}
// 检查用户是否已点赞
// 注意这里需要创建一个评论点赞表和相应的Mapper实际开发中需要先创建
boolean isLiked = false; // commentLikeMapper.isLiked(commentId, userId);
if (isLiked) {
// 取消点赞
// commentLikeMapper.delete(commentId, userId);
commentMapper.decrementLikeCount(commentId);
return Result.success(null, "取消点赞成功");
} else {
// 添加点赞
// commentLikeMapper.insert(commentId, userId);
commentMapper.incrementLikeCount(commentId);
return Result.success(null, "点赞成功");
}
}
}

@ -0,0 +1,192 @@
package com.unilife.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.unilife.common.result.Result;
import com.unilife.mapper.CourseMapper;
import com.unilife.mapper.UserMapper;
import com.unilife.model.dto.CreateCourseDTO;
import com.unilife.model.entity.Course;
import com.unilife.model.entity.User;
import com.unilife.model.vo.CourseVO;
import com.unilife.service.CourseService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class CourseServiceImpl implements CourseService {
@Autowired
private CourseMapper courseMapper;
@Autowired
private UserMapper userMapper;
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
@Override
@Transactional
public Result createCourse(Long userId, CreateCourseDTO createCourseDTO) {
// 检查用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 检查课程时间冲突
String startTimeStr = createCourseDTO.getStartTime().format(TIME_FORMATTER);
String endTimeStr = createCourseDTO.getEndTime().format(TIME_FORMATTER);
Integer conflictCount = courseMapper.checkConflict(userId, createCourseDTO.getDayOfWeek(),
startTimeStr, endTimeStr, null);
if (conflictCount > 0) {
return Result.error(400, "课程时间冲突,该时间段已有其他课程");
}
// 创建课程
Course course = new Course();
BeanUtil.copyProperties(createCourseDTO, course);
course.setUserId(userId);
course.setStatus((byte) 1);
// 保存课程
courseMapper.insert(course);
Map<String, Object> data = new HashMap<>();
data.put("courseId", course.getId());
return Result.success(data, "创建课程成功");
}
@Override
public Result getCourseDetail(Long courseId, Long userId) {
// 获取课程
Course course = courseMapper.getById(courseId);
if (course == null) {
return Result.error(404, "课程不存在");
}
// 检查权限(只能查看自己的课程)
if (!course.getUserId().equals(userId)) {
return Result.error(403, "无权限查看此课程");
}
// 转换为VO
CourseVO courseVO = new CourseVO();
BeanUtil.copyProperties(course, courseVO);
return Result.success(courseVO);
}
@Override
public Result getCourseList(Long userId) {
// 获取用户的所有课程
List<Course> courses = courseMapper.getListByUserId(userId);
// 转换为VO
List<CourseVO> courseVOs = courses.stream().map(course -> {
CourseVO courseVO = new CourseVO();
BeanUtil.copyProperties(course, courseVO);
return courseVO;
}).collect(Collectors.toList());
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", courseVOs.size());
data.put("list", courseVOs);
return Result.success(data);
}
@Override
public Result getCourseListByDayOfWeek(Long userId, Byte dayOfWeek) {
// 获取用户在指定星期几的课程
List<Course> courses = courseMapper.getListByUserIdAndDayOfWeek(userId, dayOfWeek);
// 转换为VO
List<CourseVO> courseVOs = courses.stream().map(course -> {
CourseVO courseVO = new CourseVO();
BeanUtil.copyProperties(course, courseVO);
return courseVO;
}).collect(Collectors.toList());
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", courseVOs.size());
data.put("list", courseVOs);
return Result.success(data);
}
@Override
@Transactional
public Result updateCourse(Long courseId, Long userId, CreateCourseDTO createCourseDTO) {
// 获取课程
Course course = courseMapper.getById(courseId);
if (course == null) {
return Result.error(404, "课程不存在");
}
// 检查权限(只能更新自己的课程)
if (!course.getUserId().equals(userId)) {
return Result.error(403, "无权限更新此课程");
}
// 检查课程时间冲突
String startTimeStr = createCourseDTO.getStartTime().format(TIME_FORMATTER);
String endTimeStr = createCourseDTO.getEndTime().format(TIME_FORMATTER);
Integer conflictCount = courseMapper.checkConflict(userId, createCourseDTO.getDayOfWeek(),
startTimeStr, endTimeStr, courseId);
if (conflictCount > 0) {
return Result.error(400, "课程时间冲突,该时间段已有其他课程");
}
// 更新课程
BeanUtil.copyProperties(createCourseDTO, course);
// 保存更新
courseMapper.update(course);
return Result.success(null, "更新课程成功");
}
@Override
@Transactional
public Result deleteCourse(Long courseId, Long userId) {
// 获取课程
Course course = courseMapper.getById(courseId);
if (course == null) {
return Result.error(404, "课程不存在");
}
// 检查权限(只能删除自己的课程)
if (!course.getUserId().equals(userId)) {
return Result.error(403, "无权限删除此课程");
}
// 删除课程(逻辑删除)
courseMapper.delete(courseId, userId);
return Result.success(null, "删除课程成功");
}
@Override
public Result checkCourseConflict(Long userId, Byte dayOfWeek, String startTime, String endTime, Long excludeCourseId) {
// 检查课程时间冲突
Integer conflictCount = courseMapper.checkConflict(userId, dayOfWeek, startTime, endTime, excludeCourseId);
Map<String, Object> data = new HashMap<>();
data.put("hasConflict", conflictCount > 0);
data.put("conflictCount", conflictCount);
return Result.success(data);
}
}

@ -5,12 +5,12 @@ import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.unilife.common.result.Result;
// import com.unilife.mapper.CategoryMapper;
import com.unilife.mapper.CategoryMapper;
import com.unilife.mapper.PostLikeMapper;
import com.unilife.mapper.PostMapper;
import com.unilife.mapper.UserMapper;
import com.unilife.model.dto.CreatePostDTO;
import com.unilife.model.dto.UpdatePostDTO;
// import com.unilife.model.entity.Category;
import com.unilife.model.entity.Post;
import com.unilife.model.entity.User;
import com.unilife.model.vo.PostListVO;
@ -20,7 +20,6 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -36,8 +35,11 @@ public class PostServiceImpl implements PostService {
@Autowired
private UserMapper userMapper;
// @Autowired
// private CategoryMapper categoryMapper;
@Autowired
private CategoryMapper categoryMapper;
@Autowired
private PostLikeMapper postLikeMapper;
@Override
public Result createPost(Long userId, CreatePostDTO createPostDTO) {
@ -216,17 +218,16 @@ public class PostServiceImpl implements PostService {
}
// 检查用户是否已点赞
// 注意这里需要创建一个点赞表和相应的Mapper实际开发中需要先创建
boolean isLiked = false; // postLikeMapper.isLiked(postId, userId);
Boolean isLiked = postLikeMapper.isLiked(postId, userId);
if (isLiked) {
if (Boolean.TRUE.equals(isLiked)) {
// 取消点赞
// postLikeMapper.delete(postId, userId);
postLikeMapper.delete(postId, userId);
postMapper.decrementLikeCount(postId);
return Result.success(null, "取消点赞成功");
} else {
// 添加点赞
// postLikeMapper.insert(postId, userId);
postLikeMapper.insert(postId, userId);
postMapper.incrementLikeCount(postId);
return Result.success(null, "点赞成功");
}

@ -0,0 +1,339 @@
package com.unilife.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.unilife.common.result.Result;
import com.unilife.mapper.CategoryMapper;
import com.unilife.mapper.ResourceMapper;
import com.unilife.mapper.UserMapper;
import com.unilife.model.dto.CreateResourceDTO;
import com.unilife.model.entity.Category;
import com.unilife.model.entity.Resource;
import com.unilife.model.entity.User;
import com.unilife.model.vo.ResourceVO;
import com.unilife.service.ResourceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ResourceServiceImpl implements ResourceService {
@Autowired
private ResourceMapper resourceMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private CategoryMapper categoryMapper;
// 文件存储路径实际项目中应该配置在application.yml中
private static final String UPLOAD_DIR = "uploads/resources/";
@Override
@Transactional
public Result uploadResource(Long userId, CreateResourceDTO createResourceDTO, MultipartFile file) {
// 检查用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 检查分类是否存在
Category category = categoryMapper.getById(createResourceDTO.getCategoryId());
if (category == null) {
return Result.error(404, "分类不存在");
}
// 检查文件是否为空
if (file.isEmpty()) {
return Result.error(400, "上传文件不能为空");
}
try {
// 创建上传目录(如果不存在)
File uploadDir = new File(UPLOAD_DIR);
if (!uploadDir.exists()) {
uploadDir.mkdirs();
}
// 生成唯一文件名
String originalFilename = file.getOriginalFilename();
String fileExtension = originalFilename != null ? originalFilename.substring(originalFilename.lastIndexOf(".")) : "";
String newFilename = UUID.randomUUID().toString() + fileExtension;
String filePath = UPLOAD_DIR + newFilename;
// 保存文件
Path path = Paths.get(filePath);
Files.write(path, file.getBytes());
// 创建资源记录
Resource resource = new Resource();
resource.setUserId(userId);
resource.setTitle(createResourceDTO.getTitle());
resource.setDescription(createResourceDTO.getDescription());
resource.setFileUrl(filePath);
resource.setFileSize(file.getSize());
resource.setFileType(file.getContentType());
resource.setCategoryId(createResourceDTO.getCategoryId());
resource.setDownloadCount(0);
resource.setLikeCount(0);
resource.setStatus((byte) 1);
// 保存资源记录
resourceMapper.insert(resource);
Map<String, Object> data = new HashMap<>();
data.put("resourceId", resource.getId());
return Result.success(data, "资源上传成功");
} catch (IOException e) {
log.error("文件上传失败", e);
return Result.error(500, "文件上传失败");
}
}
@Override
public Result getResourceDetail(Long resourceId, Long userId) {
// 获取资源
Resource resource = resourceMapper.getById(resourceId);
if (resource == null) {
return Result.error(404, "资源不存在");
}
// 获取上传用户信息
User user = userMapper.getUserById(resource.getUserId());
// 获取分类信息
Category category = categoryMapper.getById(resource.getCategoryId());
// 构建返回数据
ResourceVO resourceVO = ResourceVO.builder()
.id(resource.getId())
.title(resource.getTitle())
.description(resource.getDescription())
.fileUrl(resource.getFileUrl())
.fileSize(resource.getFileSize())
.fileType(resource.getFileType())
.userId(resource.getUserId())
.nickname(user != null ? user.getNickname() : "未知用户")
.avatar(user != null ? user.getAvatar() : null)
.categoryId(resource.getCategoryId())
.categoryName(category != null ? category.getName() : "未知分类")
.downloadCount(resource.getDownloadCount())
.likeCount(resource.getLikeCount())
.isLiked(false) // 实际项目中应该查询用户是否点赞
.createdAt(resource.getCreatedAt())
.updatedAt(resource.getUpdatedAt())
.build();
return Result.success(resourceVO);
}
@Override
public Result getResourceList(Long categoryId, Long userId, String keyword, Integer page, Integer size) {
// 参数校验
if (page == null || page < 1) page = 1;
if (size == null || size < 1 || size > 50) size = 10;
// 分页查询
PageHelper.startPage(page, size);
List<Resource> resources = resourceMapper.getList(categoryId, userId, keyword);
PageInfo<Resource> pageInfo = new PageInfo<>(resources);
// 转换为VO
List<ResourceVO> resourceVOs = new ArrayList<>();
for (Resource resource : resources) {
User user = userMapper.getUserById(resource.getUserId());
Category category = categoryMapper.getById(resource.getCategoryId());
ResourceVO resourceVO = ResourceVO.builder()
.id(resource.getId())
.title(resource.getTitle())
.description(resource.getDescription())
.fileUrl(resource.getFileUrl())
.fileSize(resource.getFileSize())
.fileType(resource.getFileType())
.userId(resource.getUserId())
.nickname(user != null ? user.getNickname() : "未知用户")
.avatar(user != null ? user.getAvatar() : null)
.categoryId(resource.getCategoryId())
.categoryName(category != null ? category.getName() : "未知分类")
.downloadCount(resource.getDownloadCount())
.likeCount(resource.getLikeCount())
.isLiked(false) // 实际项目中应该查询用户是否点赞
.createdAt(resource.getCreatedAt())
.updatedAt(resource.getUpdatedAt())
.build();
resourceVOs.add(resourceVO);
}
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", pageInfo.getTotal());
data.put("list", resourceVOs);
data.put("pages", pageInfo.getPages());
return Result.success(data);
}
@Override
@Transactional
public Result updateResource(Long resourceId, Long userId, CreateResourceDTO createResourceDTO) {
// 获取资源
Resource resource = resourceMapper.getById(resourceId);
if (resource == null) {
return Result.error(404, "资源不存在");
}
// 检查是否有权限更新
if (!resource.getUserId().equals(userId)) {
return Result.error(403, "无权限更新此资源");
}
// 检查分类是否存在
Category category = categoryMapper.getById(createResourceDTO.getCategoryId());
if (category == null) {
return Result.error(404, "分类不存在");
}
// 更新资源
resource.setTitle(createResourceDTO.getTitle());
resource.setDescription(createResourceDTO.getDescription());
resource.setCategoryId(createResourceDTO.getCategoryId());
// 保存更新
resourceMapper.update(resource);
return Result.success(null, "更新成功");
}
@Override
@Transactional
public Result deleteResource(Long resourceId, Long userId) {
// 获取资源
Resource resource = resourceMapper.getById(resourceId);
if (resource == null) {
return Result.error(404, "资源不存在");
}
// 检查是否有权限删除
if (!resource.getUserId().equals(userId)) {
return Result.error(403, "无权限删除此资源");
}
// 删除资源(逻辑删除)
resourceMapper.delete(resourceId);
return Result.success(null, "删除成功");
}
@Override
@Transactional
public Result downloadResource(Long resourceId, Long userId) {
// 获取资源
Resource resource = resourceMapper.getById(resourceId);
if (resource == null) {
return Result.error(404, "资源不存在");
}
// 增加下载次数
resourceMapper.incrementDownloadCount(resourceId);
// 返回文件URL
Map<String, Object> data = new HashMap<>();
data.put("fileUrl", resource.getFileUrl());
data.put("fileName", resource.getTitle());
data.put("fileType", resource.getFileType());
return Result.success(data, "获取下载链接成功");
}
@Override
@Transactional
public Result likeResource(Long resourceId, Long userId) {
// 获取资源
Resource resource = resourceMapper.getById(resourceId);
if (resource == null) {
return Result.error(404, "资源不存在");
}
// 检查用户是否已点赞
// 注意这里需要创建一个资源点赞表和相应的Mapper实际开发中需要先创建
boolean isLiked = false; // resourceLikeMapper.isLiked(resourceId, userId);
if (isLiked) {
// 取消点赞
// resourceLikeMapper.delete(resourceId, userId);
resourceMapper.decrementLikeCount(resourceId);
return Result.success(null, "取消点赞成功");
} else {
// 添加点赞
// resourceLikeMapper.insert(resourceId, userId);
resourceMapper.incrementLikeCount(resourceId);
return Result.success(null, "点赞成功");
}
}
@Override
public Result getUserResources(Long userId, Integer page, Integer size) {
// 参数校验
if (page == null || page < 1) page = 1;
if (size == null || size < 1 || size > 50) size = 10;
// 分页查询
PageHelper.startPage(page, size);
List<Resource> resources = resourceMapper.getList(null, userId, null);
PageInfo<Resource> pageInfo = new PageInfo<>(resources);
// 转换为VO
List<ResourceVO> resourceVOs = resources.stream().map(resource -> {
User user = userMapper.getUserById(resource.getUserId());
Category category = categoryMapper.getById(resource.getCategoryId());
return ResourceVO.builder()
.id(resource.getId())
.title(resource.getTitle())
.description(resource.getDescription())
.fileUrl(resource.getFileUrl())
.fileSize(resource.getFileSize())
.fileType(resource.getFileType())
.userId(resource.getUserId())
.nickname(user != null ? user.getNickname() : "未知用户")
.avatar(user != null ? user.getAvatar() : null)
.categoryId(resource.getCategoryId())
.categoryName(category != null ? category.getName() : "未知分类")
.downloadCount(resource.getDownloadCount())
.likeCount(resource.getLikeCount())
.isLiked(false) // 实际项目中应该查询用户是否点赞
.createdAt(resource.getCreatedAt())
.updatedAt(resource.getUpdatedAt())
.build();
}).collect(Collectors.toList());
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", pageInfo.getTotal());
data.put("list", resourceVOs);
data.put("pages", pageInfo.getPages());
return Result.success(data);
}
}

@ -0,0 +1,262 @@
package com.unilife.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.unilife.common.result.Result;
import com.unilife.mapper.ScheduleMapper;
import com.unilife.mapper.UserMapper;
import com.unilife.model.dto.CreateScheduleDTO;
import com.unilife.model.entity.Schedule;
import com.unilife.model.entity.User;
import com.unilife.model.vo.ScheduleVO;
import com.unilife.service.ScheduleService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ScheduleServiceImpl implements ScheduleService {
@Autowired
private ScheduleMapper scheduleMapper;
@Autowired
private UserMapper userMapper;
@Autowired
private JavaMailSender mailSender;
@Override
@Transactional
public Result createSchedule(Long userId, CreateScheduleDTO createScheduleDTO) {
// 检查用户是否存在
User user = userMapper.getUserById(userId);
if (user == null) {
return Result.error(404, "用户不存在");
}
// 检查日程时间冲突
Integer conflictCount = scheduleMapper.checkConflict(userId,
createScheduleDTO.getStartTime(), createScheduleDTO.getEndTime(), null);
if (conflictCount > 0) {
return Result.error(400, "日程时间冲突,该时间段已有其他日程");
}
// 创建日程
Schedule schedule = new Schedule();
BeanUtil.copyProperties(createScheduleDTO, schedule);
schedule.setUserId(userId);
schedule.setStatus((byte) 1);
// 保存日程
scheduleMapper.insert(schedule);
Map<String, Object> data = new HashMap<>();
data.put("scheduleId", schedule.getId());
return Result.success(data, "创建日程成功");
}
@Override
public Result getScheduleDetail(Long scheduleId, Long userId) {
// 获取日程
Schedule schedule = scheduleMapper.getById(scheduleId);
if (schedule == null) {
return Result.error(404, "日程不存在");
}
// 检查权限(只能查看自己的日程)
if (!schedule.getUserId().equals(userId)) {
return Result.error(403, "无权限查看此日程");
}
// 转换为VO
ScheduleVO scheduleVO = new ScheduleVO();
BeanUtil.copyProperties(schedule, scheduleVO);
return Result.success(scheduleVO);
}
@Override
public Result getScheduleList(Long userId) {
// 获取用户的所有日程
List<Schedule> schedules = scheduleMapper.getListByUserId(userId);
// 转换为VO
List<ScheduleVO> scheduleVOs = schedules.stream().map(schedule -> {
ScheduleVO scheduleVO = new ScheduleVO();
BeanUtil.copyProperties(schedule, scheduleVO);
return scheduleVO;
}).collect(Collectors.toList());
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", scheduleVOs.size());
data.put("list", scheduleVOs);
return Result.success(data);
}
@Override
public Result getScheduleListByTimeRange(Long userId, LocalDateTime startTime, LocalDateTime endTime) {
// 获取用户在指定时间范围内的日程
List<Schedule> schedules = scheduleMapper.getListByUserIdAndTimeRange(userId, startTime, endTime);
// 转换为VO
List<ScheduleVO> scheduleVOs = schedules.stream().map(schedule -> {
ScheduleVO scheduleVO = new ScheduleVO();
BeanUtil.copyProperties(schedule, scheduleVO);
return scheduleVO;
}).collect(Collectors.toList());
// 返回结果
Map<String, Object> data = new HashMap<>();
data.put("total", scheduleVOs.size());
data.put("list", scheduleVOs);
return Result.success(data);
}
@Override
@Transactional
public Result updateSchedule(Long scheduleId, Long userId, CreateScheduleDTO createScheduleDTO) {
// 获取日程
Schedule schedule = scheduleMapper.getById(scheduleId);
if (schedule == null) {
return Result.error(404, "日程不存在");
}
// 检查权限(只能更新自己的日程)
if (!schedule.getUserId().equals(userId)) {
return Result.error(403, "无权限更新此日程");
}
// 检查日程时间冲突
Integer conflictCount = scheduleMapper.checkConflict(userId,
createScheduleDTO.getStartTime(), createScheduleDTO.getEndTime(), scheduleId);
if (conflictCount > 0) {
return Result.error(400, "日程时间冲突,该时间段已有其他日程");
}
// 更新日程
BeanUtil.copyProperties(createScheduleDTO, schedule);
// 保存更新
scheduleMapper.update(schedule);
return Result.success(null, "更新日程成功");
}
@Override
@Transactional
public Result deleteSchedule(Long scheduleId, Long userId) {
// 获取日程
Schedule schedule = scheduleMapper.getById(scheduleId);
if (schedule == null) {
return Result.error(404, "日程不存在");
}
// 检查权限(只能删除自己的日程)
if (!schedule.getUserId().equals(userId)) {
return Result.error(403, "无权限删除此日程");
}
// 删除日程(逻辑删除)
scheduleMapper.delete(scheduleId, userId);
return Result.success(null, "删除日程成功");
}
@Override
public Result checkScheduleConflict(Long userId, LocalDateTime startTime, LocalDateTime endTime, Long excludeScheduleId) {
// 检查日程时间冲突
Integer conflictCount = scheduleMapper.checkConflict(userId, startTime, endTime, excludeScheduleId);
Map<String, Object> data = new HashMap<>();
data.put("hasConflict", conflictCount > 0);
data.put("conflictCount", conflictCount);
return Result.success(data);
}
@Override
@Transactional
public Result processScheduleReminders() {
// 获取当前时间
LocalDateTime now = LocalDateTime.now();
// 获取需要提醒的日程提醒时间在当前时间前后5分钟内
List<Schedule> schedulesToRemind = scheduleMapper.getSchedulesToRemind(now, 5);
// 发送提醒邮件
int successCount = 0;
for (Schedule schedule : schedulesToRemind) {
User user = userMapper.getUserById(schedule.getUserId());
if (user != null && user.getEmail() != null) {
boolean sent = sendReminderEmail(user, schedule);
if (sent) {
successCount++;
}
}
}
Map<String, Object> data = new HashMap<>();
data.put("total", schedulesToRemind.size());
data.put("success", successCount);
return Result.success(data, "处理日程提醒完成");
}
/**
*
* @param user
* @param schedule
* @return
*/
private boolean sendReminderEmail(User user, Schedule schedule) {
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setTo(user.getEmail());
helper.setSubject("UniLife - 日程提醒");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
String startTimeStr = schedule.getStartTime().format(formatter);
String content = "<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #eee; border-radius: 5px;\">" +
"<h2 style=\"color: #333;\">日程提醒</h2>" +
"<p>您好," + user.getNickname() + "</p>" +
"<p>您有一个即将开始的日程:</p>" +
"<div style=\"background-color: #f5f5f5; padding: 15px; border-radius: 5px; margin: 15px 0;\">" +
"<h3 style=\"margin-top: 0;\">" + schedule.getTitle() + "</h3>" +
"<p><strong>时间:</strong>" + startTimeStr + "</p>" +
(schedule.getLocation() != null ? "<p><strong>地点:</strong>" + schedule.getLocation() + "</p>" : "") +
(schedule.getDescription() != null ? "<p><strong>描述:</strong>" + schedule.getDescription() + "</p>" : "") +
"</div>" +
"<p>请合理安排您的时间。</p>" +
"<p style=\"margin-top: 30px; font-size: 12px; color: #888;\">" +
"这是一封自动生成的邮件,请勿直接回复。" +
"</p></div>";
helper.setText(content, true);
mailSender.send(message);
return true;
} catch (MessagingException e) {
log.error("发送日程提醒邮件失败", e);
return false;
}
}
}

@ -0,0 +1,67 @@
<?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="com.unilife.mapper.CategoryMapper">
<resultMap id="categoryResultMap" type="com.unilife.model.entity.Category">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="description" property="description"/>
<result column="icon" property="icon"/>
<result column="sort" property="sort"/>
<result column="status" property="status"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<select id="getById" resultMap="categoryResultMap">
SELECT id, name, description, icon, sort, status, created_at, updated_at
FROM categories
WHERE id = #{id}
</select>
<select id="getList" resultMap="categoryResultMap">
SELECT id, name, description, icon, sort, status, created_at, updated_at
FROM categories
<where>
<if test="status != null">
status = #{status}
</if>
</where>
ORDER BY sort ASC, id ASC
</select>
<insert id="insert" parameterType="com.unilife.model.entity.Category" useGeneratedKeys="true" keyProperty="id">
INSERT INTO categories (
name, description, icon, sort, status, created_at, updated_at
) VALUES (
#{name}, #{description}, #{icon}, #{sort}, #{status}, NOW(), NOW()
)
</insert>
<update id="update" parameterType="com.unilife.model.entity.Category">
UPDATE categories
SET name = #{name},
description = #{description},
icon = #{icon},
sort = #{sort},
status = #{status},
updated_at = NOW()
WHERE id = #{id}
</update>
<update id="delete">
UPDATE categories
SET status = 0,
updated_at = NOW()
WHERE id = #{id}
</update>
<select id="getCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM categories
<where>
<if test="status != null">
status = #{status}
</if>
</where>
</select>
</mapper>

@ -0,0 +1,75 @@
<?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="com.unilife.mapper.CommentMapper">
<resultMap id="commentResultMap" type="com.unilife.model.entity.Comment">
<id column="id" property="id"/>
<result column="post_id" property="postId"/>
<result column="user_id" property="userId"/>
<result column="content" property="content"/>
<result column="parent_id" property="parentId"/>
<result column="like_count" property="likeCount"/>
<result column="status" property="status"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<insert id="insert" parameterType="com.unilife.model.entity.Comment" useGeneratedKeys="true" keyProperty="id">
INSERT INTO comments (
post_id, user_id, content, parent_id, like_count, status, created_at, updated_at
) VALUES (
#{postId}, #{userId}, #{content}, #{parentId}, #{likeCount}, #{status}, NOW(), NOW()
)
</insert>
<select id="getById" resultMap="commentResultMap">
SELECT id, post_id, user_id, content, parent_id, like_count, status, created_at, updated_at
FROM comments
WHERE id = #{id} AND status != 0
</select>
<select id="getTopLevelCommentsByPostId" resultMap="commentResultMap">
SELECT id, post_id, user_id, content, parent_id, like_count, status, created_at, updated_at
FROM comments
WHERE post_id = #{postId} AND parent_id IS NULL AND status != 0
ORDER BY created_at DESC
</select>
<select id="getRepliesByParentId" resultMap="commentResultMap">
SELECT id, post_id, user_id, content, parent_id, like_count, status, created_at, updated_at
FROM comments
WHERE parent_id = #{parentId} AND status != 0
ORDER BY created_at ASC
</select>
<select id="getCountByPostId" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM comments
WHERE post_id = #{postId} AND status != 0
</select>
<update id="update" parameterType="com.unilife.model.entity.Comment">
UPDATE comments
SET content = #{content},
updated_at = NOW()
WHERE id = #{id}
</update>
<update id="delete">
UPDATE comments
SET status = 0,
updated_at = NOW()
WHERE id = #{id}
</update>
<update id="incrementLikeCount">
UPDATE comments
SET like_count = like_count + 1
WHERE id = #{id}
</update>
<update id="decrementLikeCount">
UPDATE comments
SET like_count = GREATEST(like_count - 1, 0)
WHERE id = #{id}
</update>
</mapper>

@ -0,0 +1,89 @@
<?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="com.unilife.mapper.CourseMapper">
<resultMap id="courseResultMap" type="com.unilife.model.entity.Course">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="name" property="name"/>
<result column="teacher" property="teacher"/>
<result column="location" property="location"/>
<result column="day_of_week" property="dayOfWeek"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="start_week" property="startWeek"/>
<result column="end_week" property="endWeek"/>
<result column="color" property="color"/>
<result column="status" property="status"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<insert id="insert" parameterType="com.unilife.model.entity.Course" useGeneratedKeys="true" keyProperty="id">
INSERT INTO courses (
user_id, name, teacher, location, day_of_week, start_time, end_time,
start_week, end_week, color, status, created_at, updated_at
) VALUES (
#{userId}, #{name}, #{teacher}, #{location}, #{dayOfWeek}, #{startTime}, #{endTime},
#{startWeek}, #{endWeek}, #{color}, #{status}, NOW(), NOW()
)
</insert>
<select id="getById" resultMap="courseResultMap">
SELECT id, user_id, name, teacher, location, day_of_week, start_time, end_time,
start_week, end_week, color, status, created_at, updated_at
FROM courses
WHERE id = #{id} AND status != 0
</select>
<select id="getListByUserId" resultMap="courseResultMap">
SELECT id, user_id, name, teacher, location, day_of_week, start_time, end_time,
start_week, end_week, color, status, created_at, updated_at
FROM courses
WHERE user_id = #{userId} AND status != 0
ORDER BY day_of_week ASC, start_time ASC
</select>
<update id="update" parameterType="com.unilife.model.entity.Course">
UPDATE courses
SET name = #{name},
teacher = #{teacher},
location = #{location},
day_of_week = #{dayOfWeek},
start_time = #{startTime},
end_time = #{endTime},
start_week = #{startWeek},
end_week = #{endWeek},
color = #{color},
updated_at = NOW()
WHERE id = #{id} AND user_id = #{userId}
</update>
<update id="delete">
UPDATE courses
SET status = 0,
updated_at = NOW()
WHERE id = #{id} AND user_id = #{userId}
</update>
<select id="getListByUserIdAndDayOfWeek" resultMap="courseResultMap">
SELECT id, user_id, name, teacher, location, day_of_week, start_time, end_time,
start_week, end_week, color, status, created_at, updated_at
FROM courses
WHERE user_id = #{userId} AND day_of_week = #{dayOfWeek} AND status != 0
ORDER BY start_time ASC
</select>
<select id="checkConflict" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM courses
WHERE user_id = #{userId}
AND day_of_week = #{dayOfWeek}
AND status != 0
AND (
(start_time &lt; #{endTime} AND end_time &gt; #{startTime})
)
<if test="excludeCourseId != null">
AND id != #{excludeCourseId}
</if>
</select>
</mapper>

@ -0,0 +1,36 @@
<?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="com.unilife.mapper.PostLikeMapper">
<select id="isLiked" resultType="java.lang.Boolean">
SELECT COUNT(*) > 0
FROM post_likes
WHERE post_id = #{postId} AND user_id = #{userId}
</select>
<insert id="insert">
INSERT INTO post_likes (
user_id, post_id, created_at
) VALUES (
#{userId}, #{postId}, NOW()
)
</insert>
<delete id="delete">
DELETE FROM post_likes
WHERE post_id = #{postId} AND user_id = #{userId}
</delete>
<select id="getCountByPostId" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM post_likes
WHERE post_id = #{postId}
</select>
<select id="getLikedPostIdsByUserId" resultType="java.lang.Long">
SELECT post_id
FROM post_likes
WHERE user_id = #{userId}
ORDER BY created_at DESC
</select>
</mapper>

@ -0,0 +1,119 @@
<?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="com.unilife.mapper.ResourceMapper">
<resultMap id="resourceResultMap" type="com.unilife.model.entity.Resource">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="title" property="title"/>
<result column="description" property="description"/>
<result column="file_url" property="fileUrl"/>
<result column="file_size" property="fileSize"/>
<result column="file_type" property="fileType"/>
<result column="category_id" property="categoryId"/>
<result column="download_count" property="downloadCount"/>
<result column="like_count" property="likeCount"/>
<result column="status" property="status"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<insert id="insert" parameterType="com.unilife.model.entity.Resource" useGeneratedKeys="true" keyProperty="id">
INSERT INTO resources (
user_id, title, description, file_url, file_size, file_type, category_id,
download_count, like_count, status, created_at, updated_at
) VALUES (
#{userId}, #{title}, #{description}, #{fileUrl}, #{fileSize}, #{fileType}, #{categoryId},
#{downloadCount}, #{likeCount}, #{status}, NOW(), NOW()
)
</insert>
<select id="getById" resultMap="resourceResultMap">
SELECT id, user_id, title, description, file_url, file_size, file_type, category_id,
download_count, like_count, status, created_at, updated_at
FROM resources
WHERE id = #{id} AND status != 0
</select>
<select id="getList" resultMap="resourceResultMap">
SELECT id, user_id, title, description, file_url, file_size, file_type, category_id,
download_count, like_count, status, created_at, updated_at
FROM resources
<where>
status != 0
<if test="categoryId != null">
AND category_id = #{categoryId}
</if>
<if test="userId != null">
AND user_id = #{userId}
</if>
<if test="keyword != null and keyword != ''">
AND (title LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%'))
</if>
</where>
ORDER BY created_at DESC
</select>
<select id="getCount" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM resources
<where>
status != 0
<if test="categoryId != null">
AND category_id = #{categoryId}
</if>
<if test="userId != null">
AND user_id = #{userId}
</if>
<if test="keyword != null and keyword != ''">
AND (title LIKE CONCAT('%', #{keyword}, '%') OR description LIKE CONCAT('%', #{keyword}, '%'))
</if>
</where>
</select>
<update id="update" parameterType="com.unilife.model.entity.Resource">
UPDATE resources
SET title = #{title},
description = #{description},
category_id = #{categoryId},
status = #{status},
updated_at = NOW()
WHERE id = #{id}
</update>
<update id="delete">
UPDATE resources
SET status = 0,
updated_at = NOW()
WHERE id = #{id}
</update>
<update id="incrementDownloadCount">
UPDATE resources
SET download_count = download_count + 1
WHERE id = #{id}
</update>
<update id="incrementLikeCount">
UPDATE resources
SET like_count = like_count + 1
WHERE id = #{id}
</update>
<update id="decrementLikeCount">
UPDATE resources
SET like_count = GREATEST(like_count - 1, 0)
WHERE id = #{id}
</update>
<select id="getCountByUserId" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM resources
WHERE user_id = #{userId} AND status != 0
</select>
<select id="getCountByCategoryId" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM resources
WHERE category_id = #{categoryId} AND status != 0
</select>
</mapper>

@ -0,0 +1,102 @@
<?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="com.unilife.mapper.ScheduleMapper">
<resultMap id="scheduleResultMap" type="com.unilife.model.entity.Schedule">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="title" property="title"/>
<result column="description" property="description"/>
<result column="start_time" property="startTime"/>
<result column="end_time" property="endTime"/>
<result column="location" property="location"/>
<result column="is_all_day" property="isAllDay"/>
<result column="reminder" property="reminder"/>
<result column="color" property="color"/>
<result column="status" property="status"/>
<result column="created_at" property="createdAt"/>
<result column="updated_at" property="updatedAt"/>
</resultMap>
<insert id="insert" parameterType="com.unilife.model.entity.Schedule" useGeneratedKeys="true" keyProperty="id">
INSERT INTO schedules (
user_id, title, description, start_time, end_time, location,
is_all_day, reminder, color, status, created_at, updated_at
) VALUES (
#{userId}, #{title}, #{description}, #{startTime}, #{endTime}, #{location},
#{isAllDay}, #{reminder}, #{color}, #{status}, NOW(), NOW()
)
</insert>
<select id="getById" resultMap="scheduleResultMap">
SELECT id, user_id, title, description, start_time, end_time, location,
is_all_day, reminder, color, status, created_at, updated_at
FROM schedules
WHERE id = #{id} AND status != 0
</select>
<select id="getListByUserId" resultMap="scheduleResultMap">
SELECT id, user_id, title, description, start_time, end_time, location,
is_all_day, reminder, color, status, created_at, updated_at
FROM schedules
WHERE user_id = #{userId} AND status != 0
ORDER BY start_time ASC
</select>
<select id="getListByUserIdAndTimeRange" resultMap="scheduleResultMap">
SELECT id, user_id, title, description, start_time, end_time, location,
is_all_day, reminder, color, status, created_at, updated_at
FROM schedules
WHERE user_id = #{userId}
AND status != 0
AND (
(start_time &lt;= #{endTime} AND end_time &gt;= #{startTime})
OR (is_all_day = 1 AND DATE(start_time) &lt;= DATE(#{endTime}) AND DATE(end_time) &gt;= DATE(#{startTime}))
)
ORDER BY start_time ASC
</select>
<update id="update" parameterType="com.unilife.model.entity.Schedule">
UPDATE schedules
SET title = #{title},
description = #{description},
start_time = #{startTime},
end_time = #{endTime},
location = #{location},
is_all_day = #{isAllDay},
reminder = #{reminder},
color = #{color},
updated_at = NOW()
WHERE id = #{id} AND user_id = #{userId}
</update>
<update id="delete">
UPDATE schedules
SET status = 0,
updated_at = NOW()
WHERE id = #{id} AND user_id = #{userId}
</update>
<select id="checkConflict" resultType="java.lang.Integer">
SELECT COUNT(*)
FROM schedules
WHERE user_id = #{userId}
AND status != 0
AND (
(start_time &lt; #{endTime} AND end_time &gt; #{startTime})
)
<if test="excludeScheduleId != null">
AND id != #{excludeScheduleId}
</if>
</select>
<select id="getSchedulesToRemind" resultMap="scheduleResultMap">
SELECT id, user_id, title, description, start_time, end_time, location,
is_all_day, reminder, color, status, created_at, updated_at
FROM schedules
WHERE status != 0
AND reminder IS NOT NULL
AND DATE_ADD(#{currentTime}, INTERVAL reminder MINUTE) &gt;= start_time
AND DATE_ADD(#{currentTime}, INTERVAL reminder + #{reminderMinutes} MINUTE) &lt;= start_time
ORDER BY start_time ASC
</select>
</mapper>
Loading…
Cancel
Save