From dbce939fc752203c1821a9b6667a149611833365 Mon Sep 17 00:00:00 2001 From: wangyan Date: Wed, 25 Feb 2026 14:55:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(notice):=20=E6=96=B0=E5=A2=9E=E5=85=AC?= =?UTF-8?q?=E5=91=8A=E9=98=85=E8=AF=BB=E8=AE=B0=E5=BD=95=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重构公告阅读状态接口为公告阅读记录列表接口 - 新增公告阅读记录模块,包含完整的CRUD操作 - 在公告列表页面集成阅读记录查看功能 - 实现公告阅读状态的表格展示和筛选功能 - 新增公告阅读记录详情页面和回复功能 - 添加公告阅读记录相关的命名空间定义 --- src/api/Notice/index.js | 4 +- src/api/NoticeReadRecord/index.js | 35 +++++ src/enumerate/namespace/index.js | 1 + src/pages/Container/Notice/List/index.js | 40 ++++-- .../Container/NoticeReadRecord/List/index.js | 61 ++++++++ .../Container/NoticeReadRecord/View/index.js | 131 ++++++++++++++++++ src/pages/Container/NoticeReadRecord/index.js | 5 + 7 files changed, 264 insertions(+), 13 deletions(-) create mode 100644 src/api/NoticeReadRecord/index.js create mode 100644 src/pages/Container/NoticeReadRecord/List/index.js create mode 100644 src/pages/Container/NoticeReadRecord/View/index.js create mode 100644 src/pages/Container/NoticeReadRecord/index.js diff --git a/src/api/Notice/index.js b/src/api/Notice/index.js index 81a8626..47d6a6b 100644 --- a/src/api/Notice/index.js +++ b/src/api/Notice/index.js @@ -24,7 +24,7 @@ export const noticeInfo = declareRequest( "noticeLoading", "Get > /appmenu/notice/{id}", ); -export const noticeReadStatus = declareRequest( +export const noticeReadRecordList = declareRequest( "noticeLoading", - "Post > @/appmenu/notice/noticeReadStatus", + "Post > @/appmenu/notice/noticeReadRecordList", ); diff --git a/src/api/NoticeReadRecord/index.js b/src/api/NoticeReadRecord/index.js new file mode 100644 index 0000000..c6d775c --- /dev/null +++ b/src/api/NoticeReadRecord/index.js @@ -0,0 +1,35 @@ +import { declareRequest } from "@cqsjjb/jjb-dva-runtime"; + +export const noticeReadRecordList = declareRequest( + "noticeReadRecordLoading", + "Post > @/appmenu/noticeReadRecord/list", +); +export const noticeReadRecordAdd = declareRequest( + "noticeReadRecordLoading", + "Post > @/appmenu/noticeReadRecord/save", +); +export const noticeReadRecordEdit = declareRequest( + "noticeReadRecordLoading", + "Put > @/appmenu/noticeReadRecord/edit", +); +export const noticeReadRecordDelete = declareRequest( + "noticeReadRecordLoading", + "Delete > @/appmenu/noticeReadRecord/{id}", +); +export const noticeReadRecordBatchDelete = declareRequest( + "noticeReadRecordLoading", + "Delete > @/appmenu/noticeReadRecord/ids/{ids}", +); +export const noticeReadRecordInfo = declareRequest( + "noticeReadRecordLoading", + "Get > /appmenu/noticeReadRecord/{id}", +); +export const noticeInfo = declareRequest( + "noticeReadRecordLoading", + "Get > /appmenu/notice/noticeContentInfo/{id}", +); + +export const noticeReadRecordReply = declareRequest( + "noticeReadRecordLoading", + "Put > @/appmenu/noticeReadRecord/reply", +); diff --git a/src/enumerate/namespace/index.js b/src/enumerate/namespace/index.js index 991c89d..abf474c 100644 --- a/src/enumerate/namespace/index.js +++ b/src/enumerate/namespace/index.js @@ -7,4 +7,5 @@ import { defineNamespace } from "@cqsjjb/jjb-dva-runtime"; export const NS_GLOBAL = defineNamespace("global"); export const NS_APP_MENU = defineNamespace("appMenu"); export const NS_NOTICE = defineNamespace("Notice"); +export const NS_NoticeReadRecord = defineNamespace("NoticeReadRecord"); export const NS_CORPINFO = defineNamespace("corpInfo"); diff --git a/src/pages/Container/Notice/List/index.js b/src/pages/Container/Notice/List/index.js index 51a7f6f..d1bbf46 100644 --- a/src/pages/Container/Notice/List/index.js +++ b/src/pages/Container/Notice/List/index.js @@ -82,7 +82,7 @@ function List(props) { { - setCurrentId(record.id); + setCurrentId(record.noticeId); setViewModalVisible(true); }} > @@ -145,7 +145,7 @@ function List(props) { loading={props.noticeLoading} getData={getData} currentId={currentId} - noticeReadStatus={props["noticeReadStatus"]} + noticeReadRecordList={props["noticeReadRecordList"]} onCancel={() => { setViewModalVisible(false); setCurrentId(""); @@ -157,8 +157,12 @@ function List(props) { } function ViewModalComponent(props) { const [form] = Form.useForm(); - const { tableProps, getData } = useTable(props["noticeReadStatus"], { + const { tableProps, getData } = useTable(props["noticeReadRecordList"], { form, + params: { + noticeId: props.currentId, + pageSize: 10, + }, }); const onCancel = () => { @@ -170,26 +174,40 @@ function ViewModalComponent(props) { maskClosable={false} open={props.open} title="查看" - width={800} - onOk={form.submit} + width={1000} + footer={null} onCancel={onCancel} loading={props.loading} - > { + if (!record.readStatus) + return ""; + const scopeMap = { 0: "未读", 1: "已读" }; + return scopeMap[record.readStatus]; + }, + }, { dataIndex: "readTime", title: "阅读时间" }, { dataIndex: "replyContent", title: "回复内容" }, ]} diff --git a/src/pages/Container/NoticeReadRecord/List/index.js b/src/pages/Container/NoticeReadRecord/List/index.js new file mode 100644 index 0000000..45273c9 --- /dev/null +++ b/src/pages/Container/NoticeReadRecord/List/index.js @@ -0,0 +1,61 @@ +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { Button, Form, Space } from "antd"; +import Page from "zy-react-library/components/Page"; +import Search from "zy-react-library/components/Search/index"; +import Table from "zy-react-library/components/Table/index"; +import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; +import useTable from "zy-react-library/hooks/useTable"; +import { NS_NoticeReadRecord } from "~/enumerate/namespace"; + +function NoticeReadRecord(props) { + const [form] = Form.useForm(); + const { tableProps, getData } = useTable(props["noticeReadRecordList"], { + form, + }); + return ( + + +
( +
{record.readStatus === "1" ? : record.readStatus === "0" ? : }
+ ) }, + { + title: "操作", + align: "center", + width: 200, + render: (_, record) => ( + + + + ), + }, + ]} + {...tableProps} + /> + + ); +} + +export default Connect([NS_NoticeReadRecord], true)(NoticeReadRecord); diff --git a/src/pages/Container/NoticeReadRecord/View/index.js b/src/pages/Container/NoticeReadRecord/View/index.js new file mode 100644 index 0000000..ac3e7fa --- /dev/null +++ b/src/pages/Container/NoticeReadRecord/View/index.js @@ -0,0 +1,131 @@ +import { Connect } from "@cqsjjb/jjb-dva-runtime"; +import { + Button, + Form, + message, + Modal, + Typography, +} from "antd"; +import { useEffect, useState } from "react"; +import FormBuilder from "zy-react-library/components/FormBuilder"; +import Page from "zy-react-library/components/Page"; +import { FORM_ITEM_RENDER_ENUM } from "zy-react-library/enum/formItemRender"; +import useGetUrlQuery from "zy-react-library/hooks/useGetUrlQuery"; +import { NS_NoticeReadRecord } from "~/enumerate/namespace"; + +function NoticeReadRecordView(props) { + const { Title, Text } = Typography; + const queryParams = useGetUrlQuery(); + const [noticeReadRecordInfo, setNoticeReadRecordInfo] = useState({}); + const [replyModalVisible, setReplyModalVisible] = useState(false); + const [form] = Form.useForm(); + const getData = async () => { + const { data } = await props["noticeInfo"]({ id: queryParams.id }); + setNoticeReadRecordInfo(data); + // 如果未查看,则插入查看记录 + if (data.readStatus !== "1") { + const res = await props["noticeReadRecordAdd"]({ noticeId: queryParams.id }); + if (!res.success) { + message.error("记录阅读状态失败,请重新阅读"); + } + else { + setNoticeReadRecordInfo(prev => ({ + ...prev, + noticeReadId: res.data, + })); + } + } + }; + + useEffect(() => { + getData(); + }, []); + + const handleReply = () => { + setReplyModalVisible(true); + }; + + const handleReplySubmit = async (values) => { + const { success } = await props["noticeReadRecordReply"]({ + noticeReadId: noticeReadRecordInfo.noticeReadId, + replyContent: values.replyContent, + }); + if (success) { + message.success("回复成功"); + setReplyModalVisible(false); + form.resetFields(); + window.history.back(); + } + }; + + return ( + + 回复 + + ) + } + > +
+ + {noticeReadRecordInfo.title} + + +
+ + 发布时间: + {noticeReadRecordInfo.publishTime} + +
+ +
+
+
+
+ + { + setReplyModalVisible(false); + form.resetFields(); + }} + onOk={() => form.submit()} + confirmLoading={props.noticeReadRecordReplyLoading} + > + + + + ); +} + +export default Connect([NS_NoticeReadRecord], true)(NoticeReadRecordView); diff --git a/src/pages/Container/NoticeReadRecord/index.js b/src/pages/Container/NoticeReadRecord/index.js new file mode 100644 index 0000000..3271758 --- /dev/null +++ b/src/pages/Container/NoticeReadRecord/index.js @@ -0,0 +1,5 @@ +function AppMenu(props) { + return props.children; +} + +export default AppMenu;