feat: 1. 本地化思源黑体的字体包并优先使用。

2. 添加权限映射表和全局查看权限的hook,便于路由控制不同权限按钮显示/隐藏。
3. 删除评查点分组的部分旧api方法。
4. 对接评查点分组接口,文档类型接口, 提示词管理接口, 入口模块管理的接口。
5. 优化角色权限管理的接口,完善不用地区的访问权限认证。
6. 优化主页交叉评查和设置的入口样式和布局。
7. 优化评查点分组,评查规则的功能权限校验。
This commit is contained in:
2025-11-29 10:37:35 +08:00
parent 61facf5d71
commit 30e100ef3e
29 changed files with 2527 additions and 2126 deletions
+46 -19
View File
@@ -1,5 +1,5 @@
import { type MetaFunction } from "@remix-run/node";
import { useLoaderData, Link, useNavigate, useSearchParams, useRouteLoaderData } from "@remix-run/react";
import { useLoaderData, Link, useNavigate, useSearchParams } from "@remix-run/react";
import { useState, useEffect } from "react";
import indexStyles from "~/styles/pages/rule-groups_index.css?url";
import { Card } from "~/components/ui/Card";
@@ -17,6 +17,7 @@ import {
batchDeleteEvaluationPointGroups
} from "~/api/evaluation_points/rule-groups";
import { toastService, messageService } from "~/components/ui";
import { usePermission } from "~/hooks/usePermission";
export function links() {
return [{ rel: "stylesheet", href: indexStyles }];
@@ -78,8 +79,7 @@ export async function loader({ request }: { request: Request }) {
export default function RuleGroupsIndex() {
const loaderData = useLoaderData<typeof loader>();
const { groups: initialGroups, totalCount = 0, page = 1, pageSize = 50, frontendJWT } = loaderData;
const rootData = useRouteLoaderData("root") as { userRole: string };
const { groups: initialGroups, frontendJWT } = loaderData;
const navigate = useNavigate();
const [searchParams, setSearchParams] = useSearchParams();
const [expandedGroups, setExpandedGroups] = useState<string[]>([]);
@@ -88,8 +88,13 @@ export default function RuleGroupsIndex() {
const [filteredChildrenMap, setFilteredChildrenMap] = useState<Record<string, RuleGroup[]>>({});
const [initialLoading, setInitialLoading] = useState<boolean>(true);
const [selectedIds, setSelectedIds] = useState<string[]>([]); // 🆕 批量选择状态
const userRole = rootData?.userRole || 'common';
const hasEditPermission = userRole.toLowerCase().includes('provin');
// ✅ 使用权限 Hook
const { canCreate, canUpdate, canDelete, canBatch } = usePermission();
const canCreateGroup = canCreate('evaluation_group');
const canUpdateGroup = canUpdate('evaluation_group');
const canDeleteGroup = canDelete('evaluation_group');
const canBatchOperation = canBatch('evaluation_group'); // ✅ 批量操作权限
// 初始加载时自动加载所有子分组
useEffect(() => {
@@ -230,6 +235,12 @@ export default function RuleGroupsIndex() {
// 处理删除分组
const handleDeleteGroup = async (groupId: string) => {
// ✅ 检查删除权限
if (!canDeleteGroup) {
toastService.warning('您没有删除权限');
return;
}
messageService.show({
title: "确认删除",
message: "确定要删除该分组吗?此操作将同时删除该分组下的所有评查点,且不可恢复。",
@@ -277,6 +288,12 @@ export default function RuleGroupsIndex() {
// 🆕 批量启用/禁用
const handleBatchEnable = async (enable: boolean) => {
// ✅ 检查更新权限
if (!canUpdateGroup) {
toastService.warning('您没有更新权限');
return;
}
if (selectedIds.length === 0) {
toastService.warning('请先选择要操作的分组');
return;
@@ -299,6 +316,12 @@ export default function RuleGroupsIndex() {
// 🆕 批量删除
const handleBatchDelete = async () => {
// ✅ 检查删除权限
if (!canDeleteGroup) {
toastService.warning('您没有删除权限');
return;
}
if (selectedIds.length === 0) {
toastService.warning('请先选择要删除的分组');
return;
@@ -569,8 +592,8 @@ export default function RuleGroupsIndex() {
// 定义表格列配置
const columns = [
// 🆕 复选框列
...(hasEditPermission ? [{
// 🆕 复选框列 - 仅在有批量操作权限时显示
...(canBatchOperation ? [{
title: (
<input
type="checkbox"
@@ -676,9 +699,9 @@ export default function RuleGroupsIndex() {
onClick={() => navigate(`/rule-groups/new?id=${record.id}`)}
className="operation-btn"
>
<i className="ri-edit-line"></i> {hasEditPermission ? '编辑' : '查看'}
<i className="ri-edit-line"></i> {canUpdateGroup ? '编辑' : '查看'}
</button>
{hasEditPermission && (
{canDeleteGroup && (
<button
type="button"
className="operation-btn !text-[--color-error]"
@@ -720,7 +743,8 @@ export default function RuleGroupsIndex() {
>
</Button>
{hasEditPermission && selectedIds.length > 0 && (
{/* ✅ 批量启用/禁用按钮:仅当有更新权限且有选中项时显示 */}
{canUpdateGroup && selectedIds.length > 0 && (
<>
<Button
type="default"
@@ -738,17 +762,20 @@ export default function RuleGroupsIndex() {
>
({selectedIds.length})
</Button>
<Button
type="danger"
icon="ri-delete-bin-line"
onClick={handleBatchDelete}
className="mr-2"
>
({selectedIds.length})
</Button>
</>
)}
{hasEditPermission && (
{/* ✅ 批量删除按钮:仅当有删除权限且有选中项时显示 */}
{canDeleteGroup && selectedIds.length > 0 && (
<Button
type="danger"
icon="ri-delete-bin-line"
onClick={handleBatchDelete}
className="mr-2"
>
({selectedIds.length})
</Button>
)}
{canCreateGroup && (
<Button
type="primary"
icon="ri-add-line"