实现分区,作品,用户等的增删改查,并完成配套测试文件
Change-Id: Ibdcd6944106b7ffba30c63e4c878d66fa0213303
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java b/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
index eb87513..a9b7b9d 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/CategoryController.java
@@ -1,6 +1,7 @@
package edu.bjtu.groupone.backend.api;
import edu.bjtu.groupone.backend.domain.dto.CategoryDTO;
+import edu.bjtu.groupone.backend.domain.entity.Category;
import edu.bjtu.groupone.backend.service.CategoryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -23,4 +24,35 @@
public ResponseEntity<List<CategoryDTO>> getCategories() {
return ResponseEntity.ok(categoryService.getCategoryTree());
}
+ // 创建分区
+ @PostMapping
+ @Operation(summary = "创建新分区")
+ public ResponseEntity<String> createCategory(@RequestBody Category category) {
+ categoryService.addCategory(category);
+ return ResponseEntity.ok("分区创建成功");
+ }
+
+ // 删除分区
+ @DeleteMapping("/{id}")
+ @Operation(summary = "删除分区")
+ public ResponseEntity<String> deleteCategory(@PathVariable Long id) {
+ categoryService.deleteCategory(id);
+ return ResponseEntity.ok("分区删除成功");
+ }
+
+ // 更新分区
+ @PutMapping("/{id}")
+ @Operation(summary = "更新分区信息")
+ public ResponseEntity<String> updateCategory(@PathVariable Long id, @RequestBody Category category) {
+ category.setId(id);
+ categoryService.updateCategory(category);
+ return ResponseEntity.ok("分区更新成功");
+ }
+
+ // 获取单个分区
+ @GetMapping("/{id}")
+ @Operation(summary = "获取分区详情")
+ public ResponseEntity<Category> getCategory(@PathVariable Long id) {
+ return ResponseEntity.ok(categoryService.getCategoryById(id));
+ }
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
index 4c08711..1e2746f 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/UserController.java
@@ -20,6 +20,7 @@
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
+import java.util.List;
@CrossOrigin
@Tag(name = "用户相关接口") //输入http://localhost:8080/swagger-ui/index.html或http://localhost:8080/v3/api-docs/可查看接口文档
@@ -294,4 +295,34 @@
);
return Result.success(info);
}
+
+ @DeleteMapping("/{userId}")
+ @Operation(summary = "删除用户")
+ public Result<String> deleteUser(@PathVariable int userId) {
+ userService.deleteUser(userId);
+ return Result.success("用户删除成功"); // 修改为中文
+ }
+
+ @PutMapping("/{userId}")
+ @Operation(summary = "更新用户信息")
+ public Result<String> updateUser(@PathVariable int userId, @RequestBody User user) {
+ user.setUserId(userId);
+ userService.updateUser(user);
+ return Result.success("用户信息更新成功"); // 修改为中文
+ }
+
+ // 用户查询
+ @GetMapping("/{userId}")
+ @Operation(summary = "获取用户信息")
+ public Result<User> getUser(@PathVariable int userId) {
+ User user = userService.getUserById(userId);
+ return Result.success(user);
+ }
+
+ // 所有用户查询
+ @GetMapping("/all")
+ @Operation(summary = "获取所有用户")
+ public Result<List<User>> getAllUsers() {
+ return Result.success(userService.getAllUsers());
+ }
}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
index a56d1cd..1eb4bee 100644
--- a/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
+++ b/src/main/java/edu/bjtu/groupone/backend/api/WorkController.java
@@ -1,6 +1,7 @@
package edu.bjtu.groupone.backend.api;
import edu.bjtu.groupone.backend.domain.dto.WorkResponse;
+import edu.bjtu.groupone.backend.domain.entity.Work;
import edu.bjtu.groupone.backend.service.WorkService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -26,4 +27,34 @@
@Parameter(description = "每页数量", example = "20") @RequestParam(defaultValue = "20") int size) {
return ResponseEntity.ok(workService.getWorks(categoryId, page, size));
}
+ @PostMapping
+ @Operation(summary = "创建新作品")
+ public ResponseEntity<String> createWork(@RequestBody Work work) {
+ workService.addWork(work);
+ return ResponseEntity.ok("作品创建成功");
+ }
+
+ // 删除作品
+ @DeleteMapping("/{id}")
+ @Operation(summary = "删除作品")
+ public ResponseEntity<String> deleteWork(@PathVariable Long id) {
+ workService.deleteWork(id);
+ return ResponseEntity.ok("作品删除成功");
+ }
+
+ // 更新作品
+ @PutMapping("/{id}")
+ @Operation(summary = "更新作品信息")
+ public ResponseEntity<String> updateWork(@PathVariable Long id, @RequestBody Work work) {
+ work.setId(id);
+ workService.updateWork(work);
+ return ResponseEntity.ok("作品更新成功");
+ }
+
+ // 获取单个作品
+ @GetMapping("/{id}")
+ @Operation(summary = "获取作品详情")
+ public ResponseEntity<Work> getWork(@PathVariable Long id) {
+ return ResponseEntity.ok(workService.getWorkById(id));
+ }
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java b/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
index e8261dd..0857376 100644
--- a/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
+++ b/src/main/java/edu/bjtu/groupone/backend/config/PaginationConfig.java
@@ -1,10 +1,13 @@
+// PaginationConfig.java
package edu.bjtu.groupone.backend.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
import org.springframework.data.web.PageableHandlerMethodArgumentResolver;
@Configuration
+@Profile("!test")
public class PaginationConfig {
@Bean
public PageableHandlerMethodArgumentResolver pageableResolver() {
@@ -13,4 +16,4 @@
resolver.setMaxPageSize(100); // 限制最大每页数量
return resolver;
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java b/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
index bdc15e1..b6b49f8 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/dto/WorkResponse.java
@@ -23,4 +23,10 @@
@Schema(description = "所属分区 ID", example = "1")
private Long categoryId;
+
+ @Schema(description = "作品描述", example = "一部关于...")
+ private String description;
+
+ @Schema(description = "创建时间", example = "2023-06-15")
+ private String createTime;
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
index de02aab..c6383c0 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Category.java
@@ -10,27 +10,26 @@
import java.util.List;
@Entity
-@Table(name = "categories") // 显式指定表名
-@Data // 自动生成 getter/setter/toString
-@NoArgsConstructor // JPA 要求无参构造
-@AllArgsConstructor // 全参构造
-@Builder // 支持 Builder 模式
-@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) // 解决 Jackson 序列化问题
-
+@Table(name = "categories")
+@Data
+@NoArgsConstructor // 添加无参构造器注解
+@AllArgsConstructor
+@Builder
+@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- @Column(nullable = false, length = 50) // 数据库字段约束
+ @Column(nullable = false, length = 50)
private String name;
- @ManyToOne(fetch = FetchType.LAZY) // 推荐懒加载
+ @ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(
name = "parent_id",
foreignKey = @ForeignKey(name = "fk_category_parent")
)
- @JsonIgnoreProperties("children") // 避免双向循环序列化
+ @JsonIgnoreProperties("children")
private Category parent;
@OneToMany(
@@ -38,10 +37,17 @@
cascade = CascadeType.ALL,
orphanRemoval = true
)
- @Builder.Default // 保证 Lombok Builder 初始化集合
+ @Builder.Default
private List<Category> children = new ArrayList<>();
- // 双向关联辅助方法
+ // 修复后的构造器确保 children 被初始化
+ public Category(Long id, String name, Category parent) {
+ this.id = id;
+ this.name = name;
+ this.parent = parent;
+ this.children = new ArrayList<>(); // 关键修复:初始化 children
+ }
+
public void addChild(Category child) {
children.add(child);
child.setParent(this);
@@ -51,9 +57,4 @@
children.remove(child);
child.setParent(null);
}
- public Category(Long id, String name, Category parent) {
- this.id = id;
- this.name = name;
- this.parent = parent;
- }
}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
index 55e036b..ca3b365 100644
--- a/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
+++ b/src/main/java/edu/bjtu/groupone/backend/domain/entity/Work.java
@@ -29,4 +29,9 @@
foreignKey = @ForeignKey(name = "fk_work_category")
)
private Category category;
+ @Column(columnDefinition = "TEXT")
+ private String description;
+
+ @Column(name = "create_time")
+ private String createTime;
}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
index 42bb6af..d29b298 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/CategoryMybatisMapper.java
@@ -1,6 +1,7 @@
package edu.bjtu.groupone.backend.mapper;
import edu.bjtu.groupone.backend.domain.entity.Category;
+import org.apache.ibatis.annotations.*;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@@ -10,4 +11,20 @@
public interface CategoryMybatisMapper {
List<Category> findByParentId(Long parentId);
List<Category> findAll();
+ // 新增
+ @Insert("INSERT INTO categories(name, parent_id) VALUES(#{name}, #{parent.id})")
+ @Options(useGeneratedKeys = true, keyProperty = "id")
+ void insert(Category category);
+
+ // 删除
+ @Delete("DELETE FROM categories WHERE id = #{id}")
+ void deleteById(Long id);
+
+ // 更新
+ @Update("UPDATE categories SET name=#{name}, parent_id=#{parent.id} WHERE id=#{id}")
+ void update(Category category);
+
+ // 查询
+ @Select("SELECT * FROM categories WHERE id = #{id}")
+ Category findById(Long id);
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
index 8f0044d..3e14ee4 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/UserMapper.java
@@ -4,14 +4,20 @@
import edu.bjtu.groupone.backend.domain.entity.User;
import org.apache.ibatis.annotations.*;
+import java.util.List;
+
@Mapper
public interface UserMapper {
- @Select("select * from user where email=#{email} and password=#{password}")
+
+ @Select("select * from user where email=#{email} and password=#{password}")
User login(User user);
@Select("SELECT * FROM user WHERE username = #{username}")
User selectByUsername(String username);
+ @Select("SELECT * FROM user WHERE user_id = #{userId}")
+ User selectUserById(int userId);
+
@Select("SELECT * FROM user WHERE email = #{email}")
User selectByEmail(String email);
@@ -26,4 +32,14 @@
@Select("SELECT COUNT(*) FROM user WHERE identification_number = #{identificationNumber}")
int countByIdentificationNumber(int identificationNumber);
+
+ @Delete("DELETE FROM user WHERE user_id = #{userId}")
+ int deleteUser(int userId);
+
+ @Update("UPDATE user SET username=#{username}, email=#{email}, password=#{password}, " +
+ "identification_number=#{identificationNumber} WHERE user_id=#{userId}")
+ int updateUser(User user);
+
+ @Select("SELECT * FROM user")
+ List<User> selectAllUsers();
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
index a3485d7..90836a8 100644
--- a/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
+++ b/src/main/java/edu/bjtu/groupone/backend/mapper/WorkMybatisMapper.java
@@ -3,6 +3,7 @@
//import edu.bjtu.groupone.backend.model.Work;
import edu.bjtu.groupone.backend.domain.entity.Work;
+import org.apache.ibatis.annotations.*;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; // 正确导入
import org.springframework.data.jpa.repository.JpaRepository;
@@ -14,4 +15,23 @@
public interface WorkMybatisMapper {
// 修正参数类型为 Spring Data 的 Pageable
Page<Work> findByCategoryIdIn(List<Long> categoryIds, Pageable pageable);
+ @Insert("INSERT INTO works(title, author, views, category_id, description, create_time) " +
+ "VALUES(#{title}, #{author}, #{views}, #{category.id}, #{description}, #{createTime})")
+ @Options(useGeneratedKeys = true, keyProperty = "id")
+ void save(Work work);
+
+ // 删除
+ @Delete("DELETE FROM works WHERE id = #{id}")
+ void deleteById(Long id);
+
+ // 更新
+ @Update("UPDATE works SET title=#{title}, author=#{author}, " +
+ "views=#{views}, category_id=#{category.id}, " +
+ "description=#{description}, create_time=#{createTime} " +
+ "WHERE id=#{id}")
+ void update(Work work);
+
+ // 查询
+ @Select("SELECT * FROM works WHERE id = #{id}")
+ Work findById(Long id);
}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java b/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
index 7b745c1..db78bda 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/CategoryService.java
@@ -39,4 +39,19 @@
}
}
+ public void addCategory(Category category) {
+ categoryMybatisMapper.insert(category);
+ }
+
+ public void deleteCategory(Long id) {
+ categoryMybatisMapper.deleteById(id);
+ }
+
+ public void updateCategory(Category category) {
+ categoryMybatisMapper.update(category);
+ }
+
+ public Category getCategoryById(Long id) {
+ return categoryMybatisMapper.findById(id);
+ }
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
index be8877d..867aead 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/UserService.java
@@ -3,6 +3,8 @@
import edu.bjtu.groupone.backend.domain.entity.User;
+import java.util.List;
+
public interface UserService {
User login(User user);
boolean isUsernameExists(String username);
@@ -14,4 +16,9 @@
// 新增重置密码相关
void sendResetCode(String email);
boolean resetPassword(String email, String code, String newPassword);
+ // 新增方法
+ void deleteUser(int userId);
+ void updateUser(User user);
+ User getUserById(int userId);
+ List<User> getAllUsers();
}
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
index f3b58af..ec0494f 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/WorkService.java
@@ -10,6 +10,8 @@
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
import java.util.List;
@Service
@@ -33,7 +35,30 @@
work.getTitle(),
work.getAuthor(),
work.getViews(),
- work.getCategory().getId()
+ work.getCategory().getId(),
+ work.getDescription(), // 新增字段
+ work.getCreateTime()
);
}
+
+ public void addWork(Work work) {
+ work.setCreateTime(LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
+ workMybatisMapper.save(work);
+ }
+
+ public void deleteWork(Long id) {
+ workMybatisMapper.deleteById(id);
+ }
+
+ public void updateWork(Work work) {
+ Work existing = workMybatisMapper.findById(work.getId());
+ if (existing != null) {
+ work.setCreateTime(existing.getCreateTime());
+ }
+ workMybatisMapper.update(work);
+ }
+
+ public Work getWorkById(Long id) {
+ return workMybatisMapper.findById(id);
+ }
}
\ No newline at end of file
diff --git a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
index aa113cd..82593f7 100644
--- a/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
+++ b/src/main/java/edu/bjtu/groupone/backend/service/impl/UserServImpl.java
@@ -9,6 +9,7 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
+import java.util.List;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
@@ -124,4 +125,23 @@
: "user";
return "user_" + prefix + "_" + String.format("%04d", new Random().nextInt(10000));
}
+ @Override
+ public void deleteUser(int userId) {
+ userMapper.deleteUser(userId);
+ }
+
+ @Override
+ public void updateUser(User user) {
+ userMapper.updateUser(user);
+ }
+
+ @Override
+ public User getUserById(int userId) {
+ return userMapper.selectUserById(userId);
+ }
+
+ @Override
+ public List<User> getAllUsers() {
+ return userMapper.selectAllUsers();
+ }
}
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index beb0cc7..a36d6ea 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -7,25 +7,25 @@
`address` VARCHAR(255),
`role` VARCHAR(50) NOT NULL DEFAULT 'user',
`profile_pic` VARCHAR(255),
- `registration_date` DATETIME NOT NULL,
+ `registration_date` TIMESTAMP NOT NULL,
`identification_number` VARCHAR(18),
`avatar` VARCHAR(255),
`isfollowed` BOOLEAN NOT NULL DEFAULT FALSE
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+);
-- 外键表同样使用反引号
-CREATE TABLE user_follow (
- `follower_id` INT NOT NULL,
- `followed_id` INT NOT NULL,
- `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
- PRIMARY KEY (`follower_id`, `followed_id`),
- FOREIGN KEY (`follower_id`) REFERENCES `user`(`user_id`),
- FOREIGN KEY (`followed_id`) REFERENCES `user`(`user_id`)
+CREATE TABLE `user_follow` (
+ `follower_id` INT NOT NULL,
+ `followed_id` INT NOT NULL,
+ `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`follower_id`, `followed_id`),
+ FOREIGN KEY (`follower_id`) REFERENCES `user`(`user_id`),
+ FOREIGN KEY (`followed_id`) REFERENCES `user`(`user_id`)
);
-- 插入语句使用反引号包裹表名和列名
INSERT INTO `user` (
`username`, `email`, `password`, `registration_date`, `identification_number`, `role`
) VALUES (
- 'admin', 'admin@example.com', 'admin123', NOW(), '87654321', 'admin'
+ 'admin', 'admin@example.com', 'admin123', CURRENT_TIMESTAMP, '87654321', 'admin'
);
\ No newline at end of file