package com.example.springboot.controller;

import com.example.springboot.entity.Feedback;
import com.example.springboot.service.FeedbackService;
import com.example.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.security.Principal;
import java.util.List;

@RestController
@RequestMapping("/feedback")
public class FeedbackController {


private final FeedbackService feedbackService;

@Autowired
public FeedbackController(FeedbackService feedbackService) {
    this.feedbackService = feedbackService;
}

/**
 * 用户提交反馈
 * 前端传 feedbackType, phone, content
 * userId可从Principal或token中取出，模拟这里传入
 */
@PostMapping("/user/add")
public String addFeedback(@RequestBody Feedback feedback, Principal principal) {
    User user = getCurrentUser(principal);
    if(user == null) {
        return "请先登录";
    }
    feedback.setUserId(user.getId());
    int result = feedbackService.addFeedback(feedback);
    return result > 0 ? "反馈提交成功" : "反馈提交失败";
}

/**
 * 用户查询自己的反馈列表
 */
@GetMapping("/user/list")
public List<Feedback> getUserFeedback(Principal principal) {
    User user = getCurrentUser(principal);
    if(user == null) {
        return null;
    }
    return feedbackService.getFeedbackByUser(user.getId());
}

/**
 * 用户删除自己反馈
 */
@DeleteMapping("/user/delete/{id}")
public String deleteUserFeedback(@PathVariable Integer id, Principal principal) {
    User user = getCurrentUser(principal);
    if(user == null) {
        return "请先登录";
    }
    int result = feedbackService.deleteFeedback(id, user.getId());
    return result > 0 ? "删除成功" : "删除失败，可能不是您的反馈或反馈不存在";
}

/**
 * 管理员查询所有反馈
 */
@GetMapping("/admin/list")
public List<Feedback> getAllFeedback(Principal principal) {
    User user = getCurrentUser(principal);
    if(user == null || !"admin1".equalsIgnoreCase(user.getUsername())) {
        return null; // 权限不足
    }
    return feedbackService.getAllFeedback();
}

/**
 * 管理员回复反馈
 */
@PostMapping("/admin/reply/{id}")
public String replyFeedback(@PathVariable Integer id, @RequestParam String reply, Principal principal) {
    User user = getCurrentUser(principal);
    if(user == null || !"admin1".equalsIgnoreCase(user.getUsername())) {
        return "权限不足";
    }
    int result = feedbackService.replyFeedback(id, reply);
    return result > 0 ? "回复成功" : "回复失败";
}

/**
 * 获取当前登录用户（模拟）
 * 你的User类和Security等自行调整
 */
private User getCurrentUser(Principal principal) {
    if(principal == null) {
        return null;
    }
    // 这里模拟代码，要结合你的UserService实现真实获取
    String username = principal.getName();
    User user = new User();
    if ("admin1".equalsIgnoreCase(username)) {
        user.setId(0);
        user.setUsername("admin1");
        user.setPassword(""); // 不用密码
    } else {
        // 模拟普通用户id从数据库获取
        user.setId(1);
        user.setUsername(username);
    }
    return user;
}
}
package com.example.springboot.mapper;

import com.example.springboot.entity.Feedback;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface FeedbackMapper {


// 插入反馈
int insertFeedback(Feedback feedback);

// 根据id删除反馈
int deleteById(@Param("id") Integer id);

// 查询指定用户自己的反馈列表
List<Feedback> selectByUserId(@Param("userId") Integer userId);

// 查询所有反馈（管理员用）
List<Feedback> selectAll();

// 根据id查询反馈详情
Feedback selectById(@Param("id") Integer id);

// 管理员回复更新反馈
int updateReply(@Param("id") Integer id, @Param("reply") String reply);
}
package com.example.springboot.service;

import com.example.springboot.entity.Feedback;
import com.example.springboot.mapper.FeedbackMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class FeedbackService {


private final FeedbackMapper feedbackMapper;

public FeedbackService(FeedbackMapper feedbackMapper) {
    this.feedbackMapper = feedbackMapper;
}

/**
 * 用户添加反馈
 */
@Transactional
public int addFeedback(Feedback feedback) {
    return feedbackMapper.insertFeedback(feedback);
}

/**
 * 用户删除自己的反馈
 */
@Transactional
public int deleteFeedback(Integer id, Integer userId) {
    Feedback feedback = feedbackMapper.selectById(id);
    if(feedback == null) {
        return 0;
    }
    // 只有反馈属于该用户或管理员可以删除
    if(feedback.getUserId().equals(userId)) {
        return feedbackMapper.deleteById(id);
    }
    return 0;
}

/**
 * 查询指定用户的反馈
 */
public List<Feedback> getFeedbackByUser(Integer userId) {
    return feedbackMapper.selectByUserId(userId);
}

/**
 * 管理员查询所有反馈
 */
public List<Feedback> getAllFeedback() {
    return feedbackMapper.selectAll();
}

/**
 * 管理员回复反馈
 */
@Transactional
public int replyFeedback(Integer id, String reply) {
    return feedbackMapper.updateReply(id, reply);
}

/**
 * 根据ID查询反馈详情
 */
public Feedback getFeedbackById(Integer id) {
    return feedbackMapper.selectById(id);
}
}


不用模拟，直接帮我生成vue3前端页面，两个vue，一个是adminfeedback.vue，一个是userfeedback.vue。用户在表单下拉选择反馈类型（系统故障，优化意见），输入自己的手机号码，然后在文本框里写入自己的建议。用户能看到自己提出的意见回复。用户可以删除，查询自己的反馈。

管理员能看到是哪个用户提的建议，并给对应的反馈进行回复。管理员可以查询自己给用户对应的反馈
能看到自己的回复
统一读取当前登录用户 ID
用这个方法，表单自动记录用户信息：

const userId = localStorage.getItem('userId')

if (!userId) {
ElMessage.error('请先登录')
router.push('/login')
}

await axios.post('http://localhost:8080/today-plan/add', {
userId,
wordIds
})