diff --git a/src/main/java/com/sipc/stellar/biz/IProjectBiz.java b/src/main/java/com/sipc/stellar/biz/IProjectBiz.java
new file mode 100644
index 0000000000000000000000000000000000000000..c91ff9012418e7e3615f7511d1075810e42f2335
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/biz/IProjectBiz.java
@@ -0,0 +1,22 @@
+package com.sipc.stellar.biz;
+
+import com.sipc.stellar.pojo.SipcResponse;
+import com.sipc.stellar.pojo.model.pageData.PageData;
+import com.sipc.stellar.pojo.model.request.ProjectRequest;
+import com.sipc.stellar.pojo.model.result.ProjectResult;
+
+public interface IProjectBiz {
+    SipcResponse<String> addProject(ProjectRequest projectRequest);
+
+    SipcResponse<String> updateProject(ProjectRequest projectRequest, Integer id);
+
+    SipcResponse<String> deleteProject(Integer id);
+
+    SipcResponse<PageData<ProjectResult>> getProjects(Integer pageNo, Integer pageSize);
+
+    SipcResponse<ProjectResult> getProjectById(Integer id);
+
+    SipcResponse<String> updateProjectMembers(ProjectRequest projectRequest, Integer id);
+
+    SipcResponse<String> updateProjectImages(ProjectRequest projectRequest, Integer id);
+}
diff --git a/src/main/java/com/sipc/stellar/biz/impl/ProjectBizImpl.java b/src/main/java/com/sipc/stellar/biz/impl/ProjectBizImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..8208075ece9ecf398b0456c817aa2940bd57c85a
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/biz/impl/ProjectBizImpl.java
@@ -0,0 +1,71 @@
+package com.sipc.stellar.biz.impl;
+
+import com.sipc.stellar.biz.IProjectBiz;
+import com.sipc.stellar.pojo.SipcResponse;
+import com.sipc.stellar.pojo.model.pageData.PageData;
+import com.sipc.stellar.pojo.model.request.ProjectRequest;
+import com.sipc.stellar.pojo.model.result.ProjectResult;
+import com.sipc.stellar.service.ProjectService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ProjectBizImpl implements IProjectBiz {
+    private ProjectService projectService;
+    @Override
+    public SipcResponse<String> addProject(ProjectRequest projectRequest) {
+        //TODO 七牛云相关
+        //添加项目信息
+        projectService.addProject(projectRequest);
+        return SipcResponse.success();
+    }
+
+    @Override
+    public SipcResponse<String> updateProject(ProjectRequest projectRequest, Integer id) {
+        //更新项目信息
+        projectService.updateProject(projectRequest,id);
+        return SipcResponse.success();
+    }
+
+    @Override
+    public SipcResponse<String> updateProjectMembers(ProjectRequest projectRequest, Integer id) {
+        //更新项目信息
+        projectService.updateProjectMembers(projectRequest,id);
+        return SipcResponse.success();
+    }
+
+    @Override
+    public SipcResponse<String> updateProjectImages(ProjectRequest projectRequest, Integer id) {
+        //TODO 七牛云相关
+        //更新项目信息
+        projectService.updateProjectImages(projectRequest,id);
+        return SipcResponse.success();
+    }
+
+    @Override
+    public SipcResponse<String> deleteProject(Integer id) {
+        //TODO 七牛云相关
+        //删除项目信息
+        projectService.deleteProject(id);
+        return SipcResponse.success();
+    }
+
+    @Override
+    public SipcResponse<PageData<ProjectResult>> getProjects(Integer pageNo, Integer pageSize) {
+        //TODO 权限责任链
+        //TODO 项目需要展示的信息不全,后面会更改
+        //获取分页查询结果
+        PageData<ProjectResult> results=projectService.getProjects(pageNo,pageSize);
+        return SipcResponse.success(results);
+    }
+
+    @Override
+    public SipcResponse<ProjectResult> getProjectById(Integer id) {
+        //TODO 权限责任链
+        //TODO 项目需要展示的信息不全,后面会更改
+        //获取分页查询结果
+        ProjectResult result=projectService.getProjectById(id);
+        return SipcResponse.success(result);
+    }
+}
diff --git a/src/main/java/com/sipc/stellar/controller/ProjectController.java b/src/main/java/com/sipc/stellar/controller/ProjectController.java
new file mode 100644
index 0000000000000000000000000000000000000000..378496ffe7e4ef440bfe17a4449663510beb6e04
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/controller/ProjectController.java
@@ -0,0 +1,59 @@
+package com.sipc.stellar.controller;
+
+import com.sipc.stellar.biz.IProjectBiz;
+import com.sipc.stellar.pojo.SipcResponse;
+import com.sipc.stellar.pojo.model.pageData.PageData;
+import com.sipc.stellar.pojo.model.request.ProjectRequest;
+import com.sipc.stellar.pojo.model.result.ProjectResult;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@Validated
+@AllArgsConstructor
+@RequestMapping("stellar")
+public class ProjectController {
+    private IProjectBiz iProjectBiz;
+
+    @PostMapping("/projects")
+    public SipcResponse<String> addProject(@Valid @RequestBody ProjectRequest projectRequest){
+        return iProjectBiz.addProject(projectRequest);
+    }
+
+    @PutMapping("/projects/{id}")
+    public SipcResponse<String> updateProject(@Valid @RequestBody ProjectRequest projectRequest,
+                                       @PathVariable("id")@NotBlank(message = "项目id不能为空") String id){
+        return iProjectBiz.updateProject(projectRequest,Integer.parseInt(id));
+    }
+
+    @PutMapping("/projects/members/{id}")
+    public SipcResponse<String> updateProjectMembers(@Valid @RequestBody ProjectRequest projectRequest,
+                                              @PathVariable("id")@NotBlank(message = "项目id不能为空") String id){
+        return iProjectBiz.updateProjectMembers(projectRequest,Integer.parseInt(id));
+    }
+
+    @PutMapping("/projects/images/{id}")
+    public SipcResponse<String> updateProjectImages(@Valid @RequestBody ProjectRequest projectRequest,
+                                             @PathVariable("id")@NotBlank(message = "项目id不能为空") String id){
+        return iProjectBiz.updateProjectImages(projectRequest,Integer.parseInt(id));
+    }
+
+    @DeleteMapping("/projects/{id}")
+    public SipcResponse<String> deleteProject(@PathVariable("id")@NotBlank(message = "项目id不能为空") String id){
+        return iProjectBiz.deleteProject(Integer.parseInt(id));
+    }
+
+    @GetMapping("/projects")
+    public SipcResponse<PageData<ProjectResult>> getProjects(@RequestParam(value ="page_no",defaultValue = "1") Integer pageNo,
+                                                             @RequestParam(value ="page_size",defaultValue = "10") Integer pageSize){
+        return iProjectBiz.getProjects(pageNo,pageSize);
+    }
+
+    @GetMapping("/projects/{id}")
+    public SipcResponse<ProjectResult> getProjectById(@PathVariable("id")@NotBlank(message = "项目id不能为空") String id){
+        return iProjectBiz.getProjectById(Integer.parseInt(id));
+    }
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/request/ProjectImageRequest.java b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectImageRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1dee0770fdcce0687d02afe98560270f547cd9b7
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectImageRequest.java
@@ -0,0 +1,8 @@
+package com.sipc.stellar.pojo.model.request;
+
+import lombok.Data;
+
+@Data
+public class ProjectImageRequest {
+    private String imageUrl;
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/request/ProjectMemberRequest.java b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectMemberRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..611242795b343ffcf4b6651a49cbb950d0a332a5
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectMemberRequest.java
@@ -0,0 +1,8 @@
+package com.sipc.stellar.pojo.model.request;
+
+import lombok.Data;
+
+@Data
+public class ProjectMemberRequest {
+    private Integer userId;
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/request/ProjectRequest.java b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectRequest.java
new file mode 100644
index 0000000000000000000000000000000000000000..78b7dfe33fd5c9b5ab7f93d87324ad13e43e8242
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/request/ProjectRequest.java
@@ -0,0 +1,20 @@
+package com.sipc.stellar.pojo.model.request;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+@Data
+public class ProjectRequest {
+    private String name;
+    private String description;
+
+    private Integer researchId;
+    private List<ProjectImageRequest> images;
+    private List<ProjectMemberRequest> members;
+    private String achievements;
+    @JsonFormat(pattern="yyyy-MM-dd", timezone = "GMT+8")
+    private Timestamp date;
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/result/ProjectImageResult.java b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectImageResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb8286e595ecb94e90068be12e1b4da54be3a3bf
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectImageResult.java
@@ -0,0 +1,8 @@
+package com.sipc.stellar.pojo.model.result;
+
+import lombok.Data;
+
+@Data
+public class ProjectImageResult {
+    private String imageUrl;
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/result/ProjectMemberResult.java b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectMemberResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..b960584b21719b48f765f45390a0042cf7759db8
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectMemberResult.java
@@ -0,0 +1,8 @@
+package com.sipc.stellar.pojo.model.result;
+
+import lombok.Data;
+
+@Data
+public class ProjectMemberResult {
+    private Integer userId;
+}
diff --git a/src/main/java/com/sipc/stellar/pojo/model/result/ProjectResult.java b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectResult.java
new file mode 100644
index 0000000000000000000000000000000000000000..ef71f13047347d7030d6c2af321ecca26bbf6221
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/pojo/model/result/ProjectResult.java
@@ -0,0 +1,18 @@
+package com.sipc.stellar.pojo.model.result;
+
+import lombok.Data;
+
+import java.sql.Timestamp;
+import java.util.List;
+
+@Data
+public class ProjectResult {
+    private Integer id;
+    private String name;
+    private String description;
+    private List<ProjectImageResult> images;
+    private List<ProjectMemberResult> members;
+    private String achievements;
+    private String research;
+    private Timestamp date;
+}
diff --git a/src/main/java/com/sipc/stellar/service/ProjectService.java b/src/main/java/com/sipc/stellar/service/ProjectService.java
new file mode 100644
index 0000000000000000000000000000000000000000..0cf3ce3397087ec2806dee0a8a858f720b2f7913
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/service/ProjectService.java
@@ -0,0 +1,24 @@
+package com.sipc.stellar.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sipc.stellar.pojo.domain.Project;
+import com.sipc.stellar.pojo.model.pageData.PageData;
+import com.sipc.stellar.pojo.model.request.ProjectRequest;
+import com.sipc.stellar.pojo.model.result.ProjectResult;
+
+
+public interface ProjectService extends IService<Project> {
+    PageData<ProjectResult> getProjects(Integer pageNo, Integer pageSize);
+
+    ProjectResult getProjectById(Integer id);
+
+    void addProject(ProjectRequest projectRequest);
+
+    void updateProject(ProjectRequest projectRequest, Integer id);
+
+    void deleteProject(Integer id);
+
+    void updateProjectMembers(ProjectRequest projectRequest, Integer id);
+
+    void updateProjectImages(ProjectRequest projectRequest, Integer id);
+}
diff --git a/src/main/java/com/sipc/stellar/service/impl/ProjectServiceImpl.java b/src/main/java/com/sipc/stellar/service/impl/ProjectServiceImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..905217fa4ba1392ecc57656799e689913358644a
--- /dev/null
+++ b/src/main/java/com/sipc/stellar/service/impl/ProjectServiceImpl.java
@@ -0,0 +1,383 @@
+package com.sipc.stellar.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sipc.stellar.handler.token.TokenHandler;
+import com.sipc.stellar.mapper.ProjectImageMapper;
+import com.sipc.stellar.mapper.ProjectMapper;
+import com.sipc.stellar.mapper.ProjectUserMergeMapper;
+import com.sipc.stellar.mapper.ResearchMapMapper;
+import com.sipc.stellar.pojo.domain.Project;
+import com.sipc.stellar.pojo.domain.ProjectImage;
+import com.sipc.stellar.pojo.domain.ProjectUserMerge;
+import com.sipc.stellar.pojo.domain.ResearchMap;
+import com.sipc.stellar.pojo.model.TokenModel;
+import com.sipc.stellar.pojo.model.exception.SipcBaseException;
+import com.sipc.stellar.pojo.model.pageData.PageData;
+import com.sipc.stellar.pojo.model.request.ProjectImageRequest;
+import com.sipc.stellar.pojo.model.request.ProjectMemberRequest;
+import com.sipc.stellar.pojo.model.request.ProjectRequest;
+import com.sipc.stellar.pojo.model.result.ProjectImageResult;
+import com.sipc.stellar.pojo.model.result.ProjectMemberResult;
+import com.sipc.stellar.pojo.model.result.ProjectResult;
+import com.sipc.stellar.pojo.model.resultEnum.ResultCode;
+import com.sipc.stellar.service.ProjectService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project>implements ProjectService {
+    private ProjectUserMergeMapper projectUserMergeMapper;
+    private ProjectImageMapper projectImageMapper;
+    private ProjectMapper projectMapper;
+    private ResearchMapMapper researchMapMapper;
+    private ProjectImageServiceImpl projectImageService;
+    private ProjectUserMergeServiceImpl projectUserMergeService;
+    @Override
+    public PageData<ProjectResult> getProjects(Integer pageNo, Integer pageSize) {
+        //TODO: 设定获取分页逻辑
+
+        Page<Project> projectPage=new Page<>(pageNo,pageSize);
+        IPage<Project> projectIPage=page(projectPage);
+        //获取项目id列表
+        List<Integer> projectIdList=new ArrayList<>();
+        Set<Integer> researchIdSet=new HashSet<>();
+        for (Project temp:projectIPage.getRecords()){
+            projectIdList.add(temp.getId());
+            researchIdSet.add(temp.getResearchId());
+        }
+        //若无列表,则添加-1,防止报错
+        if(researchIdSet.size()==0){
+            researchIdSet.add(-1);
+        }
+        if(projectIdList.size()==0){
+            projectIdList.add(-1);
+        }
+        //构建研究方向Map
+        QueryWrapper<ResearchMap> researchMapQueryWrapper=new QueryWrapper<>();
+        researchMapQueryWrapper.in("id",researchIdSet);
+        List<ResearchMap> researchMapList=researchMapMapper.selectList(researchMapQueryWrapper);
+        Map<Integer, String> researchMap = new HashMap<>();
+        for (ResearchMap temp : researchMapList) {
+            int id = temp.getId();
+            String name = temp.getResearch();
+            if (researchMap.containsKey(id) && researchMap.get(id).equals(name)) {
+                continue;
+            }
+            researchMap.put(id, name);
+        }
+        //构建制作人Map
+        QueryWrapper<ProjectUserMerge> projectUserMergeQueryWrapper=new QueryWrapper<>();
+        projectUserMergeQueryWrapper.in("project_id",projectIdList);
+        List<ProjectUserMerge> projectUserMergeList=projectUserMergeMapper.selectList(projectUserMergeQueryWrapper);
+        Map<Integer, List<Integer>> memberMap = projectUserMergeList.stream()
+                .collect(Collectors.groupingBy(ProjectUserMerge::getProjectId, Collectors.mapping(ProjectUserMerge::getUserId, Collectors.toList())));
+        //构建图片Map
+        QueryWrapper<ProjectImage> projectImageQueryWrapper=new QueryWrapper<>();
+        projectImageQueryWrapper.in("project_id",projectIdList);
+        List<ProjectImage> projectImageList=projectImageMapper.selectList(projectImageQueryWrapper);
+        Map<Integer, List<String>> imageMap = projectImageList.stream()
+                .collect(Collectors.groupingBy(ProjectImage::getProjectId, Collectors.mapping(ProjectImage::getImageUrl, Collectors.toList())));
+        //封装返回值
+        List<ProjectResult> projectResultList =new ArrayList<>();
+        for (Project temp:projectIPage.getRecords()){
+            //设置基础信息
+            ProjectResult projectResult =projectToProjectResponse(temp);
+            //设置研究方向名称
+            projectResult.setResearch(researchMap.get(temp.getResearchId()));
+            //设置制作人
+            List<ProjectMemberResult> projectMemberResultList =new ArrayList<>();
+            List<Integer> memberIdList=new ArrayList<>();
+            if(memberMap.containsKey(temp.getId())){
+                memberIdList=memberMap.get(temp.getId());
+            }
+            for(Integer userId:memberIdList){
+                ProjectMemberResult projectMemberResult =new ProjectMemberResult();
+                projectMemberResult.setUserId(userId);
+                projectMemberResultList.add(projectMemberResult);
+            }
+            projectResult.setMembers(projectMemberResultList);
+            //设置图片
+            List<ProjectImageResult> projectImageResultList =new ArrayList<>();
+            List<String> imageUrlList=new ArrayList<>();
+            if(imageMap.containsKey(temp.getId())){
+                imageUrlList=imageMap.get(temp.getId());
+            }
+            for(String imageUrl:imageUrlList){
+                ProjectImageResult projectImageResult =new ProjectImageResult();
+                projectImageResult.setImageUrl(imageUrl);
+                projectImageResultList.add(projectImageResult);
+            }
+            projectResult.setImages(projectImageResultList);
+            projectResultList.add(projectResult);
+        }
+        //封装分页类
+        IPage<ProjectResult> projectResponseIPage=new Page<>(pageNo,pageSize);
+        projectResponseIPage.setRecords(projectResultList);
+        projectResponseIPage.setPages(projectIPage.getPages());
+        projectResponseIPage.setCurrent(projectIPage.getCurrent());
+        projectResponseIPage.setSize(projectIPage.getSize());
+        projectResponseIPage.setTotal(projectIPage.getTotal());
+        PageData<ProjectResult> results=new PageData<>();
+        results.praisePage(projectResponseIPage);
+        return results;
+    }
+
+    @Override
+    public ProjectResult getProjectById(Integer id) {
+        Project project= this.getById(id);
+        if(project==null){
+            throw new SipcBaseException(ResultCode.INVALID_PARAM,"project is not exist.");
+        }
+        ProjectResult result=projectToProjectResponse(project);
+        //设置研究方向名称
+        if(project.getResearchId()!=null){
+            result.setResearch(researchMapMapper.selectById(project.getResearchId()).getResearch());
+        }
+        //设置项目制作人
+        QueryWrapper<ProjectUserMerge> projectUserMergeQueryWrapper=new QueryWrapper<>();
+        projectUserMergeQueryWrapper.eq("project_id",id);
+        List<ProjectUserMerge> projectUserMergeList=projectUserMergeMapper.selectList(projectUserMergeQueryWrapper);
+        List<ProjectMemberResult> memberIdList=new ArrayList<>();
+        for(ProjectUserMerge temp:projectUserMergeList){
+            ProjectMemberResult projectMemberResult =new ProjectMemberResult();
+            projectMemberResult.setUserId(temp.getUserId());
+            memberIdList.add(projectMemberResult);
+        }
+        result.setMembers(memberIdList);
+        //设置项目图片
+        QueryWrapper<ProjectImage> projectImageResponseQueryWrapper=new QueryWrapper<>();
+        projectImageResponseQueryWrapper.eq("project_id",id);
+        List<ProjectImage> projectImageList=projectImageMapper.selectList(projectImageResponseQueryWrapper);
+        List<ProjectImageResult> imageUrls=new ArrayList<>();
+        for(ProjectImage temp:projectImageList){
+            ProjectImageResult projectImageResult =new ProjectImageResult();
+            projectImageResult.setImageUrl(temp.getImageUrl());
+            imageUrls.add(projectImageResult);
+        }
+        result.setImages(imageUrls);
+        return result;
+    }
+
+    @Override
+    public void addProject(ProjectRequest projectRequest) {
+        //判断权限
+        TokenModel tokenModel = TokenHandler.getUserThreadLocal();
+        if(tokenModel.getPermission()<2){
+            log.warn("用户: {},增加项目权限不足",tokenModel.getUsername());
+            throw new SipcBaseException(ResultCode.PERMISSION_WRONG,"no permission.");
+        }
+        log.info("管理员: {},试图增加项目",tokenModel.getUsername());
+        //封装项目类
+        Project project=projectRequestToProject(projectRequest);
+        //设置创建管理员
+        project.setCreateBy(tokenModel.getUsername());
+        project.setUpdateBy(tokenModel.getUsername());
+
+        String errorInfo="";
+        try {
+            errorInfo="research";
+            //添加项目内容
+            this.save(project);
+            //添加项目人员
+            errorInfo="user";
+            List<ProjectUserMerge> projectUserMergeList=projectMemberRequestToProjectUserMerge(projectRequest.getMembers(),project.getId());
+            projectUserMergeService.saveBatch(projectUserMergeList);
+            //添加项目图片
+            List<ProjectImage> projectImageList=projectImageRequestToProjectImage(projectRequest.getImages(),project.getId());
+            projectImageService.saveBatch(projectImageList);
+        } catch (Exception e) {
+            this.removeById(project.getId());
+            // 判断是否是外键约束异常
+            if (e.getMessage().contains("foreign key constraint")) {
+                log.warn("{}主键不存在",errorInfo);
+                throw new SipcBaseException(ResultCode.INVALID_PARAM,errorInfo+" is not exist.");
+            } else {
+                log.error("管理员: {},添加项目失败。添加信息:{}",tokenModel.getUsername(),projectRequest);
+                // 其他异常情况,直接抛出异常
+                throw e;
+            }
+        }
+        log.info("管理员: {},添加项目成功,id:{}",tokenModel.getUsername(),project.getId());
+    }
+
+    @Override
+    public void updateProject(ProjectRequest projectRequest, Integer id) {
+        //判断权限
+        TokenModel tokenModel = TokenHandler.getUserThreadLocal();
+        if(tokenModel.getPermission()<2){
+            log.warn("用户: {},修改项目权限不足",tokenModel.getUsername());
+            throw new SipcBaseException(ResultCode.PERMISSION_WRONG,"no permission.");
+        }
+        log.info("管理员: {},试图修改项目",tokenModel.getUsername());
+        //封装项目类
+        Project project=projectRequestToProject(projectRequest);
+        //设置项目id、更新管理员
+        project.setId(id);
+        project.setUpdateBy(tokenModel.getUsername());
+        //更新项目信息
+        try {
+            if(!this.updateById(project)){
+                log.warn("不存在id为{}的项目",id);
+                throw new SipcBaseException(ResultCode.INVALID_PARAM,"project is not exist.");
+            }
+        } catch (Exception e) {
+            // 判断是否是外键约束异常
+            if (e.getMessage().contains("foreign key constraint")) {
+                log.warn("研究方向主键不存在");
+                throw new SipcBaseException(ResultCode.INVALID_PARAM,"research is not exist.");
+            } else {
+                log.error("管理员: {},修改项目失败。修改信息:{}",tokenModel.getUsername(),projectRequest);
+                // 其他异常情况,直接抛出异常
+                throw e;
+            }
+        }
+        log.info("管理员: {},修改项目成功,id:{}",tokenModel.getUsername(),id);
+    }
+
+    @Transactional
+    @Override
+    public void updateProjectMembers(ProjectRequest projectRequest, Integer id) {
+        //判断权限
+        TokenModel tokenModel = TokenHandler.getUserThreadLocal();
+        if(tokenModel.getPermission()<2){
+            log.warn("用户: {},修改项目权限不足",tokenModel.getUsername());
+            throw new SipcBaseException(ResultCode.PERMISSION_WRONG,"no permission.");
+        }
+        log.info("管理员: {},试图修改项目成员",tokenModel.getUsername());
+        //检查是否存在该项目
+        QueryWrapper<Project> projectQueryWrapper=new QueryWrapper<>();
+        projectQueryWrapper.eq("id",id);
+        if(!projectMapper.exists(projectQueryWrapper)){
+            log.warn("不存在id为{}的项目",id);
+            throw new SipcBaseException("project is not exist.");
+        }
+        //封装项目制作人类
+        List<ProjectUserMerge> projectUserMergeList=projectMemberRequestToProjectUserMerge(projectRequest.getMembers(),id);
+        //更新项目制作人
+        try {
+            QueryWrapper<ProjectUserMerge> projectUserMergeQueryWrapper=new QueryWrapper<>();
+            projectUserMergeQueryWrapper.eq("project_id",id);
+            projectUserMergeService.remove(projectUserMergeQueryWrapper);
+            projectUserMergeService.saveBatch(projectUserMergeList);
+        } catch (Exception e) {
+            // 判断是否是外键约束异常
+            if (e.getMessage().contains("foreign key constraint")) {
+                log.warn("成员主键不存在");
+                throw new SipcBaseException(ResultCode.INVALID_PARAM,"user is not exist.");
+            } else {
+                log.error("管理员: {},修改项目人员失败。修改信息:{}",tokenModel.getUsername(),projectRequest);
+                // 其他异常情况,直接抛出异常
+                throw e;
+            }
+        }
+        //更新管理员信息
+        Project project=new Project();
+        project.setId(id);
+        project.setUpdateBy(tokenModel.getUsername());
+        this.updateById(project);
+        log.info("管理员: {},修改项目人员成功,id:{}",tokenModel.getUsername(),id);
+    }
+
+    @Override
+    public void updateProjectImages(ProjectRequest projectRequest, Integer id) {
+        //判断权限
+        TokenModel tokenModel = TokenHandler.getUserThreadLocal();
+        if(tokenModel.getPermission()<2){
+            log.warn("用户: {},修改项目权限不足",tokenModel.getUsername());
+            throw new SipcBaseException(ResultCode.PERMISSION_WRONG,"no permission.");
+        }
+        log.info("管理员: {},试图修改项目图片",tokenModel.getUsername());
+        //更新管理员信息
+        Project project=new Project();
+        project.setId(id);
+        project.setUpdateBy(tokenModel.getUsername());
+        if(!this.updateById(project)){
+            log.warn("不存在id为{}的项目",id);
+            throw new SipcBaseException(ResultCode.INVALID_PARAM,"project is not exist.");
+        }
+        //封装项目图片类
+        List<ProjectImage> projectImageList=projectImageRequestToProjectImage(projectRequest.getImages(),id);
+        //更新项目图片
+        QueryWrapper<ProjectImage> projectImageQueryWrapper=new QueryWrapper<>();
+        projectImageQueryWrapper.eq("project_id",id);
+        projectImageService.remove(projectImageQueryWrapper);
+        projectImageService.saveBatch(projectImageList);
+        log.info("管理员: {},修改项目图片成功,id:{}",tokenModel.getUsername(),id);
+    }
+
+    @Override
+    public void deleteProject(Integer id) {
+        //判断权限
+        TokenModel tokenModel = TokenHandler.getUserThreadLocal();
+        if(tokenModel.getPermission()<2){
+            log.warn("用户: {},删除项目权限不足",tokenModel.getUsername());
+            throw new SipcBaseException(ResultCode.PERMISSION_WRONG,"no permission.");
+        }
+        log.info("管理员: {},试图删除项目",tokenModel.getUsername());
+        //删除项目
+        if(!this.removeById(id)){
+            log.warn("不存在id为{}的项目",id);
+            throw new SipcBaseException(ResultCode.INVALID_PARAM,"project is not exist.");
+        }
+        log.info("管理员: {},删除项目成功,id:{}",tokenModel.getUsername(),id);
+    }
+
+    public ProjectResult projectToProjectResponse(Project project){
+        ProjectResult projectResult =new ProjectResult();
+        projectResult.setId(project.getId());
+        projectResult.setName(project.getName());
+        projectResult.setDescription(project.getDescription());
+        return projectResult;
+    }
+
+    //设置项目无需多表查询信息
+    public Project projectRequestToProject(ProjectRequest projectRequest){
+        Project project=new Project();
+        project.setName(projectRequest.getName());
+        project.setDescription(projectRequest.getDescription());
+        project.setResearchId(projectRequest.getResearchId());
+        return project;
+    }
+
+    public List<ProjectUserMerge> projectMemberRequestToProjectUserMerge(List<ProjectMemberRequest> projectMemberRequestList, Integer projectId){
+        List<ProjectUserMerge> projectUserMergeList=new ArrayList<>();
+        for(ProjectMemberRequest temp: projectMemberRequestList){
+            if(temp.getUserId()==null){
+                continue;
+            }
+            ProjectUserMerge projectUserMerge=new ProjectUserMerge();
+            projectUserMerge.setProjectId(projectId);
+            projectUserMerge.setUserId(temp.getUserId());
+            projectUserMergeList.add(projectUserMerge);
+        }
+        return projectUserMergeList;
+    }
+    public List<ProjectImage> projectImageRequestToProjectImage(List<ProjectImageRequest> projectImageRequestList, Integer projectId){
+        List<ProjectImage> projectImageList=new ArrayList<>();
+        for(ProjectImageRequest temp:projectImageRequestList){
+            ProjectImage projectImage=new ProjectImage();
+            projectImage.setProjectId(projectId);
+            projectImage.setImageUrl(temp.getImageUrl());
+            projectImageList.add(projectImage);
+        }
+        return projectImageList;
+    }
+    @Service
+    @AllArgsConstructor
+    public static class ProjectImageServiceImpl extends ServiceImpl<ProjectImageMapper, ProjectImage> {
+    }
+    @Service
+    @AllArgsConstructor
+    public static class ProjectUserMergeServiceImpl extends ServiceImpl<ProjectUserMergeMapper, ProjectUserMerge> {
+    }
+}