diff --git a/src/main/java/com/pt5/pthouduan/controller/ActivityController.java b/src/main/java/com/pt5/pthouduan/controller/ActivityController.java
new file mode 100644
index 0000000..5a60a24
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/controller/ActivityController.java
@@ -0,0 +1,160 @@
+package com.pt5.pthouduan.controller;
+
+import com.pt5.pthouduan.entity.Activity;
+import com.pt5.pthouduan.service.ActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 活动控制器
+ * </p>
+ *
+ * 功能：增删改查活动公告（支持上传图片）
+ *
+ * @author ym
+ * @since 2025-05-16
+ */
+@CrossOrigin(origins = {"http://localhost:5173", "http://localhost:3000"})
+@Controller
+@RequestMapping("/activity")
+public class ActivityController {
+
+    @Autowired
+    private ActivityService activityService;
+
+    // 获取所有 is_show == 0 的活动标题和图片（活动预览）
+    @GetMapping("/preview")
+    @ResponseBody
+    public List<Activity> getVisibleActivityPreviews() {
+        List<Activity> allVisible = activityService.findByIsShow(0);
+        return allVisible.stream().map(activity -> {
+            Activity preview = new Activity();
+            preview.setActivityid(activity.getActivityid());
+            preview.setContent(activity.getContent());
+            preview.setTitle(activity.getTitle());
+            preview.setAward(activity.getAward());
+            preview.setTime(activity.getTime());
+            preview.setPhoto(activity.getPhoto());
+            return preview;
+        }).collect(Collectors.toList());
+    }
+
+    // 获取所有 is_show == 0 的完整活动信息
+    @GetMapping("/full")
+    @ResponseBody
+    public List<Activity> getVisibleActivities() {
+        return activityService.findByIsShow(0);
+    }
+
+    // 创建新的公告（支持图片上传）
+    @PostMapping("/create")
+    @ResponseBody
+    public boolean createActivity(
+            @RequestParam("title") String title,
+            @RequestParam("content") String content,
+            @RequestParam(value = "photo", required = false) MultipartFile photoFile,
+            @RequestParam(value = "isShow", required = false, defaultValue = "0") Integer isShow,
+            @RequestParam(value = "award", required = false, defaultValue = "0") Integer award
+    ) {
+        Activity activity = new Activity();
+        activity.setTitle(title);
+        activity.setContent(content);
+        activity.setIs_show(isShow);
+        activity.setAward(award);
+        activity.setTime(LocalDateTime.now()); // 设置当前时间
+
+        // 处理图片上传
+        if (photoFile != null && !photoFile.isEmpty()) {
+            String uploadDir = "D:/activityuploads/";
+            File dir = new File(uploadDir);
+            if (!dir.exists()) dir.mkdirs();
+
+            String fileName = UUID.randomUUID() + "_" + photoFile.getOriginalFilename();
+            File dest = new File(uploadDir + fileName);
+            try {
+                photoFile.transferTo(dest);
+                // 设置图片访问路径（请确保 /images 映射到了 uploadDir）
+                activity.setPhoto("/activity/" + fileName);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+
+        return activityService.save(activity);
+    }
+
+
+    // 删除公告（根据ID）
+    @DeleteMapping("/delete/{id}")
+    @ResponseBody
+    public boolean deleteActivity(@PathVariable Integer id) {
+        return activityService.removeById(id);
+    }
+
+    // 获取所有活动（无论展示状态）
+    @GetMapping("/all")
+    @ResponseBody
+    public List<Activity> getAllActivities() {
+        // 假设 activityService 有 list() 方法，返回所有活动
+        return activityService.list();
+    }
+
+    //根据题目搜索公告
+    @GetMapping("/search")
+    @ResponseBody
+    public List<Activity> searchActivitiesByTitle(@RequestParam("title") String title) {
+        return activityService.searchByTitle(title);
+    }
+
+    // 修改公告（根据ID）
+    @PutMapping("/update")
+    @ResponseBody
+    public boolean updateActivity(
+            @RequestParam("activityid") Integer id,
+            @RequestParam("title") String title,
+            @RequestParam("content") String content,
+            @RequestParam(value = "photo", required = false) MultipartFile photoFile,
+            @RequestParam(value = "isShow", required = false, defaultValue = "0") Integer isShow,
+            @RequestParam(value = "award", required = false, defaultValue = "0") Integer award
+    ) {
+        Activity activity = activityService.getById(id);
+        if (activity == null) {
+            return false;
+        }
+
+        activity.setTitle(title);
+        activity.setContent(content);
+        activity.setIs_show(isShow);
+        activity.setAward(award);
+
+        // 上传新图片（可选）
+        if (photoFile != null && !photoFile.isEmpty()) {
+            String uploadDir = "D:/activityuploads/";
+            File dir = new File(uploadDir);
+            if (!dir.exists()) dir.mkdirs();
+
+            String fileName = UUID.randomUUID() + "_" + photoFile.getOriginalFilename();
+            File dest = new File(uploadDir + fileName);
+            try {
+                photoFile.transferTo(dest);
+                activity.setPhoto("/activity/" + fileName);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return false;
+            }
+        }
+
+        return activityService.updateById(activity);
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/entity/Activity.java b/src/main/java/com/pt5/pthouduan/entity/Activity.java
new file mode 100644
index 0000000..089ecfa
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/entity/Activity.java
@@ -0,0 +1,110 @@
+package com.pt5.pthouduan.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author 杨蔓
+ * @since 2025-05-16
+ */
+@TableName("activity")
+public class Activity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId("activityid")
+    private Integer activityid;
+
+    private String title;
+
+    private String content;
+
+    private String photo;
+
+    private LocalDateTime time;
+
+    private Integer is_show;
+
+    private Integer award;
+
+
+    public Integer getActivityid() {
+        return activityid;
+    }
+
+    public void setActivityid(Integer activityid) {
+        this.activityid = activityid;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getPhoto() {//获取标签
+        return photo;
+    }
+
+    public void setPhoto(String photo) {
+        this.photo = photo;
+    }
+
+    public LocalDateTime getTime() {
+        return time;
+    }
+
+    public void setTime(LocalDateTime time) {
+        this.time = time;
+    }
+
+    public Integer getIs_show() {
+        return is_show;
+    }
+
+    public void setIs_show(Integer is_show) {
+        this.is_show = is_show;
+    }
+
+    public Integer getAward() {
+        return award;
+    }
+
+    public void setAward(Integer award) {
+        this.award = award;
+    }
+
+
+
+
+    @Override
+    public String toString() {
+        return "Activity{" +
+                "activityid=" + activityid +
+                ", title=" + title  +
+                ", content=" + content +
+                ", photo=" + photo +
+                ", time=" + time +
+                ", is_show=" + is_show +
+                ", award=" + award +
+                '}';
+    }
+}
diff --git a/src/main/java/com/pt5/pthouduan/mapper/ActivityMapper.java b/src/main/java/com/pt5/pthouduan/mapper/ActivityMapper.java
new file mode 100644
index 0000000..c94aeb0
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/mapper/ActivityMapper.java
@@ -0,0 +1,38 @@
+package com.pt5.pthouduan.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pt5.pthouduan.entity.Activity;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  活动 Mapper 接口
+ * </p>
+ *
+ * 功能：增、删、改、查（按是否展示）
+ *
+ * 作者：杨蔓
+ * @since 2025-05-16
+ */
+@Mapper
+public interface ActivityMapper extends BaseMapper<Activity> {
+
+    // 根据是否展示状态查询活动列表（0：展示，1：隐藏）
+    List<Activity> selectByIsShow(@Param("is_show") Integer isShow);
+
+    // 插入新的活动
+    int insert(Activity activity);
+
+    // 根据活动ID删除活动
+    int deleteById(@Param("activityid") Integer activityid);
+
+    // 根据活动ID更新活动内容
+    int updateById(Activity activity);
+
+    // ✅ 新增：根据活动ID查询活动详情
+    Activity selectById(@Param("activityid") Integer activityid);
+
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/ActivityService.java b/src/main/java/com/pt5/pthouduan/service/ActivityService.java
new file mode 100644
index 0000000..67b51e1
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/ActivityService.java
@@ -0,0 +1,40 @@
+package com.pt5.pthouduan.service;
+
+import com.pt5.pthouduan.entity.Activity;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 活动服务接口
+ * </p>
+ *
+ * 功能：增、删、改、查（按是否显示状态）
+ * </p>
+ *
+ * @author ym
+ * @since 2025-05-16
+ */
+public interface ActivityService {
+
+    // 根据 is_show 状态查询活动列表（0：显示，1：隐藏等）
+    List<Activity> findByIsShow(Integer isShow);
+
+    // 创建活动
+    boolean save(Activity activity);
+
+    // 根据ID删除活动
+    boolean removeById(Integer activityid);
+
+    // 根据ID更新活动
+    boolean updateById(Activity activity);
+
+    // 根据ID获取活动
+    Activity getById(Integer activityid);
+
+    // 新增：获取所有活动（不分是否显示）
+    List<Activity> list();
+
+    //根据题目获得公告
+    List<Activity> searchByTitle(String title);
+}
diff --git a/src/main/java/com/pt5/pthouduan/service/impl/ActivityServiceImpl.java b/src/main/java/com/pt5/pthouduan/service/impl/ActivityServiceImpl.java
new file mode 100644
index 0000000..3173589
--- /dev/null
+++ b/src/main/java/com/pt5/pthouduan/service/impl/ActivityServiceImpl.java
@@ -0,0 +1,67 @@
+package com.pt5.pthouduan.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.pt5.pthouduan.entity.Activity;
+import com.pt5.pthouduan.mapper.ActivityMapper;
+import com.pt5.pthouduan.service.ActivityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 活动服务实现类
+ * </p>
+ *
+ * 实现了活动的增删改查逻辑
+ * </p>
+ *
+ * @author ym
+ * @since 2025-05-16
+ */
+@Service
+public class ActivityServiceImpl implements ActivityService {
+
+    @Autowired
+    private ActivityMapper activityMapper;
+
+    @Override
+    public List<Activity> findByIsShow(Integer isShow) {
+        return activityMapper.selectByIsShow(isShow);
+    }
+
+    @Override
+    public boolean save(Activity activity) {
+        return activityMapper.insert(activity) > 0;
+    }
+
+    @Override
+    public boolean removeById(Integer activityid) {
+        return activityMapper.deleteById(activityid) > 0;
+    }
+
+    @Override
+    public boolean updateById(Activity activity) {
+        return activityMapper.updateById(activity) > 0;
+    }
+
+    @Override
+    public Activity getById(Integer activityid) {
+        return activityMapper.selectById(activityid);
+    }
+
+    // 新增：查询所有活动（不分是否显示）
+    @Override
+    public List<Activity> list() {
+        return activityMapper.selectList(null);
+    }
+
+    @Override
+    public List<Activity> searchByTitle(String title) {
+        QueryWrapper<Activity> queryWrapper = new QueryWrapper<>();
+        // 模糊匹配 title 字段
+        queryWrapper.like("title", title);
+        return activityMapper.selectList(queryWrapper);
+    }
+}
diff --git a/src/main/resources/mapper/ActivityMapper.xml b/src/main/resources/mapper/ActivityMapper.xml
new file mode 100644
index 0000000..84cad7a
--- /dev/null
+++ b/src/main/resources/mapper/ActivityMapper.xml
@@ -0,0 +1,60 @@
+<?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.pt5.pthouduan.mapper.ActivityMapper">
+
+    <!-- 插入活动 -->
+    <insert id="insert" parameterType="com.pt5.pthouduan.entity.Activity"
+            useGeneratedKeys="true" keyProperty="activityid" keyColumn="activityid">
+        INSERT INTO activity (
+            title,
+            content,
+            photo,
+            time,
+            is_show,
+            award
+        ) VALUES (
+                     #{title},
+                     #{content},
+                     #{photo},
+                     #{time},
+                     #{is_show},
+                     #{award}
+                 )
+    </insert>
+
+    <!-- 删除活动 -->
+    <delete id="deleteById" parameterType="int">
+        DELETE FROM activity WHERE activityid = #{activityid}
+    </delete>
+
+    <!-- 更新活动 -->
+    <update id="updateById" parameterType="com.pt5.pthouduan.entity.Activity">
+        UPDATE activity
+        SET
+            title = #{title},
+            content = #{content},
+            photo = #{photo},
+            time = #{time},
+            is_show = #{is_show},
+            award = #{award}
+        WHERE activityid = #{activityid}
+    </update>
+
+    <!-- 查询所有 is_show 为指定值的活动 -->
+    <select id="selectByIsShow" resultType="com.pt5.pthouduan.entity.Activity">
+        SELECT *
+        FROM activity
+        WHERE is_show = #{is_show}
+        ORDER BY time DESC
+    </select>
+
+    <!-- ✅ 新增：根据活动ID查询活动详情 -->
+    <select id="selectById" parameterType="int" resultType="com.pt5.pthouduan.entity.Activity">
+        SELECT *
+        FROM activity
+        WHERE activityid = #{activityid}
+    </select>
+
+</mapper>
