story操作权限限制
Some checks failed
test/timeline-frontend/pipeline/head There was a failure building this commit

This commit is contained in:
2025-12-31 14:30:03 +08:00
parent 5f433ab231
commit 1e93920162
6 changed files with 49 additions and 20 deletions

View File

@@ -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={
<div className={styles.actions}>
{showActions && (
{showActions && !disableEdit && (
<>
<Button
type="text"
@@ -212,10 +213,11 @@ const TimelineItem: React.FC<{
open={openDetail}
setOpen={setOpenDetail}
handleDelete={handleDelete}
disableEdit={disableEdit}
handOption={handleOption}
/>
</Card>
);
};
export default TimelineItem;
export default TimelineItem;

View File

@@ -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<React.SetStateAction<boolean>>;
handleDelete: () => void;
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
disableEdit?: boolean;
}
const TimelineItemDrawer: React.FC<Props> = (props) => {
@@ -55,7 +56,7 @@ const TimelineItemDrawer: React.FC<Props> = (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> = (props) => {
</div>
</div>
}
footer={
footer={ {disableEdit ??
<div style={{ textAlign: 'right' }}>
<Space>
<Button
@@ -132,8 +133,7 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
<Button onClick={closeDrawer}></Button>
</Space>
</div>
}
>
>}}
<div style={{ padding: '0 24px' }}>
<div style={{ marginBottom: '24px' }}>
<h3>描述</h3>
@@ -204,4 +204,4 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
);
};
export default TimelineItemDrawer;
export default TimelineItemDrawer;

View File

@@ -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 = ''
export type PermissionType = ''

View File

@@ -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 = () => {
<Button
type="primary"
size="large"
disabled={!judgePermission(detail.permissionType, 'edit')}
onClick={() => {
setCurrentOption('add');
setCurrentItem(undefined);
@@ -500,6 +503,7 @@ const Index = () => {
setOpenAddItemModal(true);
}}
icon={<PlusOutlined />}
disabled={!judgePermission(detail.permissionType, 'edit')}
type="primary"
style={{
right: 24,
@@ -530,4 +534,4 @@ const Index = () => {
);
};
export default Index;
export default Index;

View File

@@ -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 = ({
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{updateName}</p>
<p>{updateName ?? ownerName}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{itemCount}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
<p>{createTime}</p>
<span></span>
<p>{storyTime}</p>
</div>
<div className={styles.listContentItem}>
<span></span>
@@ -190,6 +191,7 @@ export const BasicList: FC = () => {
actions={[
<a
key="edit"
disabled={judgePermission(item.permissionType as number, 'edit')}
onClick={(e) => {
e.preventDefault();
showEditModal(item);
@@ -200,6 +202,7 @@ export const BasicList: FC = () => {
// 增加授权操作,可以授权给其他用户
<a
key="authorize"
disabled={judgePermission(item.permissionType as number, 'auth')}
onClick={(e) => {
e.preventDefault();
setCurrent(item);
@@ -210,6 +213,7 @@ export const BasicList: FC = () => {
</a>,
<a
key="delete"
disabled={judgePermission(item.permissionType as number, 'delete')}
onClick={(e) => {
e.preventDefault();
deleteItem(item.instanceId ?? '');

View File

@@ -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;
}
}