fix: 优化登录相关权限问题 添加按键权限判断

This commit is contained in:
ZhuRui
2026-08-05 15:30:09 +08:00
parent 503ee266b0
commit 73d4d8fd34
18 changed files with 283 additions and 95 deletions
+38 -12
View File
@@ -13,6 +13,7 @@ import {
} from 'ant-design-vue';
import { useBannerModel, BANNER_STATUS_OPTIONS } from './model/useBannerModel';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import BannerFormModal from './components/BannerFormModal';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -28,6 +29,7 @@ function renderBodyCell({
onEdit,
onToggleStatus,
onDelete,
permissions,
}: {
column: any;
text: any;
@@ -37,6 +39,11 @@ function renderBodyCell({
onEdit: (record: any) => void;
onToggleStatus: (record: any) => void;
onDelete: (record: any) => void;
permissions: {
canEdit: boolean;
canToggleStatus: boolean;
canDelete: boolean;
};
}) {
// 图片列
if (column.key === 'image') {
@@ -92,17 +99,26 @@ function renderBodyCell({
// 操作列
if (column.key === 'action') {
const isEnabled = record.status === '1';
const { canEdit, canToggleStatus, canDelete } = permissions;
if (!canEdit && !canToggleStatus && !canDelete) return <span>-</span>;
return (
<Space>
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
<Button type="link" size="small" onClick={() => onToggleStatus(record)}>
{isEnabled ? '禁用' : '启用'}
</Button>
<Button type="link" size="small" danger onClick={() => onDelete(record)}>
</Button>
{canEdit && (
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
)}
{canToggleStatus && (
<Button type="link" size="small" onClick={() => onToggleStatus(record)}>
{isEnabled ? '禁用' : '启用'}
</Button>
)}
{canDelete && (
<Button type="link" size="small" danger onClick={() => onDelete(record)}>
</Button>
)}
</Space>
);
}
@@ -136,6 +152,13 @@ export default defineComponent({
} = useBannerModel();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canAdd = hasPermission('events.banner.add');
const operationPermissions = {
canEdit: hasPermission('events.banner.edit'),
canToggleStatus: hasPermission('events.banner.toggle_status'),
canDelete: hasPermission('events.banner.delete'),
};
const confirmDelete = (record: any) => {
Modal.confirm({
@@ -200,9 +223,11 @@ export default defineComponent({
</Button>
<Button onClick={handleReset}></Button>
<Button type="primary" onClick={handleAdd}>
</Button>
{canAdd && (
<Button type="primary" onClick={handleAdd}>
</Button>
)}
</Space>
</Form.Item>
</Form>
@@ -226,6 +251,7 @@ export default defineComponent({
onEdit: handleEdit,
onToggleStatus: confirmToggleStatus,
onDelete: confirmDelete,
permissions: operationPermissions,
}),
}}
</Table>
+33 -19
View File
@@ -21,6 +21,7 @@ import {
import { useEventListColumns } from './model/useEventListColumns';
import { getProvinceCityCascaderOptions } from '@/utils/areaData';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import EventRegulationModal from './components/EventRegulationModal';
import EventDetailModal from './components/EventDetailModal';
import EventAuditModal from './components/EventAuditModal';
@@ -63,6 +64,9 @@ export default defineComponent({
const { columns } = useEventListColumns();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canToggleStatus = hasPermission('events.list.toggle_status');
const canViewRegulation = hasPermission('events.regulation.view');
/** 省市两级 Cascader 数据(无区) */
const provinceCityOptions = getProvinceCityCascaderOptions();
@@ -91,14 +95,16 @@ export default defineComponent({
<Button type="link" size="small" onClick={() => openDetailModal(record)}>
</Button>
<Button
type="link"
size="small"
loading={togglingId.value === record.id}
onClick={() => handleToggleShelf(record)}
>
</Button>
{canToggleStatus && (
<Button
type="link"
size="small"
loading={togglingId.value === record.id}
onClick={() => handleToggleShelf(record)}
>
</Button>
)}
</Space>
);
}
@@ -109,14 +115,16 @@ export default defineComponent({
<Button type="link" size="small" onClick={() => openDetailModal(record)}>
</Button>
<Button
type="link"
size="small"
loading={togglingId.value === record.id}
onClick={() => handleToggleShelf(record)}
>
</Button>
{canToggleStatus && (
<Button
type="link"
size="small"
loading={togglingId.value === record.id}
onClick={() => handleToggleShelf(record)}
>
</Button>
)}
</Space>
);
}
@@ -145,9 +153,15 @@ export default defineComponent({
width: 100,
align: 'center' as const,
customRender: ({ record }: { record: any }) => (
<a style={{ cursor: 'pointer' }} onClick={() => openRegulationModal(record)}>
</a>
<>
{canViewRegulation ? (
<a style={{ cursor: 'pointer' }} onClick={() => openRegulationModal(record)}>
</a>
) : (
<span>-</span>
)}
</>
),
},
{
@@ -17,6 +17,7 @@ interface OrderDetailModalProps {
uniqueId: string;
onClose: () => void;
onReRefund: () => void;
canReRefund?: boolean;
}
const GENDER_MAP: Record<string, string> = { '1': '男', '2': '女' };
@@ -118,6 +119,7 @@ export default defineComponent({
uniqueId: { type: String, default: '' },
onClose: { type: Function, default: null },
onReRefund: { type: Function, default: null },
canReRefund: { type: Boolean, default: false },
},
setup(props: OrderDetailModalProps) {
const [detail, setDetail] = useState<TournamentAdminOrderInfoVO | null>(null);
@@ -360,7 +362,7 @@ export default defineComponent({
<div class={styles.modalFooter}>
<Button onClick={props.onClose}></Button>
{/* 只有存在退款失败记录时才显示重新退款按钮 */}
{hasRefundFailed.value ? (
{props.canReRefund && hasRefundFailed.value ? (
<Button danger onClick={props.onReRefund}>
退
</Button>
+8 -1
View File
@@ -15,6 +15,7 @@ import {
import { useOrderModel, ORDER_STATUS_OPTIONS, REFUND_STATUS_OPTIONS } from './model/useOrderModel';
import { retryRefundOrder } from './model/services';
import { useContainerSize, useState } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import OrderDetailModal from './components/OrderDetailModal';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -58,12 +59,14 @@ function renderBodyCell({
record,
onView,
onReRefund,
canReRefund,
}: {
column: any;
text: any;
record: any;
onView: (record: any) => void;
onReRefund: (record: any) => void;
canReRefund: boolean;
}) {
// 赛事名称:最多15字符,超出显示 Tooltip
if (column.dataIndex === 'name') {
@@ -82,7 +85,7 @@ function renderBodyCell({
if (column.key === 'action') {
// 退款状态:1=无退款,2=退款成功,3=退款失败,-1=其他
// 只有退款失败(3)时显示重新退款按钮
const showReRefund = record.refundStatus === '3';
const showReRefund = canReRefund && record.refundStatus === '3';
return (
<Space>
<Button type="link" size="small" onClick={() => onView(record)}>
@@ -119,6 +122,8 @@ export default defineComponent({
} = useOrderModel();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canReRefund = hasPermission('events.orders.refund');
// 详情弹窗状态
const [detailVisible, setDetailVisible] = useState<boolean>(false);
@@ -257,6 +262,7 @@ export default defineComponent({
...args,
onView: handleView,
onReRefund: handleReRefund,
canReRefund,
}),
}}
</Table>
@@ -286,6 +292,7 @@ export default defineComponent({
setDetailVisible(false);
promptReRefund(currentRecord.value);
}}
canReRefund={canReRefund}
/>
)}
</div>
+5
View File
@@ -3,6 +3,7 @@ import { Button, Input, Table, Form, Space, Select, Pagination } from 'ant-desig
import { useUserModel, USER_STATUS_OPTIONS } from './model/useUserModel';
import { useUserColumns } from './model/useUserColumns';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import pageStyles from '@/assets/styles/pageLayout.module.less';
/**
@@ -30,9 +31,13 @@ export default defineComponent({
const { columns } = useUserColumns();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canToggleStatus = hasPermission('events.users.toggle_status');
/** 渲染操作列 */
const renderAction = (record: any) => {
if (!canToggleStatus) return <span>-</span>;
const isActive = record.status === '1';
return (
<Button
+12 -1
View File
@@ -3,6 +3,7 @@ import { Button, Input, Table, Form, Space, Pagination } from 'ant-design-vue';
import { WalletOutlined, LockOutlined, RiseOutlined } from '@ant-design/icons-vue';
import { useWalletModel } from './model/useWalletModel';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import WalletDetailModal from './components/WalletDetailModal';
import styles from './index.module.less';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -20,13 +21,17 @@ function renderBodyCell({
column,
record,
onViewDetail,
canViewDetail,
}: {
column: any;
text: any;
record: any;
onViewDetail: (record: any) => void;
canViewDetail: boolean;
}) {
if (column.key === 'action') {
if (!canViewDetail) return <span>-</span>;
return (
<Button type="link" size="small" onClick={() => onViewDetail(record)}>
@@ -56,6 +61,8 @@ export default defineComponent({
} = useWalletModel();
const { containerRef, height } = useContainerSize({ headerOffset: 55 });
const { hasPermission } = usePermissionStore();
const canViewDetail = hasPermission('finance.wallet.detail');
const tableColumns = [
...columns,
@@ -196,7 +203,11 @@ export default defineComponent({
>
{{
bodyCell: (args: any) =>
renderBodyCell({ ...args, onViewDetail: handleViewDetail }),
renderBodyCell({
...args,
onViewDetail: handleViewDetail,
canViewDetail,
}),
}}
</Table>
</div>
+7 -1
View File
@@ -2,6 +2,7 @@ import { defineComponent } from 'vue';
import { Button, Input, Table, Form, Space, Pagination, Select } from 'ant-design-vue';
import { useWithdrawModel, renderAuditStatus, renderPayStatus } from './model/useWithdrawModel';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import WithdrawDetailModal from './components/WithdrawDetailModal';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -13,12 +14,14 @@ function renderBodyCell({
record,
onAudit,
onView,
canAudit,
}: {
column: any;
text: any;
record: any;
onAudit: (record: any) => void;
onView: (record: any) => void;
canAudit: boolean;
}) {
if (column.key === 'auditStatus') {
return renderAuditStatus(record.auditStatus);
@@ -28,7 +31,7 @@ function renderBodyCell({
}
if (column.key === 'action') {
// auditStatus=0(待审核)→ 显示「审核」,其他 → 显示「查看」
if (record.auditStatus === 0) {
if (canAudit && record.auditStatus === 0) {
return (
<Button type="link" size="small" onClick={() => onAudit(record)}>
@@ -69,6 +72,8 @@ export default defineComponent({
} = useWithdrawModel();
const { containerRef, height } = useContainerSize({ headerOffset: 55 });
const { hasPermission } = usePermissionStore();
const canAudit = hasPermission('finance.withdraw.audit');
/** 最终表格列:模型列 + 操作 */
const tableColumns = [
@@ -162,6 +167,7 @@ export default defineComponent({
...args,
onAudit: handleAudit,
onView: handleView,
canAudit,
}),
}}
</Table>
+31 -9
View File
@@ -3,6 +3,7 @@ import { Button, Input, Table, Form, Space, Select, Modal, Pagination } from 'an
import type { ModalProps } from 'ant-design-vue';
import { useRoleModel } from './model/useRoleModel';
import { useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import RoleFormModal from './components/RoleFormModal';
import UserListModal from './components/UserListModal';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -16,6 +17,7 @@ function renderBodyCell({
onViewUsers,
onEdit,
onDelete,
permissions,
}: {
column: any;
text: any;
@@ -23,6 +25,10 @@ function renderBodyCell({
onViewUsers: (record: any) => void;
onEdit: (record: any) => void;
onDelete: (record: any) => void;
permissions: {
canEdit: boolean;
canDelete: boolean;
};
}) {
if (column.dataIndex === 'userCount') {
return (
@@ -33,14 +39,21 @@ function renderBodyCell({
}
if (column.key === 'action') {
const { canEdit, canDelete } = permissions;
if (!canEdit && !canDelete) return <span>-</span>;
return (
<Space>
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
<Button type="link" size="small" danger onClick={() => onDelete(record)}>
</Button>
{canEdit && (
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
)}
{canDelete && (
<Button type="link" size="small" danger onClick={() => onDelete(record)}>
</Button>
)}
</Space>
);
}
@@ -100,6 +113,12 @@ export default defineComponent({
} = useRoleModel();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canAdd = hasPermission('system.roles.add');
const operationPermissions = {
canEdit: hasPermission('system.roles.edit'),
canDelete: hasPermission('system.roles.delete'),
};
const triggerDelete = (record: any) => confirmDelete({ record, onOk: handleDelete });
@@ -135,9 +154,11 @@ export default defineComponent({
<Button type="primary" onClick={handleSearch} loading={loading.value}>
</Button>
<Button type="primary" onClick={handleAdd}>
</Button>
{canAdd && (
<Button type="primary" onClick={handleAdd}>
</Button>
)}
</Space>
</Form.Item>
</Form>
@@ -160,6 +181,7 @@ export default defineComponent({
onViewUsers: handleViewUsers,
onEdit: handleEdit,
onDelete: triggerDelete,
permissions: operationPermissions,
}),
}}
</Table>
+31 -9
View File
@@ -13,6 +13,7 @@ import {
import { useUserModel, USER_STATUS_OPTIONS } from './model/useUserModel';
import { toggleUserActive, saveUser, updateUser } from './model/services';
import { useState, useThrottleFn, useContainerSize } from '@/hooks';
import { usePermissionStore } from '@/stores/permissionStore';
import UserFormModal from './components/UserFormModal';
import pageStyles from '@/assets/styles/pageLayout.module.less';
@@ -24,24 +25,36 @@ function renderBodyCell({
record,
onEdit,
onToggleStatus,
permissions,
}: {
column: any;
text: any;
record: any;
onEdit: (record: any) => void;
onToggleStatus: (record: any) => void;
permissions: {
canEdit: boolean;
canToggleStatus: boolean;
};
}) {
// 操作列
if (column.key === 'action') {
const isActive = record.status === '1';
const { canEdit, canToggleStatus } = permissions;
if (!canEdit && !canToggleStatus) return <span>-</span>;
return (
<Space>
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
<Button type="link" size="small" onClick={() => onToggleStatus(record)}>
{isActive ? '停用' : '启用'}
</Button>
{canEdit && (
<Button type="link" size="small" onClick={() => onEdit(record)}>
</Button>
)}
{canToggleStatus && (
<Button type="link" size="small" onClick={() => onToggleStatus(record)}>
{isActive ? '停用' : '启用'}
</Button>
)}
</Space>
);
}
@@ -67,6 +80,12 @@ export default defineComponent({
} = useUserModel();
const { containerRef, height } = useContainerSize();
const { hasPermission } = usePermissionStore();
const canAdd = hasPermission('system.users.add');
const operationPermissions = {
canEdit: hasPermission('system.users.edit'),
canToggleStatus: hasPermission('system.users.toggle_status'),
};
// ===== 弹窗状态(组件级) =====
const [modalVisible, setModalVisible] = useState<boolean>(false);
@@ -216,9 +235,11 @@ export default defineComponent({
<Button type="primary" onClick={handleSearch} loading={loading.value}>
</Button>
<Button type="primary" onClick={handleAdd}>
</Button>
{canAdd && (
<Button type="primary" onClick={handleAdd}>
</Button>
)}
</Space>
</Form.Item>
</Form>
@@ -240,6 +261,7 @@ export default defineComponent({
...args,
onEdit: handleEdit,
onToggleStatus: handleToggleStatus,
permissions: operationPermissions,
}),
}}
</Table>
+1 -1
View File
@@ -32,7 +32,7 @@ const userPage = '/admin/sys/user/page';
const userSave = '/admin/sys/user/save';
const userUpdate = '/admin/sys/user/update';
const userActive = '/admin/sys/user/active';
const userUpdatePwd = '/sys/user/updatepwd';
const userUpdatePwd = '/admin/sys/user/updatepwd';
// ============================================================
// API 函数