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

@@ -27,7 +27,8 @@ const TimelineItem: React.FC<{
item: StoryItem; item: StoryItem;
handleOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void; handleOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
refresh: () => void; refresh: () => void;
}> = ({ item, handleOption, refresh }) => { disableEdit?: boolean;
}> = ({ item, handleOption, refresh, disableEdit }) => {
const { styles } = useStyles(); const { styles } = useStyles();
const intl = useIntl(); const intl = useIntl();
const [expanded, setExpanded] = useState(false); const [expanded, setExpanded] = useState(false);
@@ -97,7 +98,7 @@ const TimelineItem: React.FC<{
}} }}
extra={ extra={
<div className={styles.actions}> <div className={styles.actions}>
{showActions && ( {showActions && !disableEdit && (
<> <>
<Button <Button
type="text" type="text"
@@ -212,6 +213,7 @@ const TimelineItem: React.FC<{
open={openDetail} open={openDetail}
setOpen={setOpenDetail} setOpen={setOpenDetail}
handleDelete={handleDelete} handleDelete={handleDelete}
disableEdit={disableEdit}
handOption={handleOption} handOption={handleOption}
/> />
</Card> </Card>

View File

@@ -27,6 +27,7 @@ interface Props {
setOpen: React.Dispatch<React.SetStateAction<boolean>>; setOpen: React.Dispatch<React.SetStateAction<boolean>>;
handleDelete: () => void; handleDelete: () => void;
handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void; handOption: (item: StoryItem, option: 'add' | 'edit' | 'addSubItem' | 'editSubItem') => void;
disableEdit?: boolean;
} }
const TimelineItemDrawer: React.FC<Props> = (props) => { const TimelineItemDrawer: React.FC<Props> = (props) => {
@@ -99,7 +100,7 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
</div> </div>
</div> </div>
} }
footer={ footer={ {disableEdit ??
<div style={{ textAlign: 'right' }}> <div style={{ textAlign: 'right' }}>
<Space> <Space>
<Button <Button
@@ -132,8 +133,7 @@ const TimelineItemDrawer: React.FC<Props> = (props) => {
<Button onClick={closeDrawer}></Button> <Button onClick={closeDrawer}></Button>
</Space> </Space>
</div> </div>
} >}}
>
<div style={{ padding: '0 24px' }}> <div style={{ padding: '0 24px' }}>
<div style={{ marginBottom: '24px' }}> <div style={{ marginBottom: '24px' }}>
<h3>描述</h3> <h3>描述</h3>

View File

@@ -40,6 +40,7 @@ export interface StoryType {
itemCount: number, itemCount: number,
updatedId?: string; updatedId?: string;
updateTime?: string; updateTime?: string;
storyTime: string;
logo?: string; logo?: string;
} }
export interface BaseResponse { export interface BaseResponse {

View File

@@ -12,6 +12,7 @@ import { useParams } from 'react-router';
import AutoSizer from 'react-virtualized-auto-sizer'; import AutoSizer from 'react-virtualized-auto-sizer';
import { VariableSizeList as List } from 'react-window'; import { VariableSizeList as List } from 'react-window';
import './index.css'; import './index.css';
import {judgePermission} from "@/pages/story/utils/utils";
// 格式化时间数组为易读格式 // 格式化时间数组为易读格式
const formatTimeArray = (time: string | number[] | undefined): string => { const formatTimeArray = (time: string | number[] | undefined): string => {
@@ -274,6 +275,7 @@ const Index = () => {
setCurrentOption(option); setCurrentOption(option);
setOpenAddItemModal(true); setOpenAddItemModal(true);
}} }}
disableEdit={!judgePermission(detail.permissionType, 'edit')}
refresh={() => { refresh={() => {
// 刷新当前页数据 // 刷新当前页数据
setPagination((prev) => ({ ...prev, current: 1 })); setPagination((prev) => ({ ...prev, current: 1 }));
@@ -480,6 +482,7 @@ const Index = () => {
<Button <Button
type="primary" type="primary"
size="large" size="large"
disabled={!judgePermission(detail.permissionType, 'edit')}
onClick={() => { onClick={() => {
setCurrentOption('add'); setCurrentOption('add');
setCurrentItem(undefined); setCurrentItem(undefined);
@@ -500,6 +503,7 @@ const Index = () => {
setOpenAddItemModal(true); setOpenAddItemModal(true);
}} }}
icon={<PlusOutlined />} icon={<PlusOutlined />}
disabled={!judgePermission(detail.permissionType, 'edit')}
type="primary" type="primary"
style={{ style={{
right: 24, right: 24,

View File

@@ -9,12 +9,13 @@ import type { StoryType } from './data.d';
import { addStory, deleteStory, queryTimelineList, updateStory } from './service'; import { addStory, deleteStory, queryTimelineList, updateStory } from './service';
import useStyles from './style.style'; import useStyles from './style.style';
import AuthorizeStoryModal from './components/AuthorizeStoryModal'; import AuthorizeStoryModal from './components/AuthorizeStoryModal';
import {judgePermission} from "@/pages/story/utils/utils";
const { Search } = Input; const { Search } = Input;
const ListContent = ({ const ListContent = ({
data: { createTime, updateTime, updateName, ownerName, itemCount }, data: { storyTime, updateTime, updateName, ownerName, itemCount },
}: { }: {
data: StoryType; data: StoryType;
}) => { }) => {
@@ -27,15 +28,15 @@ const ListContent = ({
</div> </div>
<div className={styles.listContentItem}> <div className={styles.listContentItem}>
<span></span> <span></span>
<p>{updateName}</p> <p>{updateName ?? ownerName}</p>
</div> </div>
<div className={styles.listContentItem}> <div className={styles.listContentItem}>
<span></span> <span></span>
<p>{itemCount}</p> <p>{itemCount}</p>
</div> </div>
<div className={styles.listContentItem}> <div className={styles.listContentItem}>
<span></span> <span></span>
<p>{createTime}</p> <p>{storyTime}</p>
</div> </div>
<div className={styles.listContentItem}> <div className={styles.listContentItem}>
<span></span> <span></span>
@@ -190,6 +191,7 @@ export const BasicList: FC = () => {
actions={[ actions={[
<a <a
key="edit" key="edit"
disabled={judgePermission(item.permissionType as number, 'edit')}
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
showEditModal(item); showEditModal(item);
@@ -200,6 +202,7 @@ export const BasicList: FC = () => {
// 增加授权操作,可以授权给其他用户 // 增加授权操作,可以授权给其他用户
<a <a
key="authorize" key="authorize"
disabled={judgePermission(item.permissionType as number, 'auth')}
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
setCurrent(item); setCurrent(item);
@@ -210,6 +213,7 @@ export const BasicList: FC = () => {
</a>, </a>,
<a <a
key="delete" key="delete"
disabled={judgePermission(item.permissionType as number, 'delete')}
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
deleteItem(item.instanceId ?? ''); 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;
}
}