From 1e939201629338f6c1488ba5f7e95f868912a27f Mon Sep 17 00:00:00 2001
From: jianghao <332515344@qq.com>
Date: Wed, 31 Dec 2025 14:30:03 +0800
Subject: [PATCH] =?UTF-8?q?story=E6=93=8D=E4=BD=9C=E6=9D=83=E9=99=90?=
=?UTF-8?q?=E9=99=90=E5=88=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/TimelineItem/TimelineItem.tsx | 12 +++++++-----
.../story/components/TimelineItemDrawer.tsx | 14 +++++++-------
src/pages/story/data.d.ts | 3 ++-
src/pages/story/detail.tsx | 10 +++++++---
src/pages/story/index.tsx | 12 ++++++++----
src/pages/story/utils/utils.ts | 18 ++++++++++++++++++
6 files changed, 49 insertions(+), 20 deletions(-)
create mode 100644 src/pages/story/utils/utils.ts
diff --git a/src/pages/story/components/TimelineItem/TimelineItem.tsx b/src/pages/story/components/TimelineItem/TimelineItem.tsx
index af478da..d6da5ae 100644
--- a/src/pages/story/components/TimelineItem/TimelineItem.tsx
+++ b/src/pages/story/components/TimelineItem/TimelineItem.tsx
@@ -12,13 +12,13 @@ import useStyles from './index.style';
// 格式化时间数组为易读格式
const formatTimeArray = (time: string | number[] | undefined): string => {
if (!time) return '';
-
+
// 如果是数组格式 [2025, 12, 23, 8, 55, 39]
if (Array.isArray(time)) {
const [year, month, day, hour, minute, second] = time;
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;
}
-
+
// 如果已经是字符串格式,直接返回
return String(time);
};
@@ -27,7 +27,8 @@ const TimelineItem: React.FC<{
item: StoryItem;
handleOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
refresh: () => void;
-}> = ({ item, handleOption, refresh }) => {
+ disableEdit?: boolean;
+}> = ({ item, handleOption, refresh, disableEdit }) => {
const { styles } = useStyles();
const intl = useIntl();
const [expanded, setExpanded] = useState(false);
@@ -97,7 +98,7 @@ const TimelineItem: React.FC<{
}}
extra={
- {showActions && (
+ {showActions && !disableEdit && (
<>
);
};
-export default TimelineItem;
\ No newline at end of file
+export default TimelineItem;
diff --git a/src/pages/story/components/TimelineItemDrawer.tsx b/src/pages/story/components/TimelineItemDrawer.tsx
index a6e5d7e..d452830 100644
--- a/src/pages/story/components/TimelineItemDrawer.tsx
+++ b/src/pages/story/components/TimelineItemDrawer.tsx
@@ -10,13 +10,13 @@ import React, { useEffect } from 'react';
// 格式化时间数组为易读格式
const formatTimeArray = (time: string | number[] | undefined): string => {
if (!time) return '';
-
+
// 如果是数组格式 [2025, 12, 23, 8, 55, 39]
if (Array.isArray(time)) {
const [year, month, day, hour, minute, second] = time;
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;
}
-
+
// 如果已经是字符串格式,直接返回
return String(time);
};
@@ -27,6 +27,7 @@ interface Props {
setOpen: React.Dispatch
>;
handleDelete: () => void;
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
+ disableEdit?: boolean;
}
const TimelineItemDrawer: React.FC = (props) => {
@@ -55,7 +56,7 @@ const TimelineItemDrawer: React.FC = (props) => {
// 格式化日期显示
const formatDate = (dateString: string | number[] | undefined) => {
if (!dateString) return '';
-
+
const formattedTime = formatTimeArray(dateString);
const date = new Date(formattedTime);
return date.toLocaleString('zh-CN', {
@@ -99,7 +100,7 @@ const TimelineItemDrawer: React.FC = (props) => {
}
- footer={
+ footer={ {disableEdit ??
- }
- >
+ >}}
描述
@@ -204,4 +204,4 @@ const TimelineItemDrawer: React.FC
= (props) => {
);
};
-export default TimelineItemDrawer;
\ No newline at end of file
+export default TimelineItemDrawer;
diff --git a/src/pages/story/data.d.ts b/src/pages/story/data.d.ts
index ed5ab60..ceb6994 100644
--- a/src/pages/story/data.d.ts
+++ b/src/pages/story/data.d.ts
@@ -40,6 +40,7 @@ export interface StoryType {
itemCount: number,
updatedId?: string;
updateTime?: string;
+ storyTime: string;
logo?: string;
}
export interface BaseResponse {
@@ -90,4 +91,4 @@ export interface TimelineEvent {
subItems?: TimelineEvent[];
}
-export type PermissionType = ''
\ No newline at end of file
+export type PermissionType = ''
diff --git a/src/pages/story/detail.tsx b/src/pages/story/detail.tsx
index e70fec6..b99b2b0 100644
--- a/src/pages/story/detail.tsx
+++ b/src/pages/story/detail.tsx
@@ -12,17 +12,18 @@ import { useParams } from 'react-router';
import AutoSizer from 'react-virtualized-auto-sizer';
import { VariableSizeList as List } from 'react-window';
import './index.css';
+import {judgePermission} from "@/pages/story/utils/utils";
// 格式化时间数组为易读格式
const formatTimeArray = (time: string | number[] | undefined): string => {
if (!time) return '';
-
+
// 如果是数组格式 [2025, 12, 23, 8, 55, 39]
if (Array.isArray(time)) {
const [year, month, day, hour, minute, second] = time;
return `${year}-${String(month).padStart(2, '0')}-${String(day).padStart(2, '0')} ${String(hour).padStart(2, '0')}:${String(minute).padStart(2, '0')}:${String(second).padStart(2, '0')}`;
}
-
+
// 如果已经是字符串格式,直接返回
return String(time);
};
@@ -274,6 +275,7 @@ const Index = () => {
setCurrentOption(option);
setOpenAddItemModal(true);
}}
+ disableEdit={!judgePermission(detail.permissionType, 'edit')}
refresh={() => {
// 刷新当前页数据
setPagination((prev) => ({ ...prev, current: 1 }));
@@ -480,6 +482,7 @@ const Index = () => {
{
setCurrentOption('add');
setCurrentItem(undefined);
@@ -500,6 +503,7 @@ const Index = () => {
setOpenAddItemModal(true);
}}
icon={}
+ disabled={!judgePermission(detail.permissionType, 'edit')}
type="primary"
style={{
right: 24,
@@ -530,4 +534,4 @@ const Index = () => {
);
};
-export default Index;
\ No newline at end of file
+export default Index;
diff --git a/src/pages/story/index.tsx b/src/pages/story/index.tsx
index 304e8ec..67b0d14 100644
--- a/src/pages/story/index.tsx
+++ b/src/pages/story/index.tsx
@@ -9,12 +9,13 @@ import type { StoryType } from './data.d';
import { addStory, deleteStory, queryTimelineList, updateStory } from './service';
import useStyles from './style.style';
import AuthorizeStoryModal from './components/AuthorizeStoryModal';
+import {judgePermission} from "@/pages/story/utils/utils";
const { Search } = Input;
const ListContent = ({
- data: { createTime, updateTime, updateName, ownerName, itemCount },
+ data: { storyTime, updateTime, updateName, ownerName, itemCount },
}: {
data: StoryType;
}) => {
@@ -27,15 +28,15 @@ const ListContent = ({
最近更新人
-
{updateName}
+
{updateName ?? ownerName}
-
开始时间
-
{createTime}
+
故事时间
+
{storyTime}
更新时间
@@ -190,6 +191,7 @@ export const BasicList: FC = () => {
actions={[
{
e.preventDefault();
showEditModal(item);
@@ -200,6 +202,7 @@ export const BasicList: FC = () => {
// 增加授权操作,可以授权给其他用户
{
e.preventDefault();
setCurrent(item);
@@ -210,6 +213,7 @@ export const BasicList: FC = () => {
,
{
e.preventDefault();
deleteItem(item.instanceId ?? '');
diff --git a/src/pages/story/utils/utils.ts b/src/pages/story/utils/utils.ts
new file mode 100644
index 0000000..44a0214
--- /dev/null
+++ b/src/pages/story/utils/utils.ts
@@ -0,0 +1,18 @@
+// judge user permission
+/**
+ * current permissionType: 1 - creator, 2 - admin, 3 - editor, 4 - viewer
+ * @param permissionType
+ * @param actionType
+ */
+export function judgePermission(permissionType: number | null, actionType: string): boolean {
+ switch (actionType) {
+ case 'delete':
+ return permissionType === 1;
+ case 'auth':
+ return permissionType === 1 || permissionType === 2;
+ case 'edit':
+ return permissionType === 1 || permissionType === 2 || permissionType === 3;
+ default:
+ return false;
+ }
+}