从0开始手把手教你做极客园项目(五)——删除编辑功能实现

本文介绍了如何在极客园项目中实现文章的删除、编辑功能,包括删除操作的提示、数据回显、封面图片的处理以及更新文章内容的逻辑。作者通过详细步骤展示了从API接口到组件渲染的实现过程。
摘要由CSDN通过智能技术生成


前言

之前的文章当中已经把大部分功能实现,今天将讲解文章的删除和编辑,源码地址github
从0开始手把手教你做极客园项目(四)——文章列表功能实现
从0开始手把手教你做极客园项目(三)——发布文章功能实现
从0开始手把手教你做极客园项目(二)——首页功能实现
从0开始手把手教你做极客园项目(一)——登录功能实现

1.删除文章功能实现

首先添加点击删除按钮弹出提示框

{
      title: '操作',
      render: (data: data2) => {
        return (
          <Space size="middle">
            <Button type="primary" shape="circle" icon={<EditOutlined />} />
            <Popconfirm
              title="删除文章"
              description="确定删除文章吗?"
              onConfirm={() => confirm(data)}
              onCancel={cancel}
              okText="Yes"
              cancelText="No"
            >
              <Button
                type="primary"
                danger
                shape="circle"
                icon={<DeleteOutlined />}
              />
            </Popconfirm>
          </Space>
        )
      }
    }

添加data类型

interface data2 {
  comment_count: number,
  cover: object,
  id: string,
  like_count: number,
  pubdate: string,
  read_count: number,
  status: number,
  title: string
}

在apis里封装一个删除接口的函数

export function delArticleAPI(id: string) {
    return request({
        url: `/mp/articles/${id}`,
        method: 'DELETE',
    })
}

在组件中的confirm方法调用,通过一个异步函数在调用接口删除数据后再重新渲染界面

const confirm = async (data: data2) => {
    console.log(data)
    await delArticleAPI(data.id)
    setdata({
      ...reqdata
    })
  }

在这里插入图片描述
在这里插入图片描述

2.数据回显功能实现

给编辑文章按钮添加一个点击函数,在article/index.tsx里添加

const navigate = useNavigate()
<Button type="primary" shape="circle" icon={<EditOutlined />} onClick={() => navigate(`/publish?id=${data.id}`)} />

接着在发布文章的里面进行数据回显,在apis里封装一个函数,用于获取指定id的用户的信息

export function getArticleIdAPI(id: string) {
    return request({
        url: `/mp/articles/${id}`,
        method: 'GET'
    })
}

在publish里调用useSearchParams获取参数id,并且通过一个异步方法在组件渲染的时候判断id是否为空,不为空则调用接口获取数据,用form组件自带的setFieldsValue方法将数据回显过去

const [searchid] = useSearchParams()
  const articleId = searchid.get('id')
  console.log(articleId)
  useEffect(() => {
    async function getArticleidAPI() {
      if (articleId !== null) {
        const res = await getArticleIdAPI(articleId)
        form.setFieldsValue(res.data)
      }
    }
    getArticleidAPI()
  }, [])
  const [form] = Form.useForm()

在这里插入图片描述

3.回显封面图片

在原来的useEffect函数中添加利用展开运算将数据展开传送,并且设置type为数据的type存入状态里,将图片也遍历存入状态,

useEffect(() => {
    async function getArticleidAPI() {
      if (articleId !== null) {
        const res = await getArticleIdAPI(articleId)
        const data = res.data
        form.setFieldsValue({
          ...data,
          type: data.cover.type,
        })
        settype(data.cover.type)
        setImageList(data.cover.images.map((url: string) => {
          return { url }
        }))
      }
    }
    getArticleidAPI()
  }, [])

在加载图片的组件中添加filelist属性用于展示图片

 {type > 0 && <Upload
              listType="picture-card"//文件框外观样式
              showUploadList//控制显示上传列表
              action={'http://geek.itheima.net/v1_0/upload'}
              onChange={onUploadChange}
              name="image"
              maxCount={type}
              fileList={imageList}
            >
              <div style={{ marginTop: 8 }}>
                <PlusOutlined />
              </div>
            </Upload>}

在这里插入图片描述

4.更新文章内容

当用户编辑完文章后,点击发布按钮在文章列表当中更新,跟发布新文章差不多的逻辑,先在apis里封装一个更新函数

export function upArticleAPI(formdata: article2) {
    return request({
        url: `/mp/articles/${formdata.id}?draft=false`,
        method: 'PUT',
        data: formdata
    })
}

与接口类型article相比,只多了一个id属性,所以通过接口继承的方式实现

export interface article2 extends article {
  id: string
}

在原来发布文章时传递的数据添加一个判断条件分别执行新增和更新

   const reqdata = {
      title,
      content,
      cover: {
        type,
        images
      },
      channel_id
    }
    if (imageList.length !== type) { return message.warning('封面类型和图片不匹配') }
    else if (articleId === null) { subArticleAPI(reqdata) }
    else { upArticleAPI({ ...reqdata, id: articleId }) }
  }

总结

本次实现了文章的编辑和删除的功能,整个极客园项目也就差不多结束了,还有一些细节上的更新和优化我会推送到github供小伙伴们参考,明天将会详细讲解项目的打包优化

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
《大鱼吃小鱼》是一款简单而有趣的游戏,适合初学者学习Java游戏开发。下面我将手把手教你如何用Java开发这款游戏,并提供相应的源码。 步骤一:创建游戏窗口和游戏主类 首先,我们需要创建游戏的窗口,可以使用Java提供的Swing框架来实现。创建一个GameWindow类,继承JFrame类,并在构造方法中设置窗口的基本属性。 步骤二:添加游戏画布 在GameWindow类中,创建一个GameCanvas类,继承JPanel类,并重写paintComponent()方法,在此方法中实现游戏场景的绘制,包括大鱼、小鱼和其他游戏元素。 步骤三:添加游戏逻辑 在GameWindow类中,添加游戏逻辑的处理方法,包括大鱼的移动、小鱼的生成和碰撞检测等。 步骤四:添加游戏控制 在GameWindow类中,添加游戏控制的方法,包括键盘事件的处理和游戏状态的切换等。 步骤:运行游戏 在GameWindow类中,添加一个main()方法,创建游戏窗口对象,并启动游戏循环。 以上是《大鱼吃小鱼》游戏的基本开发步骤,下面提供相应的源码供参考: ```java import javax.swing.*; import java.awt.*; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; public class GameWindow extends JFrame implements KeyListener{ private GameCanvas gameCanvas; private boolean isRunning; public GameWindow(){ super("大鱼吃小鱼"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); addKeyListener(this); gameCanvas = new GameCanvas(); add(gameCanvas, BorderLayout.CENTER); isRunning = true; } public void start(){ while(isRunning){ update(); gameCanvas.repaint(); try{ Thread.sleep(10); }catch(InterruptedException e){ e.printStackTrace(); } } } public void update(){ // 游戏逻辑更新 } public void keyPressed(KeyEvent e){ // 键盘按下事件处理 } public void keyReleased(KeyEvent e){ // 键盘释放事件处理 } public void keyTyped(KeyEvent e){ // 键盘输入事件处理 } public static void main(String[] args){ GameWindow gameWindow = new GameWindow(); gameWindow.setVisible(true); gameWindow.start(); } } class GameCanvas extends JPanel{ protected void paintComponent(Graphics g){ super.paintComponent(g); // 游戏场景绘制 } } ``` 通过以上源码和步骤,我们可以实现《大鱼吃小鱼》游戏的基本开发,通过添加更多的游戏逻辑和个性化设计,可以进一步完善这款游戏。希望对您有所帮助!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值